在 Kubernetes 集群中,硬编码配置是运维的 “噩梦”—— 修改配置需重新构建镜像、重启容器,不仅效率低,还易引发配置泄露风险。ConfigMap 作为 K8s 核心资源之一,专为解耦 “应用代码” 与 “配置信息” 而生,是实现配置动态管理、环境隔离的关键工具。本文将从核心概念、实操用法到最佳实践,全面讲解 ConfigMap 的使用方式。

一、ConfigMap 核心概念

1. 什么是 ConfigMap?

ConfigMap 是 K8s 提供的一种配置存储资源,用于存储非敏感的键值对配置(如配置文件、环境变量、命令行参数等),可被 Pod 以多种方式挂载使用。其核心价值在于:

  • 配置与镜像解耦:无需修改镜像即可调整应用配置;
  • 环境隔离:为开发、测试、生产环境配置不同的 ConfigMap;
  • 易维护:集中管理配置,修改后可快速同步到关联 Pod(视挂载方式而定)。

2. 与 Secret 的区别

很多同学会混淆 ConfigMap 和 Secret,核心差异如下:

特性ConfigMapSecret
存储内容非敏感配置(如数据库地址、端口)敏感配置(如密码、token)
存储方式明文存储(默认)Base64 编码存储
安全级别普通更高(支持加密、权限控制)

二、ConfigMap 实操:从创建到使用

1. 创建 ConfigMap

ConfigMap 支持多种创建方式,最常用的是 yaml 文件创建命令行直接创建

方式 1:通过 yaml 文件创建

创建 app-config.yaml 文件,定义键值对配置:

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config  # ConfigMap 名称
  namespace: default # 所属命名空间
data:
  # 方式1:简单键值对(适合单个配置项)
  app.env: "prod"
  db.port: "3306"
  db.host: "mysql-service.default.svc.cluster.local"
  # 方式2:完整配置文件(适合多行配置)
  app.properties: |
    server.port=8080
    logging.level.root=INFO
    spring.datasource.url=jdbc:mysql://${db.host}:${db.port}/test

执行创建命令:

kubectl apply -f app-config.yaml
方式 2:命令行直接创建

适合快速创建简单配置:

# 创建键值对形式的 ConfigMap
kubectl create configmap app-config-cli --from-literal=app.env=test --from-literal=db.port=3307
# 从本地文件创建(适合已有配置文件)
kubectl create configmap app-config-file --from-file=./app.properties

2. 查看 ConfigMap

创建后可通过以下命令验证:

# 查看所有 ConfigMap
kubectl get configmaps
# 查看指定 ConfigMap 详情
kubectl describe configmap app-config
# 导出 ConfigMap 为 yaml 文件
kubectl get configmap app-config -o yaml > app-config-export.yaml

3. Pod 挂载 ConfigMap 的 3 种方式

方式 1:作为环境变量挂载

适合单个、零散的配置项(如数据库地址、端口):

apiVersion: v1
kind: Pod
metadata:
  name: configmap-env-pod
spec:
  containers:
  - name: app-container
    image: nginx:alpine
    env:
      # 直接引用 ConfigMap 的单个键值对
      - name: APP_ENV
        valueFrom:
          configMapKeyRef:
            name: app-config  # 关联的 ConfigMap 名称
            key: app.env      # 要引用的键
      - name: DB_PORT
        valueFrom:
          configMapKeyRef:
            name: app-config
            key: db.port
    # 可选:批量挂载所有键值对为环境变量
    envFrom:
    - configMapRef:
        name: app-config
方式 2:作为文件挂载到容器目录

适合完整的配置文件(如 app.propertiesnginx.conf):

apiVersion: v1
kind: Pod
metadata:
  name: configmap-file-pod
spec:
  containers:
  - name: app-container
    image: nginx:alpine
    volumeMounts:
    - name: config-volume  # 关联下面的 volume 名称
      mountPath: /etc/app  # 挂载到容器内的目录
      readOnly: true       # 配置文件建议设为只读
  volumes:
  - name: config-volume
    configMap:
      name: app-config     # 关联的 ConfigMap 名称
      # 可选:指定要挂载的配置文件(不指定则挂载所有)
      items:
      - key: app.properties
        path: app.properties  # 挂载后的文件名

挂载后,容器内 /etc/app/app.properties 文件会自动同步 ConfigMap 中的内容,可通过 cat /etc/app/app.properties 查看。

方式 3:作为命令行参数挂载

通过环境变量间接传递 ConfigMap 配置到容器启动命令:

apiVersion: v1
kind: Pod
metadata:
  name: configmap-args-pod
spec:
  containers:
  - name: app-container
    image: busybox
    env:
    - name: DB_HOST
      valueFrom:
        configMapKeyRef:
          name: app-config
          key: db.host
    # 启动命令引用环境变量(即 ConfigMap 配置)
    command: ["/bin/sh", "-c", "echo '数据库地址:$DB_HOST' && sleep 3600"]

三、ConfigMap 核心注意事项

1. 配置更新后的同步问题

  • 环境变量挂载:ConfigMap 修改后,Pod 内的环境变量不会自动更新,需重启 Pod 才能生效;
  • 文件挂载:ConfigMap 修改后,K8s 会自动更新容器内的挂载文件(通常延迟几秒),但应用需支持 “热加载配置” 才能感知(如 Nginx 需执行 nginx -s reload,Java 应用可通过配置中心监听)。

2. 命名空间限制

ConfigMap 是命名空间级资源,Pod 只能挂载同一命名空间下的 ConfigMap;跨命名空间需通过 Service 或自定义控制器实现。

3. 大小限制

ConfigMap 单条数据最大支持 1MiB,不适合存储大文件(如日志、二进制文件),大配置建议用 PersistentVolume 存储。

4. 权限控制

建议为 ConfigMap 设置 RBAC 权限,限制非授权用户修改;避免将敏感配置存入 ConfigMap(改用 Secret)。

四、最佳实践

  1. 按环境拆分 ConfigMap:为 dev/test/prod 环境分别创建 app-config-devapp-config-testapp-config-prod,避免配置混用;
  2. 配置分层:将通用配置(如数据库端口)和环境专属配置(如数据库地址)拆分为不同 ConfigMap,Pod 按需挂载;
  3. 版本化管理:将 ConfigMap 的 yaml 文件纳入 Git 版本控制,便于追溯配置变更;
  4. 避免空配置:创建 ConfigMap 时确保至少有一个 data 键值对,否则 Pod 挂载会失败;
  5. 结合 ConfigMapReloader:对于不支持热加载的应用,可使用 configmap-reload 工具,监听配置变更后自动重启应用。

五、总结

ConfigMap 是 K8s 配置管理的核心工具,通过解耦应用与配置,大幅提升了配置管理的灵活性和可维护性。使用时需注意:

  1. 非敏感配置用 ConfigMap,敏感配置用 Secret;
  2. 根据配置类型选择挂载方式(环境变量 / 文件 / 命令行参数);
  3. 配置更新后,文件挂载可自动同步,环境变量需重启 Pod;
  4. 按环境、功能拆分 ConfigMap,遵循 “最小权限” 和 “版本化” 原则。

掌握 ConfigMap 的正确用法,能有效降低 K8s 集群的运维成本,让配置管理更规范、更高效。


关键点回顾

  1. 核心价值:解耦应用代码与配置,实现配置动态管理、环境隔离;
  2. 核心用法:支持 yaml / 命令行创建,Pod 可通过环境变量、文件、命令行参数 3 种方式挂载;
  3. 注意事项:配置更新同步规则(文件自动更、环境变量需重启)、命名空间限制、不存敏感配置。

更多推荐