【k8s应用管理】kubernetes 配置资源管理
文章目录
- 配置资源管理
- Secret 的四种类型
- 创建 Secret 的两种方式
- 1. 使用 `kubectl create secret` 命令创建
- 2. 使用 base64 编码内容创建
- 使用 Secret 的两种方式
- 1. 将 Secret 挂载到 Volume 中
- 2. 将 Secret 导出到环境变量中
- 总结
- ConfigMap
- ConfigMap 概述
- 创建 ConfigMap 的三种方式
- 从目录创建
- 从文件创建
- 从字面值创建
- 在 Pod 中使用 ConfigMap
- 作为环境变量
- 作为命令行参数
- 挂载为数据卷
- ConfigMap 的热更新
- 1. Volume 自动更新
- 2. 环境变量不更新
- 3. 触发滚动更新
配置资源管理
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:
- 用于存储 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
- 更新 ConfigMap:
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