3. ConfigMap 基础:作用、创建方式与 Secret 区别

ConfigMap 是 Kubernetes 中用于将非机密性配置数据与容器镜像解耦的核心 API 对象。在镜像拉取加速场景中,ConfigMap 常用来存储镜像仓库的 endpoint、加速器地址、拉取并发数、重试策略等运行时参数,使得同一份镜像无需重新构建即可适配不同环境。

3.1 ConfigMap 的核心作用

  • 环境隔离:开发、测试、生产环境使用同一镜像,通过 ConfigMap 注入不同的配置值。
  • 配置热更新:挂载为卷或环境变量的 ConfigMap 更新后,Pod 内应用可感知变化(需应用支持重载)。
  • 镜像拉取参数管理:存储 registry-mirrors、max-concurrent-downloads、max-concurrent-uploads 等 dockerd/containerd 配置片段。
  • 多组件共享:同一 ConfigMap 可被多个 Deployment、DaemonSet 引用,避免重复定义。
💡 镜像加速场景提示:将加速器地址(如 https://mirror.example.com)写入 ConfigMap,通过 Volume 挂载到 /etc/containerd/config.d/ 目录,即可实现节点级镜像拉取加速,无需修改基础镜像。

3.2 ConfigMap 的三种创建方式

Kubernetes 提供 kubectl create configmap 命令,支持从字面量、文件、目录三种来源创建 ConfigMap。以下逐一说明。

3.2.1 字面量创建(--from-literal)

适用于少量键值对,直接在命令行指定。

kubectl create configmap mirror-config \
  --from-literal=registry-mirror=https://mirror.example.com \
  --from-literal=max-concurrent-downloads=5 \
  --from-literal=insecure-registries=192.168.1.100:5000

3.2.2 文件创建(--from-file)

将单个文件内容作为 ConfigMap 的一个条目,文件名作为 key,文件内容作为 value。适合存储配置文件片段。

# 准备配置文件
cat > registry-mirrors.toml << EOF
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
  endpoint = ["https://mirror.example.com"]
EOF

# 创建 ConfigMap
kubectl create configmap containerd-mirror \
  --from-file=registry-mirrors.toml

3.2.3 目录创建(--from-file 指定目录)

将目录下所有文件分别作为 ConfigMap 的条目,每个文件名对应一个 key。适合批量导入多个配置片段。

# 准备目录结构
mkdir -p ./mirror-configs
cat > ./mirror-configs/docker.io.toml << EOF
endpoint = ["https://mirror.example.com"]
EOF
cat > ./mirror-configs/gcr.io.toml << EOF
endpoint = ["https://gcr.mirror.example.com"]
EOF

# 创建 ConfigMap
kubectl create configmap multi-mirror \
  --from-file=./mirror-configs/
📌 创建方式对比:字面量适合少量参数;文件适合单个完整配置;目录适合批量导入。生产环境推荐将配置片段以文件形式管理,便于版本控制。

3.3 ConfigMap 与 Secret 的区别

ConfigMap 和 Secret 都是 Kubernetes 的配置注入机制,但存在关键差异。下表从多个维度进行对比。

对比维度 ConfigMap Secret
数据性质 非机密性配置(明文) 机密性数据(密码、、证书)
存储编码 明文 UTF-8 字符串 Base64 编码(etcd 中可加密)
大小限制 1 MiB(etcd 默认限制) 1 MiB(etcd 默认限制)
支持的数据源 字面量、文件、目录 字面量、文件、目录、docker-registry、generic、tls
挂载方式 环境变量 / Volume 挂载 环境变量 / Volume 挂载(支持 subPath)
热更新感知 Volume 挂载支持(需应用监听文件变化) Volume 挂载支持(需应用监听文件变化)
适用场景 应用配置、镜像加速参数、日志级别 数据库密码、API 、TLS 证书
⚠️ 安全提醒:切勿将密码、私钥等敏感信息存入 ConfigMap。ConfigMap 数据以明文存储,任何具有 etcd 访问权限或 kubectl get configmap 权限的用户均可读取。敏感数据必须使用 Secret 或外部密钥管理服务(如 Vault)。

3.4 ConfigMap 与 Secret 的架构关系

下图展示了 ConfigMap 和 Secret 在 Kubernetes 配置体系中的位置,以及它们与 Pod、etcd、kube-apiserver 的交互关系。

ConfigMap 与 Secret 架构关系图 kube-apiserver etcd(存储后端) ConfigMap 创建方式 --from-literal(字面量) --from-file(文件) --from-file(目录) Secret 创建方式 --from-literal / --from-file --from-file(目录) docker-registry / tls / generic Pod 使用 ConfigMap env / envFrom / volumeMounts Pod 使用 Secret env / envFrom / volumeMounts / subPath ConfigMap 存储非敏感配置(明文),Secret 存储敏感数据(Base64 / 加密) 两者均通过 kube-apiserver 写入 etcd,Pod 通过环境变量或卷挂载消费

3.5 镜像拉取加速场景中的选择建议

  • 镜像仓库地址、加速器 endpoint、拉取并发数 → 使用 ConfigMap,因为这些属于非敏感运行时配置。
  • 私有仓库的认证信息(用户名/密码/) → 使用 Secret(类型 kubernetes.io/dockerconfigjson),通过 imagePullSecrets 引用。
  • TLS 证书(自签名仓库) → 使用 Secret(类型 kubernetes.io/tls),挂载到 containerd 证书目录。
  • 混合场景:ConfigMap 存储配置,Secret 存储凭证,两者配合使用实现完整的镜像拉取加速方案。