Kubernetes ConfigMap 与 Secret 完全解读:配置管理的正确打开方式

"我能不能不把配置写死在镜像里?"

"账号密码怎么注入 Pod 才算安全?"

"ConfigMap 和 Secret 到底啥区别?用错会出事吗?"

Kubernetes 提供了强大的配置与敏感信息管理机制,即 ConfigMap 和 Secret。学会用它们,不仅能让你的部署更灵活、安全,还能让微服务真正实现"配置即服务"。


为什么需要配置中心?

在传统部署中,配置通常硬编码进代码或写死在镜像里,这带来诸多问题:

  • 修改配置必须重构镜像或重启服务
  • 无法在不同环境中复用相同镜像
  • 敏感信息(如数据库密码)容易泄露
  • 难以实现 DevOps 所需的"配置解耦"

Kubernetes 通过 ConfigMap 和 Secret 实现了:

配置与代码分离

动态加载配置

安全地传递敏感信息


ConfigMap:管理普通配置信息

ConfigMap 用于存储非敏感的配置信息,如:

  • 应用的参数设置
  • 环境变量配置
  • 配置文件内容

创建 ConfigMap 的三种方式:

1. 从文件创建

bash 复制代码
kubectl create configmap app-config --from-file=./app.properties

2. 从字面值创建

bash 复制代码
kubectl create configmap app-config --from-literal=ENV=prod --from-literal=VERSION=1.2.3

3. 使用 YAML 配置

yaml 复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  ENV: "prod"
  VERSION: "1.2.3"
  config.yaml: |
    port: 8080
    logLevel: info

使用 ConfigMap 的四种方式

1. 注入为环境变量

yaml 复制代码
envFrom:
  - configMapRef:
      name: app-config

2. 注入为单个变量

yaml 复制代码
env:
  - name: APP_ENV
    valueFrom:
      configMapKeyRef:
        name: app-config
        key: ENV

3. 挂载为文件(适合配置文件)

yaml 复制代码
volumeMounts:
  - name: config-volume
    mountPath: /etc/config
volumes:
  - name: config-volume
    configMap:
      name: app-config

4. 热更新(需结合 subPath 使用或应用自身支持 reload)

注意:ConfigMap 挂载为文件后,默认更新不生效,除非应用主动 watch 文件或使用第三方控制器(如 Reloader)。


Secret:管理敏感配置信息

Secret 用于存储敏感信息,如:

  • 数据库账号密码
  • JWT 签名密钥
  • TLS 证书与私钥

创建 Secret 的三种方式:

1. 从字面值(需 base64 编码)

yaml 复制代码
kubectl create secret generic db-secret \
  --from-literal=username=admin \
  --from-literal=password=123456

2. 使用 YAML 编写(注意 base64 编码)

yaml 复制代码
apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
data:
  username: YWRtaW4=      # admin
  password: MTIzNDU2      # 123456

3. TLS 类型 Secret(自动编码)

bash 复制代码
kubectl create secret tls tls-secret \
  --cert=./tls.crt \
  --key=./tls.key

使用 Secret 的三种方式

1. 注入为环境变量

yaml 复制代码
env:
  - name: DB_USER
    valueFrom:
      secretKeyRef:
        name: db-secret
        key: username

2. 挂载为文件

yaml 复制代码
volumeMounts:
  - name: secret-volume
    mountPath: /etc/secret
volumes:
  - name: secret-volume
    secret:
      secretName: db-secret

3. 使用 ServiceAccount 绑定 ImagePullSecret(用于拉取私有镜像)


⚔️ ConfigMap vs Secret 核心对比

特性 ConfigMap Secret
存储类型 明文 base64 编码(并非加密)
用途 一般配置信息 敏感信息(密码、证书)
挂载方式 环境变量、文件 环境变量、文件
加密支持 ❌ 默认无加密 ✅ 可结合加密机制(如 KMS)
安全性 高(但仍建议配合 RBAC)

实战案例:配置数据库连接信息

yaml 复制代码
apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
data:
  username: YWRtaW4=
  password: MTIzNDU2

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app
  template:
    metadata:
      labels:
        app: app
    spec:
      containers:
        - name: app
          image: my-app:v1
          env:
            - name: DB_USER
              valueFrom:
                secretKeyRef:
                  name: db-secret
                  key: username
            - name: DB_PASS
              valueFrom:
                secretKeyRef:
                  name: db-secret
                  key: password

Secret 的安全最佳实践

✅ 开启 Kubernetes API Server 的加密存储(EncryptionConfiguration)

✅ 使用 RBAC 限制访问 Secret 的权限✅ 定期轮换密钥与 Secret✅ 使用 External Secrets 工具(如 External Secrets Operator)接入云上密钥管理系统(AWS Secrets Manager、Vault 等)


配置加载流程


总结:ConfigMap 与 Secret 不是选一个,而是一起用!

  • ✅ 配置文件统一管理?用 ConfigMap
  • ✅ 数据库密码传入?用 Secret
  • ✅ 不想改代码就能换配置?挂载 + 环境变量是关键
  • ✅ 想安全地管理密钥?配合 RBAC + 加密 + 密钥轮换
相关推荐
EmpressBoost36 分钟前
docker run elasticsearch 报错
elasticsearch·docker·容器
x,,xx1114 小时前
近期学习总结
运维·docker·容器
i小溪4 小时前
如何通过docker容器反查容器和宿主机的挂载目录?
docker·容器
Spring-wind5 小时前
【docker】将本地镜像打包部署到服务器上
服务器·docker·容器
老兵发新帖5 小时前
Traefik 中实现流量治理3种方式和场景选择
云原生
澜兮子7 小时前
k8s-高级调度(二)
云原生·容器·kubernetes
IT成长日记12 小时前
【Docker基础】Dockerfile多阶段构建:Multi-stage Builds详解
运维·docker·容器·multi-stage·builds
BUTCHER518 小时前
Docker镜像使用
java·docker·容器
一只 Lemon18 小时前
K8s存储系统(通俗易懂版)
云原生·容器·kubernetes