2025年13、用 k8s 管理机密信息Secret、查看 Secret、volume 方式使用 Secret、环境变量方式使用 Secret、用 ConfigMap 管理配置

13、用 k8s 管理机密信息Secret、查看 Secret、volume 方式使用 Secret、环境变量方式使用 Secret、用 ConfigMap 管理配置用 k8s 管理机密信息 Secret 应用启动过程中可能需要一些敏感信息 比如访问数据库的用户名密码或者秘钥 将这些信息直接保存在容器镜像中显然不妥 Kubernetes 提供的解决方案是 Secret Secret 会以密文的方式存储数据 避免了直接在配置文件中保存敏感信息 Secret 会以 Volume 的形式被 mount 到

大家好,我是讯享网,很高兴认识大家。

用 k8s 管理机密信息Secret

应用启动过程中可能需要一些敏感信息,比如访问数据库的用户名密码或者秘钥。将这些信息直接保存在容器镜像中显然不妥,Kubernetes 提供的解决方案是 Secret。

创建 Secret

有四种方法创建 Secret:

1. 通过 --from-literal

[root@master ~]# kubectl create secret generic mysecret --from-literal=username=admin --from-literal=password= secret/mysecret created 

讯享网

每个 --from-literal 对应一个信息条目。

删除

讯享网[root@master ~]# kubectl delete secret mysecret secret "mysecret" deleted 

2. 通过 --from-file

[root@master ~]# echo -n admin > ./username [root@master ~]# echo -n  > ./password [root@master ~]# kubectl create secret generic mysecret --from-file=./username --from-file=./password secret/mysecret created 

每个文件内容对应一个信息条目。

3. 通过 --from-env-file

讯享网[root@master ~]# cat << EOF > env.txt > username=admin > password= > EOF [root@master ~]# kubectl create secret generic mysecret --from-env-file=env.txt secret/mysecret created 

文件 env.txt 中每行 Key=Value 对应一个信息条目。

4. 通过 YAML 配置文件:

[root@master ~]# vim mysecrete.yml apiVersion: v1 kind: Secret metadata: name: mysecret data: username: YWRtaW4= password: MTIzNDU2

文件中的敏感数据必须是通过 base64 编码后的结果。

讯享网[root@master ~]# echo -n admin | base64 YWRtaW4= [root@master ~]# echo -n  | base64 MTIzNDU2 [root@master ~]# 

执行 kubectl apply 创建 Secret:

[root@master ~]# kubectl apply -f mysecrete.yml secret/mysecret created 

 

查看 Secret

可以通过 kubectl get secret 查看存在的 secret。

讯享网[root@master ~]# kubectl get secret mysecret NAME TYPE DATA AGE mysecret Opaque 2 13m [root@master ~]# 


讯享网

显示有两个数据条目,kubectl describe secret 查看条目的 Key:

[root@master ~]# kubectl describe secret mysecret Name: mysecret Namespace: default Labels: <none> Annotations: <none> Type: Opaque Data ==== password: 6 bytes username: 5 bytes [root@master ~]# 

如果还想查看 Value,可以用 kubectl edit secret mysecret

讯享网apiVersion: v1 data: password: MTIzNDU2 username: YWRtaW4= kind: Secret metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"v1","data":{"password":"MTIzNDU2","username":"YWRtaW4="},"kind":"Secret","metadata":{"annotations":{},"name":"mysecret","namespace":"default"}} creationTimestamp: "2021-01-07T09:12:42Z" name: mysecret namespace: default resourceVersion: "" uid: f5b15bda-b659-46de-8905-853b7b056120 type: Opaque 

 

 然后通过 base64 将 Value 反编码:

[root@master ~]# echo -n MTIzNDU2 | base64 --decode  [root@master ~]# [root@master ~]# echo -n YWRtaW4= | base64 --decode admin [root@master ~]# 

 volume 方式使用 Secret

讯享网[root@master secrete]# vim mypod.yml apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: mypod image: busybox args: - /bin/sh - -c - sleep 10; touch /tmp/healthy; sleep 30000 volumeMounts: - name : foo mountPath: "/etc/foo" readOnly: true volumes: - name: foo secret: secretName: mysecret 

① 定义 volume foo,来源为 secret mysecret。
② 将 foo mount 到容器路径 /etc/foo,可指定读写权限为 readOnly。
创建 Pod 并在容器中读取 Secret:

[root@master secrete]# kubectl apply -f my mypod.yml mysecrete.yml [root@master secrete]# kubectl apply -f mypod.yml pod/mypod created [root@master secrete]# kubectl exec -it mypod sh kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead. / # ls /etc/foo password username / # cat /etc/foo/username admin/ # / # cat /etc/foo/password / # / # 

可以看到,Kubernetes 会在指定的路径 /etc/foo 下为每条敏感数据创建一个文件,文件名就是数据条目的 Key,这里是 /etc/foo/username 和 /etc/foo/password,Value 则以明文存放在文件中。

我们也可以自定义存放数据的文件名,比如将配置文件改为

讯享网[root@master secrete]# vim mypod.yml apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: mypod image: busybox args: - /bin/sh - -c - sleep 10; touch /tmp/healthy; sleep 30000 volumeMounts: - name : foo mountPath: "/etc/foo" readOnly: true volumes: - name: foo secret: secretName: mysecret items: - key: username path: my-group/my-username - key: password path: my-group/my-password 

这时数据将分别存放在 /etc/foo/my-group/my-username 和 /etc/foo/my-group/my-password 中。

以 Volume 方式使用的 Secret 支持动态更新:Secret 更新后,容器中的数据也会更新。

将 password 更新为 abcdef,base64 编码为 YWJjZGVm

å¾ç

更新 Secret。

图片

几秒钟或,新的 password 会同步到容器。

图片

以上是通过 Volume 使用 Secret,

环境变量方式使用 Secret

通过 Volume 使用 Secret,容器必须从文件读取数据,会稍显麻烦,Kubernetes 还支持通过环境变量使用 Secret。

Pod 配置文件示例如下:

[root@master secrete]# vim mypod1.yml apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: mypod image: busybox args: - /bin/sh - -c - sleep 10; touch /tmp/healthy; sleep 30000 env: - name: SECRET_USERNAME valueFrom: secretKeyRef: name: mysecret key: username - name: SECRET_PASSWORD valueFrom: secretKeyRef: name: mysecret key: password 

创建 Pod 并读取 Secret。

讯享网[root@master secrete]# kubectl apply -f mypod1.yml pod/mypod created [root@master secrete]# kubectl exec -it mypod sh kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead. / # echo $SECRET_USERNAME admin / # echo $SECRET_PASSWORD  / # 

通过环境变量 SECRET_USERNAME 和 SECRET_PASSWORD 成功读取到 Secret 的数据。
需要注意的是,环境变量读取 Secret 很方便,但无法支撑 Secret 动态更新。
Secret 可以为 Pod 提供密码、Token、私钥等敏感数据;对于一些非敏感数据,比如应用的配置信息,则可以用 ConfigMap。

 

Secret 可以为 Pod 提供密码、Token、私钥等敏感数据;对于一些非敏感数据,比如应用的配置信息,则可以用 ConfigMap。
ConfigMap 的创建和使用方式与 Secret 非常类似,主要的不同是数据以明文的形式存放。
与 Secret 一样,ConfigMap 也支持四种创建方式:

用 ConfigMap 管理配置

1、通过 --from-literal

[root@master secrete]# kubectl create configmap myconfigmap --from-literal=config1=xxx --from-literal=config2=yyy configmap/myconfigmap created [root@master secrete]# kubectl delete configmap myconfigmap configmap "myconfigmap" deleted 

2、通过 --from-file:

讯享网[root@master secrete]# echo -n xxx > ./config1 [root@master secrete]# echo -n yyy > ./config2 [root@master secrete]# kubectl create configmap myconfigmap --from-file=./config1 --from-file=./config2 configmap/myconfigmap created [root@master secrete]# kubectl delete configmap myconfigmap configmap "myconfigmap" deleted [root@master secrete]# 

每个文件内容对应一个信息条目

3、通过 --from-env-file

[root@master secrete]# cat << EOF > env.txt > config1=xxx > config2=yyy > EOF [root@master secrete]# kubectl create configmap myconfigmap --from-env-file=env.txt configmap/myconfigmap created [root@master secrete]# kubectl delete configmap myconfigmap configmap "myconfigmap" deleted [root@master secrete]# 

4、通过 YAML 配置文件:

讯享网[root@master secrete]# vim myconfigmap.yml apiVersion: v1 kind: ConfigMap metadata: name: myconfigmap data: config1: xxx config2: yyy 

文件中的数据直接以明文输入

[root@master secrete]# kubectl apply -f myconfigmap.yml configmap/myconfigmap created [root@master secrete]# 

与 Secret 一样,Pod 也可以通过 Volume 或者环境变量的方式使用 Secret。

Volume 方式:

讯享网[root@master secrete]# vim mypod2.yml apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: mypod image: busybox args: - /bin/sh - -c - sleep 10; touch /tmp/healthy; sleep 30000 volumeMounts: - name : foo mountPath: "/etc/foo" readOnly: true volumes: - name: foo configMap: name: myconfigmap 
[root@master secrete]# kubectl apply -f mypod2.yml pod/mypod created [root@master secrete]# 

环境变量方式:

讯享网[root@master secrete]# vim mypod3.yml kind: Pod metadata: name: mypod spec: containers: - name: mypod image: busybox args: - /bin/sh - -c - sleep 10; touch /tmp/healthy; sleep 30000 env: - name: CONFIG_1 valueFrom: configMapKeyRef: name: myconfigmap key: config1 - name: CONFIG_2 valueFrom: configMapKeyRef: name: myconfigmap key: config2 
[root@master secrete]# kubectl apply -f myconfigmap.yml configmap/myconfigmap created [root@master secrete]# kubectl get configmap NAME DATA AGE kube-root-ca.crt 1 30d myconfigmap 2 11s [root@master secrete]# kubectl apply -f mypod3.yml pod/mypod created [root@master secrete]# kubectl exec -it mypod sh kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead. / # echo $CONFIG_1 xxx / # echo $CONFIG_2 yyy / # 

大多数情况下,配置信息都以文件形式提供,所以在创建 ConfigMap 时通常采用 --from-file 或 YAML 方式,读取 ConfigMap 时通常采用 Volume 方式。

 

比如给 Pod 传递如何记录日志的配置信息:

讯享网[root@master secrete]# vim logging.conf class: logging.handlers.RotatingFileHandler formatter: precise level: INFO filename: %hostname-%timestamp.log

 可以采用 --from-file 形式,则将其保存在文件 logging.conf 中,然后执行命令:

[root@master secrete]# kubectl create configmap myconfigmap --from-file=./logging.conf configmap/myconfigmap created [root@master secrete]# kubectl get configmap myconfigmap NAME DATA AGE myconfigmap 1 3m33s [root@master secrete]# kubectl describe myconfigmap error: the server doesn't have a resource type "myconfigmap" [root@master secrete]# kubectl describe configmap myconfigmap Name: myconfigmap Namespace: default Labels: <none> Annotations: <none> Data ==== logging.conf: ---- class: logging.handlers.RotatingFileHandler formatter: precise level: INFO filename: %hostname-%timestamp.log Events: <none> [root@master secrete]#

如果采用 YAML 配置文件,其内容则为:

讯享网[root@master configmap]# vim myconfigmap.yml apiVersion: v1 kind: ConfigMap metadata: name: myconfigmap data: logging.conf: | class: logging.handlers.RotatingFileHandler formatter: precise level: INFO filename: %hostname-%timestamp.log

 注意别漏写了 Key logging.conf 后面的 | 符号。

创建并查看 ConfigMap:

[root@master configmap]# kubectl apply -f myconfigmap.yml configmap/myconfigmap created [root@master configmap]# kubectl describe configmap myconfigmap Name: myconfigmap Namespace: default Labels: <none> Annotations: <none> Data ==== logging.conf: ---- class: logging.handlers.RotatingFileHandler formatter: precise level: INFO filename: %hostname-%timestamp.log Events: <none> [root@master configmap]# 

在 Pod 中使用此 ConfigMap,配置文件为:

讯享网[root@master configmap]# vim mypod.yml apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: mypod image: busybox args: - /bin/sh - -c - sleep 10; touch /tmp/healthy; sleep 30000 volumeMounts: - name : foo mountPath: "/etc/foo" volumes: - name: foo configMap: name: myconfigmap items: - key: logging.conf path: myapp/logging.conf 

① 在 volume 中指定存放配置信息的文件相对路径为 myapp/logging.conf。
② 将 volume mount 到容器的 /etc 目录。
创建 Pod 并读取配置信息:

[root@master configmap]# kubectl apply -f mypod.yml pod/mypod created [root@master configmap]# kubectl get pod mypod NAME READY STATUS RESTARTS AGE mypod 1/1 Running 0 7s [root@master configmap]# kubectl exec -it mypod sh kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead. / # / # cat /etc/foo/myapp/logging.conf class: logging.handlers.RotatingFileHandler formatter: precise level: INFO filename: %hostname-%timestamp.log / # 

配置信息已经保存到 /etc/foo/myapp/logging.conf 文件中。与 Secret 一样,Volume 形式的 ConfigMap 也支持动态更新

如果信息需要加密,可使用 Secret;如果是一般的配置信息,则可使用 ConfigMap。

Secret 和 ConfigMap 支持四种定义方法。Pod 在使用它们时,可以选择 Volume 方式或环境变量方式,不过只有 Volume 方式支持动态更新

小讯
上一篇 2025-02-16 20:01
下一篇 2025-02-25 23:46

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/27799.html