精通k8s(26)存储系统-Secret 创建和注入

360影视 动漫周边 2025-08-29 21:06 2

摘要:和前面介绍的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: mysecretEOF

Pod引用了上面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

来源:恋爱脑一点号

相关推荐