马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
配置资源管理
Secret 是一种用于存储敏感信息(如暗码、令牌、密钥等)的资源对象。与直接将敏感信息存储在 Pod 或镜像中相比,利用 Secret 可以更好地控制数据的访问权限,淘汰数据暴露的风险。
Secret 的四种类型
- kubernetes.io/service-account-token:
- 由 Kubernetes 主动创建,用于访问 APIServer。
- Pod 默认利用这个 Secret 与 APIServer 通信。
- 主动挂载到 Pod 的 /var/run/secrets/kubernetes.io/serviceaccount 目录中。
- Opaque:
- 默认的 Secret 类型,利用 base64 编码存储用户自定义的敏感数据(如暗码、密钥等)。
- kubernetes.io/dockerconfigjson:
- 用于存储私有 Docker Registry 的认证信息。
- kubernetes.io/tls:
创建 Secret 的两种方式
1. 利用 kubectl create secret 命令创建
- echo -n 'zhangsan' > username.txt
- echo -n 'abc1234' > password.txt
- kubectl create secret generic mysecret --from-file=username.txt --from-file=password.txt
复制代码 查看 Secret:
- kubectl get secrets
- kubectl describe secret mysecret
复制代码 2. 利用 base64 编码内容创建
- echo -n zhangsan | base64
- echo -n abc1234 | base64
复制代码 创建 secret.yaml 文件:
- apiVersion: v1
- kind: Secret
- metadata:
- name: mysecret1
- type: Opaque
- data:
- username: emhhbmdzYW4K=
- password: YWJjMTIzNAo==
复制代码 应用 YAML 文件:
- kubectl create -f secret.yaml
复制代码 查看 Secret 的详细信息:
- kubectl get secret mysecret1 -o yaml
复制代码 利用 Secret 的两种方式
1. 将 Secret 挂载到 Volume 中
创建 secret-test.yaml 文件:
- apiVersion: v1
- kind: Pod
- metadata:
- name: mypod
- spec:
- containers:
- - name: nginx
- image: nginx
- volumeMounts:
- - name: secrets
- mountPath: "/etc/secrets"
- readOnly: true
- volumes:
- - name: secrets
- secret:
- secretName: mysecret
复制代码 应用 YAML 文件:
- kubectl create -f secret-test.yaml
复制代码 进入 Pod 查看挂载的文件:
- kubectl exec -it mypod bash
- cd /etc/secrets
- ls
- cat username.txt
- cat password.txt
复制代码 2. 将 Secret 导出到环境变量中
创建 secret-test1.yaml 文件:
- apiVersion: v1
- kind: Pod
- metadata:
- name: mypod1
- spec:
- containers:
- - name: nginx
- image: nginx
- env:
- - name: TEST_USER
- valueFrom:
- secretKeyRef:
- name: mysecret1
- key: username
- - name: TEST_PASSWORD
- valueFrom:
- secretKeyRef:
- name: mysecret1
- key: password
- envFrom:
- - secretRef:
- name: mysecret1
复制代码 应用 YAML 文件:
- kubectl apply -f secret-test1.yaml
复制代码 进入 Pod 查看环境变量:
- kubectl exec -it mypod1 bash
- echo $TEST_USER
- echo $TEST_PASSWORD
复制代码 总结
- Secret 是 Kubernetes 中用于存储敏感信息的资源对象。
- 可以通过命令行或 YAML 文件创建 Secret。
- Secret 可以通过挂载 Volume 或环境变量的方式在 Pod 中利用。
- 利用 Secret 可以有效淘汰敏感信息的暴露风险,并方便管理。
更多详细信息可以参考 Kubernetes 官方文档:Secrets。
ConfigMap
ConfigMap 概述
- 作用:存储非加密的配置数据(如应用配置、环境变量),与 Secret 类似,但用于非敏感信息。
- 应用场景:管理应用的配置参数(如数据库地点、日志级别)。
- 核心特点:
- 支持从文件、目录或字面值创建。
- 数据以键值对(key-value)形式存储。
- 可注入到 Pod 的环境变量、命令行参数或挂载为文件。
创建 ConfigMap 的三种方式
从目录创建
将目录中所有文件作为键值对,键为文件名,值为文件内容。
- mkdir /opt/configmap
- echo 'enemy.types=aliens,monsters' > /opt/configmap/game.config
- echo 'color.good=purple' > /opt/configmap/ui.config
- kubectl create configmap game-config --from-file=/opt/configmap/
复制代码 从文件创建
指定多个文件,每个文件对应一个键值对。
- kubectl create configmap game-config-2 \
- --from-file=/opt/configmap/game.config \
- --from-file=/opt/configmap/ui.config
复制代码 从字面值创建
直接通过命令行参数定义键值对。
- kubectl create configmap special-config \
- --from-literal=special.how=very \
- --from-literal=special.type=good
复制代码 查看 ConfigMap:
- kubectl get cm
- kubectl describe cm game-config
- kubectl get cm special-config -o yaml
复制代码 在 Pod 中利用 ConfigMap
作为环境变量
通过 valueFrom 或 envFrom 注入。
- # env.yaml
- apiVersion: v1
- kind: Pod
- metadata:
- name: test-pod
- spec:
- containers:
- - name: busybox
- image: busybox:1.28.4
- command: [ "/bin/sh", "-c", "env" ]
- env:
- - name: SPECIAL_HOW_KEY
- valueFrom:
- configMapKeyRef:
- name: special-config # 引用 ConfigMap
- key: special.how # 指定键
- envFrom:
- - configMapRef:
- name: env-config # 注入所有键值对
复制代码 作为命令行参数
在 command 中通过环境变量引用。
- # test-pod2.yaml
- apiVersion: v1
- kind: Pod
- metadata:
- name: test-pod2
- spec:
- containers:
- - name: busybox
- image: busybox:1.28.4
- command:
- - "/bin/sh"
- - "-c"
- - "echo $(SPECIAL_HOW_KEY) $(SPECIAL_TYPE_KEY)" # 使用环境变量
- env:
- - name: SPECIAL_HOW_KEY
- valueFrom:
- configMapKeyRef:
- name: special-config
- key: special.how
复制代码 挂载为数据卷
将 ConfigMap 作为文件挂载到容器目录。
- # test-pod3.yaml
- apiVersion: v1
- kind: Pod
- metadata:
- name: test-pod3
- spec:
- containers:
- - name: busybox
- image: busybox:1.28.4
- volumeMounts:
- - name: config-volume
- mountPath: /etc/config # 挂载到容器内的目录
- volumes:
- - name: config-volume
- configMap:
- name: special-config # 引用的 ConfigMap
复制代码 验证挂载文件:
- kubectl exec -it test-pod3 -- cat /etc/config/special.how
- # 输出:very
复制代码 ConfigMap 的热更新
1. Volume 主动更新
- 修改 ConfigMap 后,挂载为 Volume 的文件会主动更新(约 10 秒延长)。
- 示例:
- 更新 ConfigMap:
- kubectl edit cm log-config # 将 log_level 从 INFO 改为 DEBUG
复制代码 - 查看容器内文件:
- kubectl exec <pod-name> -- cat /etc/config/log_level # 输出 DEBUG
复制代码
2. 环境变量不更新
- 环境变量不会主动更新,需重启 Pod 或触发滚动更新。
3. 触发滚动更新
通过修改 Deployment 的注解触发 Pod 重启:
- kubectl patch deployment my-nginx \
- --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20231101"}}}}}'
复制代码 注意
- ConfigMap 与 Secret 的区别:ConfigMap 存储非敏感数据,Secret 存储敏感数据(如暗码)。
- 更新限定:
- Volume 挂载的文件支持热更新,但环境变量需重启 Pod。
- 更新 ConfigMap 后,已存在的 Pod 需手动触发更新(如滚动部署)。
- 巨细限定:单个 ConfigMap 的 data 字段总巨细不超过 1 MiB。
- ConfigMap 是 Kubernetes 管理非敏感配置的核心组件。
- 支持从文件、目录或字面值创建,灵活顺应不同场景。
- 通过环境变量、命令行参数或 Volume 挂载将配置注入 Pod。
- 热更新特性使得配置管理更高效,但需注意环境变量的范围性。
参考文档:Kubernetes ConfigMap
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |