ConfigMap 基础回顾:定义、创建方式与 Pod 关联

ConfigMap 是 Kubernetes 中用于将非机密性配置数据与容器镜像解耦的核心 API 对象。在集群升级场景中,镜像仓库地址、镜像标签、拉取策略等配置常通过 ConfigMap 管理,升级时只需修改 ConfigMap 而无需重建镜像。本节从定义、创建方式、Pod 关联三个维度系统回顾 ConfigMap 的基础知识。

2.1 ConfigMap 定义与数据结构

ConfigMap 本质上是一个键值对(key-value)存储对象,支持存储单个键值对、多行文本以及二进制文件(通过 base64 编码)。其核心字段如下:

字段 类型 说明 示例
apiVersion string API 版本,通常为 v1 v1
kind string 资源类型,固定为 ConfigMap ConfigMap
metadata.name string ConfigMap 名称,需符合 DNS-1123 子域名规范 image-config
data map[string]string 存储键值对,值直接为字符串 registry: "harbor.example.com"
binaryData map[string]string 存储二进制文件(base64 编码),大小限制 1MB cert.crt: "LS0t..."
升级场景提示: 在集群升级中,data 字段常用于存储镜像仓库地址、镜像标签、拉取策略等配置。升级时只需更新 ConfigMap 的 data 内容,Pod 滚动更新后即可生效,无需重新构建镜像。

2.2 ConfigMap 创建方式

Kubernetes 提供两种主流创建方式:命令式(kubectl create) 和 声明式(YAML 文件)。以下分别说明。

2.2.1 使用 kubectl create configmap 命令式创建

适用于快速从字面量、文件或目录生成 ConfigMap:

# 从字面量创建
kubectl create configmap image-config \
  --from-literal=registry=harbor.example.com \
  --from-literal=tag=v1.2.3 \
  --from-literal=pullPolicy=Always

# 从文件创建(文件内容作为 value,文件名作为 key)
kubectl create configmap app-config \
  --from-file=./application.properties

# 从目录创建(目录下每个文件作为一个 key-value)
kubectl create configmap dir-config \
  --from-file=./config-dir/

2.2.2 使用 YAML 声明式创建

声明式方式更适合版本管理和 CI/CD 集成,是生产环境推荐做法:

apiVersion: v1
kind: ConfigMap
metadata:
  name: image-config
  namespace: production
data:
  registry: "harbor.example.com"
  tag: "v1.2.3"
  pullPolicy: "Always"
  # 多行文本示例
  docker-config.json: |
    {
      "auths": {
        "harbor.example.com": {
          "auth": "base64encoded=="
        }
      }
    }
最佳实践: 集群升级时,建议将 ConfigMap YAML 纳入 Git 仓库管理,配合 Kustomize 或 Helm 进行环境差异化配置。升级前通过 kubectl diff 对比新旧 ConfigMap 差异,避免配置漂移。

2.3 ConfigMap 与 Pod 的关联方式

Pod 通过两种方式消费 ConfigMap 数据:环境变量 和 卷挂载。两种方式在升级场景中的行为差异显著,需根据配置类型选择。

2.3.1 环境变量方式

将 ConfigMap 中的键值对注入为 Pod 容器的环境变量。Pod 启动后,环境变量值固定,ConfigMap 更新后不会自动同步到运行中的 Pod。

apiVersion: v1
kind: Pod
metadata:
  name: app-pod
spec:
  containers:
  - name: app
    image: nginx:1.25
    env:
    - name: REGISTRY
      valueFrom:
        configMapKeyRef:
          name: image-config
          key: registry
    - name: IMAGE_TAG
      valueFrom:
        configMapKeyRef:
          name: image-config
          key: tag

2.3.2 卷挂载方式

将 ConfigMap 挂载为 Pod 内的文件系统。Kubelet 会定期同步(默认 60 秒)ConfigMap 更新到挂载的文件中,Pod 内应用可通过文件内容变化感知配置变更。

apiVersion: v1
kind: Pod
metadata:
  name: app-pod-volume
spec:
  containers:
  - name: app
    image: nginx:1.25
    volumeMounts:
    - name: config-volume
      mountPath: /etc/config
      readOnly: true
  volumes:
  - name: config-volume
    configMap:
      name: image-config
      items:
      - key: registry
        path: registry.txt
      - key: tag
        path: tag.txt
升级注意事项: 环境变量方式在 ConfigMap 更新后需要重启 Pod 才能生效;卷挂载方式虽然支持自动同步,但应用本身需要实现文件变化监听(如 inotify)或通过 sidecar 容器触发 reload。集群升级时,建议对镜像配置使用卷挂载 + 滚动更新策略,确保配置变更平滑生效。

2.4 两种关联方式对比

对比维度 环境变量方式 卷挂载方式
配置更新后 Pod 行为 需重启 Pod 才能生效 Kubelet 定期同步,文件自动更新
应用感知方式 启动时读取,运行中不变 需监听文件变化或主动重读
适用配置类型 启动参数、固定标识 动态配置、证书、多行文本
升级场景推荐度 低(需手动触发 Pod 重建) 高(配合滚动更新自动生效)
性能开销 无额外开销 少量 inode 和内存开销

2.5 ConfigMap 与 Pod 关联架构图

下图展示了 ConfigMap 通过环境变量和卷挂载两种方式与 Pod 关联的完整数据流:

ConfigMap 与 Pod 关联架构图 ConfigMap image-config 环境变量注入 env.valueFrom.configMapKeyRef Pod 容器 REGISTRY=harbor.example.com IMAGE_TAG=v1.2.3 卷挂载注入 volumeMounts + configMap Pod 容器文件系统 /etc/config/registry.txt /etc/config/tag.txt 环境变量方式:ConfigMap 更新后需重启 Pod 生效 卷挂载方式:Kubelet 定期同步,文件自动更新(默认 60s)

2.6 升级场景中的 ConfigMap 设计原则

  • 单一职责: 每个 ConfigMap 只管理一类配置(如镜像配置、日志配置、网络配置),避免“大而全”导致升级时误改。
  • 版本化命名: 使用 image-config-v1、image-config-v2 等命名,升级时创建新版本 ConfigMap,Pod 逐步引用新版本,实现灰度切换。
  • 不可变 ConfigMap: 对于升级后不再变更的配置,设置 immutable: true,避免运行时意外修改,同时减轻 API Server 压力。
  • 优先卷挂载: 镜像仓库地址、拉取凭证等配置推荐使用卷挂载方式,配合 reload 容器或应用热加载机制,实现配置变更零停机。
课程关联: 本章回顾了 ConfigMap 的基础概念和 Pod 关联方式。在后续章节中,我们将基于这些知识,深入讲解集群升级时如何设计 ConfigMap 的镜像配置结构、如何通过 Helm 或 Kustomize 管理多环境配置差异,以及如何实现配置变更的自动化验证和回滚。