摘要:和前面介绍的ConfigMap几乎是一模一样,secret也是配置资源的一种形式,用来存储键-值对。假如我们想把数据库的账号和密码这种比较隐私的数据存储起来,用secret更符合语境,而且k8s对它做了很多特别的处理。
前面介绍了两个比较大一点的例子,这篇具体写下Secret的用法。
和前面介绍的ConfigMap几乎是一模一样,secret也是配置资源的一种形式,用来存储键-值对。假如我们想把数据库的账号和密码这种比较隐私的数据存储起来,用secret更符合语境,而且k8s对它做了很多特别的处理。
下面我们看下具体创建secret的方式。
官方参考文档:https://kubernetes.io/zh-cn/docs/reference/kubectl/generated/kubectl_create/kubectl_create_secret_generic/
作用:基于文件、目录或指定的文字值创建Secret。
单个Secret可以包含一个或多个键值对。
当基于文件创建Secret时,键将默认为文件的基本名称,值将默认为文件内容。如果基本名称是无效的键,或者你希望选择自己的键,你可以指定一个替代键。
文档写的比较清楚,如果以文件方式创建secret,key为文件名,value为文件内容。
需求:两个文本文件username.txt和password.txt,分别存储数据库账号名和密码,值分别是admin和123,根据这两个文件创建secret。
第一步:执行kubectl命令
kubectl create secret generic db-user-pass \--from-file=./username.txt \--from-file=./password.txt第二步:使用kubectl查看生成的secret
kubectl get secret可以看到结果:
secret创建完成后,我们就想查看一下,命令如下:
kubectl describe db-user-pass结果:
Name: db-user-passNamespace: defaultLabels: Annotations: Type: OpaqueData====password.txt: 337 bytes #内容看不到username.txt: 6 bytes发现key确实是文件名,但是内容不见了,只有文件大小。这就是secret不想我们直接看到明文内容。
第一步:创建配置文件secret-test.yml
cat secret-test.ymlapiVersion: v1kind: Secretmetadata:name: mysecrettype: Opaquedata:username: YWRtaW4=password: MWYyZDFlMmU2N2RmEOFtype字段比较重要,它决定k8s如何特别处理该sercret。此处的Opaque意思是随便存。官方参考文档(重要):https://kubernetes.io/zh-cn/docs/concepts/configuration/secret/#secret-types第二步:k8s执行部署
kubectl apply -f secret-test.yml保持该secret用于下方试验。
第一步:编写Pod配置文件 secret-test-pod.yml
cat secret-test-pod.ymlapiVersion: v1kind: Podmetadata:name: busyboxnamespace: defaultspec:containers:- name: busyboximage: busybox:1.28command:- sleep- "3600"volumeMounts:# name must match the volume name below- name: secret-volumemountPath: /etc/secret-volumereadOnly: true# The secret data is exposed to Containers in the Pod through a Volume.volumes:- name: secret-volumesecret:secretName: mysecretEOFPod引用了上面secret-test.yml创建的secret。
第二步:k8s部署执行
kubectl apply -f secret-test-pod.yml拓扑图示观察容器可以得到下面几个结论:
参考官方文档:
https://kubernetes.io/zh-cn/docs/tasks/inject-data-application/distribute-credentials-secure/#project-secret-keys-to-specific-file-paths
首先修改Pod配置文件:
cat secret-test-pod.ymlapiVersion: v1kind: Podmetadata:name: busyboxnamespace: defaultspec:containers:- name: busyboximage: busybox:1.28command:- sleep- "3600"volumeMounts:# name must match the volume name below- name: secret-volumemountPath: /etc/secret-volumereadOnly: true# The secret data is exposed to Containers in the Pod through a Volume.volumes:- name: secret-volumesecret:secretName: mysecretitems:- key: usernamepath: my-group/my-usernameEOF使用items指定某个键映射到容器的某个路径下,在该例中username的最终生成路径为:
/etc/secret-volume/my-group/my-username实验过程略。
第一步:删除前一个实验的Pod
kubectl delete -f secret-test-pod.yml第二步:修改secret-test-pod.yml配置文件
cat secret-test-pod.ymlapiVersion: v1kind: Podmetadata:name: busyboxnamespace: defaultspec:containers:- name: busyboximage: busybox:1.28command:- sleep- "3600"env:- name: SECRET_USERNAMEvalueFrom:secretKeyRef:name: mysecretkey: username- name: SECRET_PASSWORDvalueFrom:secretKeyRef:name: mysecretkey: passwordvolumes:- name: secret-volumesecret:secretName: mysecretEOF第三步:k8s重新部署
第四步:进入busybox,然后查看环境变量
kubectl exec -it busybox -- sh#打印环境变量echo $SECRET_USERNAME#结果:admin可以看到注入时已经被Base64解码了。
#删除Pod资源和配置文件kubectl delete -f secret-test-pod.ymlrm -rf secret-test-pod.yml#删除secret资源和配置文件kubectl delete -f secret-test.ymlrm -rf secret-test.yml来源:恋爱脑一点号