k8s创建secret并在container中获取secret
本文使用的deployment和service与我的上一篇文章一样。link也放在下面了,如果不懂什么事deployment和service,可以先看我的上一篇文章。
k8s使用kustomize来部署应用
下面我们将通过创建secret开始。secret是我们自己收到创建的,我们需要先通过下面的命令来创建分别存放username和password的文件。
echo -n 'admin' > ./username.txt
echo -n 'S!B\*d$zDsb=' > ./password.txt
下面我们通过一个命令把secret绑定到我们需要部署的命名空间,即dev-api中,secret的名字叫db-user-pass,存放有两对keypairs。
kubectl create -n dev-api secret generic db-user-pass \
--from-file=username=./username.txt \
--from-file=password=./password.txt
我们通过下面命令查看secret是否创建成功,如果有secret的详细信息,说明已经创建成功了。
# 查看secret
kubectl get secret -n dev-api
kubectl describe secret -n dev-api db-user-pass
也可以使用下面命令解码secret看看。
kubectl get secret -n dev-api db-user-pass -o jsonpath='{.data.password}' | base64 --decode
方法一:使用挂载访问secret
下面我们更改deployment.yaml是的container中可以访问这个secret。
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-helloworld # 部署的名称
# namespace: dev-api # 部署到哪个命名空间, 使用kustomize的话这里不能出现,需要在overlays/dev/kustomization.yaml 指定
spec:
replicas: 2 # 设置副本数量为2
selector:
matchLabels:
app: api-helloworld # 用于选择匹配的Pod标签
template:
metadata:
labels:
app: api-helloworld # Pod的标签
spec:
containers:
- name: api-helloworld-c # 容器名称
# image: docker.io/library/restfulapi:latest # For image in container, use ctr -n k8s.io images import restfulapi.tar to import images
image: restfulapi:1 # For image in docker
imagePullPolicy: IfNotPresent # 镜像拉取策略,如果本地没有就拉取
ports:
- containerPort: 80 # 容器内部监听的端口
volumeMounts:
- name: secret-volume
mountPath: "/etc/secrets"
readOnly: true
volumes:
- name: secret-volume
secret:
secretName: db-user-pass
想对于没有修改之前的版本,这里主要加入了对volume以及volumeMounts的描述,volume把secret定义在volume上面了,volumeMount则是把volume挂载到Pod.
主要变化。
containers:
- name: api-helloworld-c # 容器名称
# image: docker.io/library/restfulapi:latest # For image in container, use ctr -n k8s.io images import restfulapi.tar to import images
image: restfulapi:1 # For image in docker
imagePullPolicy: IfNotPresent # 镜像拉取策略,如果本地没有就拉取
ports:
- containerPort: 80 # 容器内部监听的端口
volumeMounts:
- name: secret-volume
mountPath: "/etc/secrets"
readOnly: true
volumes:
- name: secret-volume
secret:
secretName: db-user-pass
最后,我们重新部署一下。
cd overlay/dev
kubectl kustomize | kubectl apply -f -
当确定好Pod已经起来以后,我们就可以进去Pod里面看看我们的secret了。
kubectl exec -it -n dev-api api-helloworld-6c7c74fcbd-22prm -- bash
ls /etc/secrets/
可以看得到secret已经可以成功范围了,并且值得注意的是,当作为volume挂载进来Pod的时候,secret会自动的进行base64解码,这里直接就可以访问明文了。
方法二:使用环境变量方式访问secret
deployment.yaml如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-helloworld # 部署的名称
# namespace: dev-api # 部署到哪个命名空间, 使用kustomize的话这里不能出现,需要在overlays/dev/kustomization.yaml 指定
spec:
replicas: 2 # 设置副本数量为2
selector:
matchLabels:
app: api-helloworld # 用于选择匹配的Pod标签
template:
metadata:
labels:
app: api-helloworld # Pod的标签
spec:
containers:
- name: api-helloworld-c # 容器名称
# image: docker.io/library/restfulapi:latest # For image in container, use ctr -n k8s.io images import restfulapi.tar to import images
image: restfulapi:1 # For image in docker
imagePullPolicy: IfNotPresent # 镜像拉取策略,如果本地没有就拉取
ports:
- containerPort: 80 # 容器内部监听的端口
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: db-user-pass
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: db-user-pass
key: password
上面主要是加入了env的相关描述,绑定到Pod里面的环境变量名分别为SECRET_USERNAME,SECRET_PASSWORD。同样,我们把deployment的变化直接apply到集群。
cd overlay/dev
kubectl kustomize | kubectl apply -f -
Pod确定起来以后,我们进去里面看看我们新绑定的env.
kubectl get pods -n dev-api
kubectl exec -it -n dev-api api-helloworld-797679c6c-5wk72 -- bash
env | grep SECRET
同样我们也可以在env中看到我们新绑定的secret,并且和卷绑定一样,可以看到是明文形式来存储的。
好了以上是本期分享的全部内容了,如果你觉得对你还有帮助,建议点赞分享并收藏哦。如果大家想对我表示肯定,扫描下面的二维码即可哦,原创不易,一分钱也是爱哦。