ConfigMap & Secret 配置管理
ConfigMap
存储非敏感配置数据(配置文件、环境变量、命令行参数)。
yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
# 键值对
LOG_LEVEL: "info"
MAX_CONNECTIONS: "100"
# 完整配置文件
app.yaml: |
server:
port: 8080
timeout: 30s
database:
host: postgres-service
port: 5432
nginx.conf: |
server {
listen 80;
location / {
proxy_pass http://backend:8080;
}
}Secret
存储敏感数据,Base64 编码(注意:不是加密,需配合 etcd 加密或外部 Secret 管理)。
yaml
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
# Base64 编码:echo -n "mypassword" | base64
password: bXlwYXNzd29yZA==
username: YWRtaW4=
stringData: # 明文(自动 Base64 编码)
api-key: "sk-1234567890abcdef"Secret 类型
| 类型 | 用途 |
|---|---|
Opaque | 通用 Secret |
kubernetes.io/tls | TLS 证书 |
kubernetes.io/dockerconfigjson | 镜像仓库认证 |
kubernetes.io/service-account-token | ServiceAccount Token |
kubernetes.io/ssh-auth | SSH 认证 |
在 Pod 中使用
环境变量方式
yaml
spec:
containers:
- name: app
env:
# 单个键
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: app-config
key: LOG_LEVEL
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
# 全部键(批量注入)
envFrom:
- configMapRef:
name: app-config
- secretRef:
name: db-secretVolume 挂载方式(推荐配置文件)
yaml
spec:
containers:
- name: app
volumeMounts:
- name: config
mountPath: /etc/config
readOnly: true
- name: secret
mountPath: /etc/secret
readOnly: true
volumes:
- name: config
configMap:
name: app-config
items: # 只挂载指定键
- key: app.yaml
path: app.yaml
- name: secret
secret:
secretName: db-secret
defaultMode: 0400 # 权限设置热更新
Volume 挂载的 ConfigMap/Secret 会自动更新(约 1-2 分钟延迟),环境变量方式不会自动更新。
bash
# 更新 ConfigMap
kubectl create configmap app-config --from-file=app.yaml --dry-run=client -o yaml | kubectl apply -f -
# 强制 Pod 重启以获取新配置
kubectl rollout restart deployment/my-app生产最佳实践
bash
# 从文件创建
kubectl create configmap nginx-conf --from-file=nginx.conf
# 从目录创建(目录下所有文件)
kubectl create configmap app-configs --from-file=./configs/
# 从字面量创建
kubectl create secret generic db-secret \
--from-literal=username=admin \
--from-literal=password=mypassword
# 从文件创建 TLS Secret
kubectl create secret tls my-tls \
--cert=tls.crt \
--key=tls.key
# 镜像仓库认证
kubectl create secret docker-registry registry-secret \
--docker-server=registry.example.com \
--docker-username=user \
--docker-password=password外部 Secret 管理(生产推荐)
yaml
# External Secrets Operator 示例
# 从 AWS Secrets Manager 同步
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: db-secret
spec:
refreshInterval: 1h
secretStoreRef:
name: aws-secretsmanager
kind: ClusterSecretStore
target:
name: db-secret
data:
- secretKey: password
remoteRef:
key: prod/myapp/db
property: password