Learn
Kubernetes/08-configmap-secret

配置与密钥

把配置写死在镜像里是反模式——换个环境就得重新打包。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: 8080

2. 注入为环境变量

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_LEVEL

3. 挂载为文件

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 处理持久化存储 →