Skip to content

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 yaml

YAML 方式

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-config

Secret

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 yaml

YAML 方式

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-secret

ConfigMap vs Secret 对比

特性ConfigMapSecret
用途普通配置敏感数据
存储明文base64 编码
大小限制1MB1MB
挂载方式环境变量 / 文件环境变量 / 文件
热更新挂载为文件时自动更新挂载为文件时自动更新

下一步

05 - 完整实操:部署 Web 应用