一、核心定义与设计目标
-
ConfigMap
用于存储非敏感配置数据(如环境变量、配置文件、命令行参数),旨在实现应用与配置的解耦,提升镜像的可移植性。数据以明文形式存储在etcd中,可通过环境变量、命令行参数或卷挂载的方式注入Pod。 -
Secret
专为敏感数据(如密码、API密钥、TLS证书)设计,数据默认以Base64编码存储,支持加密功能。Secret通过内存存储和加密传输增强安全性,避免敏感信息以明文暴露。
二、核心差异对比
特性 | ConfigMap | Secret |
---|---|---|
数据类型 | ||
非敏感文本(如配置参数、URL) |
|
敏感信息(如密码、SSH密钥)
|
| 存储方式 |
明文存储于etcd,API响应可见
|
Base64编码存储,支持静态加密(K8s 1.13+)
|
| 访问安全 |
仅依赖Kubernetes RBAC控制访问
|
额外加密传输,仅分发到需访问的节点
|
| 更新传播 |
挂载为卷时可热更新(需应用支持重载)
|
挂载为卷时自动更新(需kubelet同步周期)
|
| 可见性 | kubectl describe
可查看完整内容
| kubectl describe
仅显示数据大小
|
三、典型使用场景
- ConfigMap适用场景
-
应用程序配置文件(如Redis的
redis.conf
) -
环境变量注入(如数据库地址)
-
命令行参数动态配置(如日志级别)
- Secret适用场景
-
数据库凭证(用户名/密码)
-
TLS证书(如HTTPS服务证书)
-
镜像仓库认证信息(
.dockerconfigjson
)
四、创建与使用方式
1. 创建方式
-
ConfigMap
支持从字面量、文件、目录或YAML直接创建:kubectl create configmap my-config --from-file=config-file.properties
示例YAML结构:
apiVersion: v1 kind: ConfigMap metadata: name: app-config data: LOG_LEVEL: "DEBUG" config-file: | property1=value1 property2=value2
-
Secret
需对数据进行Base64编码或通过文件隐式编码:echo -n 'admin' | base64 # 输出YWRtaW4= kubectl create secret generic db-secret --from-literal=username=YWRtaW4=
示例YAML结构:
apiVersion: v1 kind: Secret metadata: name: db-secret type: Opaque data: username: YWRtaW4= password: MWYyZDFlMmU2N2Rm
2. 注入到Pod
-
环境变量
两者均支持通过env.valueFrom
注入:env: - name: DB_PASSWORD valueFrom: secretKeyRef: # 或 configMapKeyRef name: db-secret key: password
-
卷挂载
挂载为文件时,ConfigMap与Secret的行为差异显著:volumes: - name: config-vol configMap: name: app-config - name: secret-vol secret: secretName: db-secret
-
ConfigMap:文件内容明文可见,支持热更新(需应用监听文件变化)。
-
Secret:文件权限默认
0644
,可通过defaultMode
调整,数据更新后自动同步。
五、安全性与最佳实践
- ConfigMap安全限制
-
避免存储敏感数据,因etcd中明文可见。
-
通过RBAC限制访问权限,仅允许必要命名空间读取。
- Secret增强措施
-
启用etcd静态加密(K8s 1.13+)。
-
使用
immutable: true
标记防止意外修改(K8s 1.19+)。 -
避免通过环境变量传递Secret(可能被日志记录)。
六、生命周期与更新
-
独立性:两者生命周期与Pod解耦,删除Pod不会影响ConfigMap/Secret。
-
更新策略:
-
ConfigMap:需重启Pod或依赖应用热加载(如Nginx重载配置)。
-
Secret:kubelet定期同步更新挂载卷中的文件,无需重启Pod。
总结
ConfigMap与Secret是Kubernetes配置管理的核心组件,关键区别在于数据敏感性处理机制。ConfigMap适合非敏感配置的灵活管理,而Secret通过加密和访问控制保障敏感数据安全。实际使用中需结合RBAC、加密策略与更新机制,确保配置管理的安全性与高效性。