Skip to content

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/tlsTLS 证书
kubernetes.io/dockerconfigjson镜像仓库认证
kubernetes.io/service-account-tokenServiceAccount Token
kubernetes.io/ssh-authSSH 认证

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

Volume 挂载方式(推荐配置文件)

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

本站内容由 褚成志 整理编写,仅供学习参考