一、ConfigMap & Secret 核心定位
属于Kubernetes的配置管理特性,用于解耦应用与配置
1. ConfigMap
作用 :存储非敏感配置数据
存储内容:
- 环境变量
- 命令行参数
- 配置文件(如JSON/XML/YAML)
- 系统参数(如JVM参数)
2. Secret
作用 :存储敏感信息
存储内容:
- 数据库凭证
- API密钥
- TLS证书
- SSH密钥
对比特性
特性 | ConfigMap | Secret |
---|---|---|
数据加密 | 明文存储 | Base64编码 |
适用场景 | 非敏感配置 | 凭证/密钥 |
存储限制 | 1MB | 1MB |
自动更新 | 支持(需配置) | 支持(需配置) |
二、Pod挂载方式
1. 环境变量注入
yaml:pod-env.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
spec:
containers:
- name: app
image: myapp:v1
env:
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: db-config
key: host
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
2. 文件卷挂载
yaml:pod-volume.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
spec:
containers:
- name: app
image: myapp:v1
volumeMounts:
- name: config-volume
mountPath: /etc/app/config
- name: secret-volume
mountPath: /etc/app/secret
volumes:
- name: config-volume
configMap:
name: app-config
- name: secret-volume
secret:
secretName: app-secret
三、最佳实践
- 敏感数据必用Secret:即使Base64不是加密,也比明文安全
- 热更新策略 :
- 环境变量方式:修改后需重建Pod
- 文件卷方式:kubelet定期同步更新(默认1分钟间隔)
- 配置分离:按环境(dev/test/prod)创建不同ConfigMap
- 权限控制:通过RBAC限制Secret访问权限
四、创建配置示例
创建ConfigMap:
bash
kubectl create configmap app-config \
--from-literal=DB_HOST=mysql-service \
--from-literal=CACHE_ENABLED=true
创建Secret:
bash
# 从文件创建
kubectl create secret generic db-credentials \
--from-file=./ssl.cert \
--from-literal=password='S!B\#d3z'
# 专门类型Secret
kubectl create secret tls https-cert \
--cert=path/to/cert.crt \
--key=path/to/cert.key
上述配置实现了什么功能?开发时如何创建对应的ConfigMap和Secret?
yaml:deployment.yaml
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: app
envFrom: # 环境变量注入方式
- configMapRef: # 加载 ConfigMap 所有键值作为环境变量
name: app-config
- secretRef: # 加载 Secret 所有键值作为环境变量
name: db-credentials