ConfigMap的设计初衷就是将环境相关的配置信息与容器镜像解耦。通过kubectl命令行和YAML文件都能快速创建ConfigMap。
比如我们有个应用需要配置数据库连接地址,使用kubectl直接创建:
bash复制下载kubectl create configmap db-config --from-literal=db.host=mysql-service --from-literal=db.port=3306更复杂的配置则推荐使用YAML方式。假设我们有个redis.conf配置文件:
yaml复制下载apiVersion: v1
kind: ConfigMap
metadata:
name: redis-config
data:
redis.conf: |
maxmemory 256mb
maxmemory-policy allkeys-lru
timeout 300ConfigMap的三种挂载方式
环境变量注入方式:
yaml复制下载apiVersion: v1
kind: Pod
metadata:
name: web-app
spec:
containers:
- name: app
image: nginx
env:
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: db-config
key: db.host卷挂载方式:
yaml复制下载spec:
containers:
- name: redis
image: redis:6.0
volumeMounts:
- name: config-volume
mountPath: /etc/redis
volumes:
- name: config-volume
configMap:
name: redis-config命令行参数方式:
yaml复制下载spec:
containers:
- name: app
image: nginx
command: ["/bin/sh", "-c", "echo $(DB_HOST)"]
env:
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: db-config
key: db.hostSecret:敏感信息的安全守护
Secret的使用方式与ConfigMap类似,但专门用于存储密码、令牌、密钥等敏感数据。Kubernetes会对Secret数据进行base64编码。
创建Secret示例:
bash复制下载echo -n 'mysecretpassword' | base64
kubectl create secret generic mysql-secret --from-literal=password=实际密码YAML定义方式:
yaml复制下载apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
data:
api-key: YXBpLWtleS12YWx1ZQ== 实际使用时需要base64编码
token: dG9rZW4tdmFsdWU=在Pod中引用Secret:
yaml复制下载spec:
containers:
- name: web-app
image: nginx
env:
- name: API_PASSWORD
valueFrom:
secretKeyRef:
name: app-secret
key: api-key
volumeMounts:
- name: secret-volume
mountPath: /etc/secrets
readOnly: true
volumes:
- name: secret-volume
secret:
secretName: app-secret实战经验与避坑指南
配置热更新问题:ConfigMap以卷方式挂载时,更新ConfigMap后,Kubernetes会自动同步到Pod,但具体生效时间取决于kubelet的同步周期。环境变量方式的配置则无法热更新。
权限控制要点:在生产环境中,需要通过RBAC严格控制ConfigMap和Secret的访问权限,避免配置信息泄露。
大小限制注意:ConfigMap和Secret都有1MB的大小限制,对于大配置文件建议使用专用配置中心或存储卷。
Secret加密方案:虽然Secret会编码,但默认不加密。生产环境建议开启加密存储功能,或使用HashiCorp Vault等专业方案。
健康检查配合:配置更新后,应用可能需要重启。可以通过设置就绪探针,在配置异常时自动隔离Pod。
最佳实践总结
经过多个项目的实践验证,我们总结出以下经验:
开发、测试、生产环境使用不同的ConfigMap,通过标签进行区分
Secret资源必须设置严格的RBAC权限
配置文件尽量采用卷挂载方式,便于热更新
敏感信息定期轮换,建立完善的密钥管理制度
结合CI/CD流水线,实现配置的版本化管理
通过合理使用ConfigMap和Secret,我们实现了应用配置的标准化管理,大大提高了部署效率和安全性。特别是在多环境部署场景下,只需要替换配置就能快速完成环境迁移,真正做到了"一次构建,到处运行"。