【k8s应用管理】kubernetes 配置资源管理
配置资源管理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
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企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]