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