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