04 - ConfigMap 与 Secret
为什么需要配置管理?
将配置硬编码在镜像中有很多问题:
- 不同环境(dev/staging/prod)需要不同配置
- 修改配置需要重新构建镜像
- 敏感信息(密码、密钥)不应该写在代码里
K8s 用 ConfigMap 管理普通配置,用 Secret 管理敏感信息。
ConfigMap
创建方式
bash
# 从键值对创建
kubectl create configmap app-config \
--from-literal=DB_HOST=postgres \
--from-literal=DB_PORT=5432
# 从文件创建
kubectl create configmap nginx-conf --from-file=nginx.conf
# 从 env 文件创建
kubectl create configmap app-env --from-env-file=.env
# 查看
kubectl get configmap app-config -o yamlYAML 方式
yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
DB_HOST: postgres
DB_PORT: "5432"
APP_MODE: production
config.json: |
{
"log_level": "info",
"workers": 4
}在 Pod 中使用 ConfigMap
yaml
# 方式 1:注入为环境变量
spec:
containers:
- name: app
image: myapp
env:
- name: DATABASE_HOST
valueFrom:
configMapKeyRef:
name: app-config
key: DB_HOST
# 方式 2:注入所有键值对为环境变量
spec:
containers:
- name: app
image: myapp
envFrom:
- configMapRef:
name: app-config
# 方式 3:挂载为文件
spec:
containers:
- name: app
image: myapp
volumeMounts:
- name: config-vol
mountPath: /etc/config
volumes:
- name: config-vol
configMap:
name: app-configSecret
Secret 和 ConfigMap 类似,但用于存储敏感数据。数据以 base64 编码存储。
注意:base64 不是加密!Secret 默认只是编码。生产环境应启用加密(Encryption at Rest)。
创建方式
bash
# 从键值对创建
kubectl create secret generic db-secret \
--from-literal=username=admin \
--from-literal=password=s3cret!
# 从文件创建(如 TLS 证书)
kubectl create secret tls my-tls \
--cert=tls.crt --key=tls.key
# 查看(值是 base64 编码的)
kubectl get secret db-secret -o yamlYAML 方式
yaml
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
username: YWRtaW4= # echo -n "admin" | base64
password: czNjcmV0IQ== # echo -n "s3cret!" | base64
---
# 或者用 stringData(明文,K8s 会自动编码)
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
stringData:
username: admin
password: s3cret!在 Pod 中使用 Secret
yaml
spec:
containers:
- name: app
image: myapp
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
volumeMounts:
- name: secret-vol
mountPath: /etc/secrets
readOnly: true
volumes:
- name: secret-vol
secret:
secretName: db-secretConfigMap vs Secret 对比
| 特性 | ConfigMap | Secret |
|---|---|---|
| 用途 | 普通配置 | 敏感数据 |
| 存储 | 明文 | base64 编码 |
| 大小限制 | 1MB | 1MB |
| 挂载方式 | 环境变量 / 文件 | 环境变量 / 文件 |
| 热更新 | 挂载为文件时自动更新 | 挂载为文件时自动更新 |
