Kubernetes ConfigMap 基础:定义、创建方式与使用场景
ConfigMap 是 Kubernetes 中用于将非机密配置数据与 Pod 解耦的核心 API 对象。它允许你将环境变量、命令行参数或配置文件从容器镜像中分离出来,从而实现应用配置的集中管理和动态更新。本章将系统讲解 ConfigMap 的定义、创建方式以及三种主要使用场景,为后续理解热更新机制下的准入策略适配奠定基础。
2.1 ConfigMap 定义与核心概念
ConfigMap 本质上是一个键值对(key-value)存储对象,其数据字段可以包含简单的键值对,也可以包含文件内容。它属于 Kubernetes 控制平面的一部分,存储在 etcd 中,并通过 API Server 对外提供服务。
| 属性 | 说明 | 示例 |
|---|---|---|
| apiVersion | API 版本,当前稳定版为 v1 |
v1 |
| kind | 资源类型,固定为 ConfigMap |
ConfigMap |
| metadata.name | ConfigMap 名称,需符合 DNS 子域名规范 | app-config |
| data | 存储键值对,值必须为字符串(非二进制) | key: value |
| binaryData | 存储二进制数据,值需 Base64 编码 | key: base64string |
data 字段只能存储 UTF-8 字符串。如果需要存储二进制文件(如证书、密钥),必须使用 binaryData 字段,且 Pod 挂载时以二进制形式呈现。ConfigMap 的总大小受 etcd 限制(默认 1.5 MiB)。
2.2 ConfigMap 创建方式
Kubernetes 提供了两种创建 ConfigMap 的方式:命令行(kubectl) 和 YAML 声明式。两种方式本质相同,但适用场景不同。
2.2.1 命令行创建(kubectl create configmap)
命令行方式适合快速创建和测试,支持从字面量、文件、目录和 env 文件导入数据。
| 子命令 | 说明 | 示例 |
|---|---|---|
--from-literal |
从键值对字面量创建 | kubectl create configmap my-config --from-literal=key1=value1 --from-literal=key2=value2 |
--from-file |
从单个文件创建,文件名作为 key,文件内容作为 value | kubectl create configmap my-config --from-file=./app.properties |
--from-file(指定 key) |
从文件创建,自定义 key 名称 | kubectl create configmap my-config --from-file=my-key=./app.properties |
--from-env-file |
从 .env 格式文件创建,每行解析为 key=value | kubectl create configmap my-config --from-env-file=./.env |
--from-file(目录) |
从目录创建,目录下每个文件作为一个键值对 | kubectl create configmap my-config --from-file=./config-dir/ |
2.2.2 YAML 声明式创建
YAML 方式适合版本管理和 CI/CD 集成,是生产环境推荐的做法。以下是一个完整的 ConfigMap YAML 示例:
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
namespace: default
labels:
app: my-app
env: production
data:
# 简单键值对
APP_ENV: "production"
LOG_LEVEL: "info"
# 多行文本(配置文件内容)
nginx.conf: |
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend:8080;
}
}
# 从文件导入的配置(等价于 --from-file)
app.properties: |
database.url=jdbc:mysql://localhost:3306/mydb
database.user=admin
database.password=${DB_PASSWORD}
binaryData:
# 二进制数据(Base64 编码)
logo.png: "iVBORw0KGgoAAAANSUhEUgAA..."
2.3 ConfigMap 使用场景
ConfigMap 的数据可以通过三种方式注入到 Pod 中:环境变量、挂载卷 和 命令行参数。其中,环境变量和挂载卷是最常用的两种方式,也是热更新场景的核心关注点。
2.3.1 环境变量注入
通过 valueFrom.configMapKeyRef 字段,可以将 ConfigMap 中的指定键值对注入为 Pod 的环境变量。这种方式适合传递数据库连接字符串、日志级别、服务端口等简单配置。
apiVersion: v1
kind: Pod
metadata:
name: my-app-pod
spec:
containers:
- name: my-app
image: my-app:1.0
env:
# 方式1:直接引用 ConfigMap 中的某个 key
- name: APP_ENV
valueFrom:
configMapKeyRef:
name: app-config
key: APP_ENV
# 方式2:引用 ConfigMap 中的可选 key(如果 key 不存在则跳过)
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: app-config
key: LOG_LEVEL
optional: true
# 方式3:使用 envFrom 批量导入所有键值对
envFrom:
- configMapRef:
name: app-config
optional: true
2.3.2 挂载卷注入
将 ConfigMap 挂载为 Pod 的卷(Volume),是支持热更新的唯一方式。Kubernetes 会定期(默认 60 秒)同步 ConfigMap 数据到挂载卷中,容器内的文件内容会随之更新。
apiVersion: v1
kind: Pod
metadata:
name: my-app-pod
spec:
containers:
- name: my-app
image: my-app:1.0
volumeMounts:
# 方式1:挂载整个 ConfigMap(每个 key 生成一个文件)
- name: config-volume
mountPath: /etc/config
# 方式2:使用 subPath 挂载单个 key 为指定文件
- name: config-volume
mountPath: /etc/nginx/nginx.conf
subPath: nginx.conf
volumes:
- name: config-volume
configMap:
name: app-config
# 可选:指定需要挂载的 key,不指定则挂载所有
items:
- key: nginx.conf
path: nginx.conf
- key: app.properties
path: app.properties
# 可选:设置文件权限(默认 0644)
defaultMode: 0644
| 挂载方式 | 热更新支持 | 适用场景 | 注意事项 |
|---|---|---|---|
| 整个卷挂载 | ✅ 支持(自动同步) | 配置文件目录、多文件配置 | Kubelet 定期同步(默认 60s),存在短暂延迟 |
| subPath 挂载 | ❌ 不支持 | 单个配置文件挂载到指定路径 | subPath 挂载后不会自动更新,需重启 Pod |
| 环境变量 | ❌ 不支持 | 简单键值对、启动参数 | 仅在容器启动时读取一次 |
2.3.3 命令行参数注入
ConfigMap 的值还可以通过环境变量间接注入到容器的命令行参数中。这种方式本质上是环境变量注入的变体,同样不支持热更新。
apiVersion: v1
kind: Pod
metadata:
name: my-app-pod
spec:
containers:
- name: my-app
image: my-app:1.0
env:
- name: APP_ENV
valueFrom:
configMapKeyRef:
name: app-config
key: APP_ENV
# 在命令行中引用环境变量
command: ["/bin/sh"]
args: ["-c", "echo Running in $APP_ENV environment && ./start.sh"]
2.4 ConfigMap 使用对比总结
下表从多个维度对比三种使用方式,帮助你在实际场景中做出正确选择:
| 对比维度 | 环境变量 | 挂载卷(整个卷) | 挂载卷(subPath) | 命令行参数 |
|---|---|---|---|---|
| 热更新支持 | ❌ | ✅(有延迟) | ❌ | ❌ |
| 配置大小 | 小(< 1MB) | 中(< 1.5MB) | 中(< 1.5MB) | 小(< 1MB) |
| 配置复杂度 | 简单键值对 | 多文件、复杂配置 | 单文件挂载 | 简单键值对 |
| 应用适配成本 | 低(直接读取环境变量) | 中(需实现文件监听) | 低(直接读取文件) | 低(启动时解析) |
| 安全风险 | 中(环境变量可能泄露) | 低(文件权限可控) | 低(文件权限可控) | 中(进程列表可见) |
| 推荐场景 | 启动参数、简单标识 | 热更新配置文件 | 静态配置文件 | 启动命令参数 |