Secret 与 ConfigMap配置资源管理
1 Secret(密钥管理)
1.1 概念
1.1.1 什么是Secret
Secret 用来存储敏感数据,是一个密钥管理的工具
- 密码
- Token
- 密钥
1.1.2 Secret 的作用
- 安全性:数据以非明文方式存储( Base64 编码,但**不等于加密 **)
- 敏感信息分离:将pod中的敏感信息放到 Secret 中,方便控制访问并降低泄露风险
- 细粒度访问控制:可以通过 RBAC 控制谁可以访问哪些 Secret
1.1.3 使用方式
- 作为 Volume 文件 挂载
- 作为 环境变量
- kubelet 拉取镜像时使用认证信息
应用场景:凭据管理
使用前提:Pod 必须引用 Secret 才能使用
1.2 Secret 类型
类型 | 说明 |
---|---|
kubernetes.io/service-account-token | Kubernetes 自动创建,用于访问 APIServer。Pod 默认挂载在 /run/secrets/kubernetes.io/serviceaccount 。 |
Opaque | 默认类型,用户自定义密码、密钥等(Base64 编码)。 |
kubernetes.io/dockerconfigjson | 存储私有 Docker Registry 的认证信息。 |
kubernetes.io/tls | 存储 SSL/TLS 证书与私钥。 |
1.3 Secret 创建
1.3.1 命令行创建
# 创建
echo -n 'zhangsan' > username.txt
echo -n 'abc1234' > password.txtkubectl create secret generic mysecret --from-file=username.txt --from-file=password.txt# 查看
kubectl get secrets
kubectl describe secret mysecret
1.3.1 YAML 文件创建
# 输出用户名例 emhhbmdzYW4K=
echo -n zhangsan | base64# 输出密码例 YWJjMTIzNAo==
echo -n abc1234 | base64
------------------------------------------------------------------------------------------------------------
apiVersion: v1
kind: Secret
metadata:name: secret-lisi
type: Opaque
data:username: bGlzaQ==password: YWJjMTIzNA==
# 创建
kubectl apply -f secret.yaml
kubectl get secret secret-lisi -o yaml
1.3 Secret 使用
作用:将pod中的敏感信息放到 Secret 中,方便控制访问并降低泄露风险
1.3.1 方式一:挂载为文件
vim secret-pod.yaml
------------------------------------------------------------------------------------------------------------
apiVersion: v1
kind: Pod
metadata:name: secret-pod
spec:containers:- name: nginximage: nginxvolumeMounts:- name: secretsmountPath: "/etc/secrets"readOnly: truevolumes:- name: secretssecret:secretName: mysecret
验证:
kubectl exec -it mypod -- ls /etc/secrets
1.3.2 方式二:导入环境变量
vim mypod1.yaml
------------------------------------------------------------------------------------------------------------
apiVersion: v1
kind: Pod
metadata:name: mypod1
spec:containers:- name: nginximage: nginxenv:- name: TEST_USERvalueFrom:secretKeyRef:name: secret-lisikey: username- name: TEST_PASSWORDvalueFrom:secretKeyRef:name: secret-lisikey: password
验证:
kubectl exec -it mypod1 -- printenv | grep TEST
2 ConfigMap (配置管理)
2.1 概念
2.1.1 什么是ConfigMap
- 存储非敏感配置数据。 ConfigMap 可供应用读取配置文件、命令行参数或环境变量
- 将 pod 容器中服务的配置文件统一存入ConfigMap,方便管理
2.2 ConfigMap 创建
2.2.1 方法一:从目录创建
mkdir /opt/configmap/vim /opt/configmap/game.properties
------------------------------------------------------------------------------------------------------------
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30vim /opt/configmap/ui.properties
------------------------------------------------------------------------------------------------------------
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice# 创建
kubectl create configmap game-config --from-file=/opt/configmap/
2.3 Pod 中使用 ConfigMap
2.3.1 ConfigMap 热更新机制
vim test-pod4.yaml
------------------------------------------------------------------------------------------------------------
# 创建configmap
apiVersion: v1
kind: ConfigMap
metadata:name: log-confignamespace: default
data:log_level: INFO
---
# 创建deployment控制器
apiVersion: apps/v1
kind: Deployment
metadata:name: my-nginx
spec:replicas: 1selector:matchLabels:app: my-nginx# 创建nginxtemplate:metadata:labels:app: my-nginxspec:containers:- name: my-nginximage: nginxports:- containerPort: 80volumeMounts:- name: config-volumemountPath: /etc/config# 将nginx 配置文件挂载到log-configvolumes:- name: config-volumeconfigMap:name: log-config
------------------------------------------------------------------------------------------------------------
# 部署
kubectl apply -f test-pod.yaml
kubectl exec -it my-nginx-c6df7db54-2x54r -- cat /etc/config/log_level# 测试同步
kubectl edit configmap log-config
------------------------------------------------------------------------------------------------------------
apiVersion: v1
data:log_level: DEBUG #INFO 修改成 DEBUG
kind: ConfigMap
metadata:annotations:kubectl.kubernetes.io/last-applied-configuration: |{"apiVersion":"v1","data":{"log_level":"DEBUG"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"log-config","namespace":"default"}} #INFO 修改成 DEBUGcreationTimestamp: 2021-05-25T07:59:18Zname: log-confignamespace: defaultresourceVersion: "93616"selfLink: /api/v1/namespaces/default/configmaps/log-configuid: 1b8115de-bd2f-11eb-acba-000c29d88bba
------------------------------------------------------------------------------------------------------------# log_level: DEBUG
验证
// 等大概10秒左右,使用该 ConfigMap 挂载的 Volume 中的数据同步更新
kubectl exec -it my-nginx-76b6489f44-6dwxh -- cat /etc/config/log_level
# 输出:DEBUG
Volume 挂载的数据约 10 秒后同步更新。
环境变量不会自动更新。
2.3.2 触发滚动更新
更新 ConfigMap 不会自动触发 Pod 重启,可手动触发滚动更新。
更新 ConfigMap 目前并不会触发相关 Pod 的滚动更新,可以通过在 .spec.template.metadata.annotations 中添加 version/config ,每次通过修改 version/config 来触发滚动更新kubectl patch deployment my-nginx --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20210525" }}}}}'kubectl get pods PS:更新 ConfigMap 后:
●使用该 ConfigMap 挂载的 Env 不会同步更新。
●使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概10秒)才能同步更新。
3 总结对比表
项目 | Secret | ConfigMap |
---|---|---|
存储内容 | 敏感信息(密码、密钥) | 普通配置信息(非敏感信息) |
数据编码 | Base64 | 纯文本 |
使用方式 | Volume、Env、镜像拉取凭证 | Volume、Env、命令参数 |
是否自动更新 | Volume 延迟更新,Env 不会 | Volume 延迟更新,Env 不会 |
安全性 | 高(需 RBAC 控制) | 普通 |