第5课:配置管理和Secret
掌握Kubernetes中的配置管理和敏感信息保护机制
🎯 学习目标
- 理解配置管理的重要性和实现方式
- 掌握ConfigMap的创建、使用和管理
- 学习Secret的安全存储和使用方法
- 了解环境变量和挂载卷的配置方式
- 掌握配置管理的最佳实践和安全注意事项
5.1 配置管理基础
🎯 为什么需要配置管理?
在Kubernetes中,应用程序的配置需要与代码分离,以便于:
- 在不同环境中使用相同的容器镜像
- 动态更新配置而无需重新构建镜像
- 集中管理配置,提高可维护性
- 安全存储敏感信息
5.2 ConfigMap详解
🔍 什么是ConfigMap?
ConfigMap是Kubernetes中用于存储非敏感配置数据的API对象,它可以将配置数据与应用程序代码分离。
📝 ConfigMap创建方式
# 1. 从字面量创建
kubectl create configmap my-config --from-literal=key1=value1 --from-literal=key2=value2
# 2. 从文件创建
kubectl create configmap my-config --from-file=config.properties
# 3. 从目录创建
kubectl create configmap my-config --from-file=./configs/
# 4. 从YAML文件创建
kubectl apply -f configmap.yaml
📋 ConfigMap YAML配置
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
namespace: default
data:
nginx.conf: |
user nginx;
worker_processes auto;
events {
worker_connections 1024;
}
http {
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
}
index.html: |
Hello from ConfigMap!
🔧 ConfigMap使用方式
1. 作为环境变量注入
apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
containers:
- name: app
image: nginx
env:
- name: DATABASE_URL
valueFrom:
configMapKeyRef:
name: app-config
key: database.url
2. 通过挂载卷使用
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/conf.d
volumes:
- name: nginx-config
configMap:
name: nginx-config
5.3 Secret详解
🔒 什么是Secret?
Secret是Kubernetes中用于存储敏感信息的API对象,如密码、令牌、证书等。与ConfigMap类似,但提供了额外的安全保护。
⚠️ Secret的安全注意事项
- Secret默认存储在etcd中,使用base64编码,不是加密
- 建议启用etcd加密存储
- 生产环境应使用外部密钥管理系统(如Vault)
- 限制Secret的访问权限
📝 Secret创建方式
# 1. 从字面量创建
kubectl create secret generic my-secret --from-literal=username=admin --from-literal=password=secret
# 2. 从文件创建
kubectl create secret generic my-secret --from-file=./secret.txt
# 3. 从环境变量文件创建
kubectl create secret generic my-secret --from-env-file=./secrets.env
# 4. 手动base64编码创建
kubectl apply -f secret.yaml
# 5. 创建TLS Secret
kubectl create secret tls tls-secret --key=key.pem --cert=cert.pem
📋 Secret YAML配置
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
data:
username: YWRtaW4= # base64编码的admin
password: c2VjcmV0 # base64编码的secret
stringData:
api-key: my-api-key-123 # 自动编码
🔧 Secret使用方式
1. 作为环境变量注入
apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
containers:
- name: app
image: nginx
env:
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: app-secret
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: app-secret
key: password
2. 通过挂载卷使用
apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
containers:
- name: app
image: nginx
volumeMounts:
- name: secret-volume
mountPath: /etc/secrets
readOnly: true
volumes:
- name: secret-volume
secret:
secretName: app-secret
5.4 ConfigMap与Secret的对比
📄 ConfigMap
- 存储非敏感配置
- 明文存储(base64编码)
- 无大小限制(建议<1MB)
- 适用于配置文件、环境变量
🔒 Secret
- 存储敏感配置
- base64编码存储
- 大小限制1MB
- 适用于密码、令牌、证书
- 支持多种类型(Opaque、TLS等)
5.5 配置更新策略
🔄 配置热更新
Kubernetes支持配置的热更新,但需要注意:
- 挂载卷方式:ConfigMap/Secret更新后,挂载卷会自动更新(约1分钟延迟)
- 环境变量方式:需要重启Pod才能生效
- Deployment:可以通过滚动更新触发配置更新
5.6 实战操作示例
# 1. 创建ConfigMap
kubectl create configmap app-config --from-literal=DATABASE_URL=mysql://db:3306/app --from-literal=DEBUG=false
# 2. 创建Secret
kubectl create secret generic app-secret --from-literal=DB_USER=admin --from-literal=DB_PASS=password123
# 3. 查看配置
kubectl get configmap app-config -o yaml
kubectl get secret app-secret -o yaml
kubectl get secret app-secret -o jsonpath='{.data.DB_USER}' | base64 --decode
# 4. 创建使用配置的Pod
cat > app-pod.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
containers:
- name: app
image: nginx
env:
- name: DATABASE_URL
valueFrom:
configMapKeyRef:
name: app-config
key: DATABASE_URL
- name: DB_USER
valueFrom:
secretKeyRef:
name: app-secret
key: DB_USER
- name: DB_PASS
valueFrom:
secretKeyRef:
name: app-secret
key: DB_PASS
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: app-config
EOF
kubectl apply -f app-pod.yaml
# 5. 验证配置
kubectl exec app-pod -- env | grep DATABASE
kubectl exec app-pod -- ls /etc/config
kubectl exec app-pod -- cat /etc/config/DATABASE_URL
# 6. 更新ConfigMap
kubectl edit configmap app-config
# 或
kubectl create configmap app-config --from-literal=DATABASE_URL=mysql://db:3306/prod --from-literal=DEBUG=true --dry-run=client -o yaml | kubectl apply -f -
# 7. 清理
kubectl delete pod app-pod
kubectl delete configmap app-config
kubectl delete secret app-secret
5.7 最佳实践和安全建议
💡 配置管理最佳实践
- 分离配置与代码:使用ConfigMap和Secret存储所有配置
- 按环境管理配置:为不同环境创建不同的配置
- 版本控制配置:将配置文件纳入版本控制系统
- 使用命名空间隔离:不同应用使用不同命名空间的配置
- 配置校验:确保配置的正确性和完整性
🔒 Secret安全最佳实践
- 使用外部密钥管理:生产环境使用Vault等专业工具
- 启用RBAC控制:限制Secret的访问权限
- 启用etcd加密:加密etcd中的Secret数据
- 定期轮换密钥:建立密钥轮换机制
- 避免在YAML中硬编码:使用文件或命令行创建Secret
- 使用PodSecurityContext:限制容器权限
5.8 进阶概念
🚀 外部配置管理
- HashiCorp Vault:专业的密钥管理系统,提供动态密钥、租约管理等功能
- AWS Secrets Manager:AWS提供的密钥管理服务
- Azure Key Vault:Azure提供的密钥管理服务
- Google Secret Manager:GCP提供的密钥管理服务
🔧 配置注入工具
- Helm:通过模板管理配置
- Kustomize:通过overlay管理不同环境的配置
- Flux/Argo CD:GitOps方式管理配置