配置与密钥
把配置写死在镜像里是反模式——换个环境就得重新打包。Kubernetes 提供两个对象把"配置"和"代码"解耦:
- ConfigMap:存非敏感配置(如配置文件、命令行参数)
- Secret:存敏感信息(如密码、token、证书),默认以 base64 编码存储
⚠️Secret 不是加密!
Secret 只是把值做了 base64 编码,默认不加密存储(etcd 里是明文 base64)。真正的加密需要开启静态加密或借助外部密钥管理(如 Vault)。
1. 创建 ConfigMap
# 从字面量创建
kubectl create configmap app-config \
--from-literal=LOG_LEVEL=info \
--from-literal=PORT=8080
# 从文件创建(键名=文件名)
kubectl create configmap app-config --from-file=app.yaml等价的 YAML:
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
LOG_LEVEL: "info"
PORT: "8080"
app.yaml: |
server:
port: 80802. 注入为环境变量
spec:
containers:
- name: app
image: myapp:1.0
envFrom:
- configMapRef:
name: app-config # 把 ConfigMap 的所有键注入为环境变量也可只引用单个键:
env:
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: app-config
key: LOG_LEVEL3. 挂载为文件
spec:
containers:
- name: app
image: myapp:1.0
volumeMounts:
- name: cfg
mountPath: /etc/app # 目录里会出现 app.yaml 等文件
volumes:
- name: cfg
configMap:
name: app-config💡挂载后还能热更新
以文件方式挂载的 ConfigMap,内容更新后(再次 apply)会在容器内自动刷新(稍延迟)。环境变量方式则需重建 Pod 才生效。
4. 创建 Secret
# 从字面量(值会被 base64 编码)
kubectl create secret generic db-secret \
--from-literal=username=admin \
--from-literal=password='S3cr3t!'apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
username: YWRtaW4= # echo -n admin | base64
password: UzNjcjN0IQ==5. 在 Pod 中使用 Secret
spec:
containers:
- name: app
image: myapp:1.0
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password⚠️不要把 Secret 提交进 Git
Secret 的 YAML 里是 base64,任何人都能解码。请勿把含真实密码的 YAML 提交到代码仓库,应使用外部密钥管理或 .gitignore 排除。
小结
- ConfigMap 存普通配置,Secret 存敏感信息(仅 base64,非加密)
- 两种注入方式:环境变量(需重建)和文件挂载(可热更新)
- 配置与代码解耦,换环境只改 ConfigMap/Secret
- 下一章用 Volume/PV/PVC 处理持久化存储 →