K8S 之 ConfigMap

摘要

ConfigMap(别名cm) 介绍

  • ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。

  • 使用时, Pod 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。

  • ConfigMap 将你的环境配置信息和容器镜像解耦,便于应用配置的修改。

  • 多个 Pod 可以关联同一个 ConfigMap

ConfigMap 创建及使用

环境变量引用

  • yaml创建

1
2
3
4
5
6
7
8
9
# configmap.yaml
apiVersion: v1
kind: ConfigMap # ConfigMap
metadata:
name: myconfigmap # configmap 名称
data: # data 字段设计用来保存 UTF-8 字符串,最大值为 1M
username: k8s-admin # key: value
access_level: "1"
password: "123456"
  • 命令行创建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# key:value 方式创建
kubectl create configmap myconfigmap --from-literal=username=k8s-admin --from-literal=access_level=1 --from-literal=password=123456
# 文件方式创建
# --from-env-file=app.env 作用:将 app.env 中的每一行解析为 key=value,每一行变成 ConfigMap 中的一个键值对。
kubectl create configmap myconfigmap --from-env-file=app.env --from-env-file=other.env
# app.env 文件内容如下:
# username=k8s-admin
# access_level=1

# other.env 文件内容如下:
# password=123456

# 创建完成后,查看 ConfigMap 的内容
$ k get cm myconfigmap -oyaml
apiVersion: v1
data:
access_level: "1"
password: "123456"
username: k8s-admin
kind: ConfigMap
metadata:
creationTimestamp: "2025-07-05T10:29:15Z"
name: myconfigmap
namespace: default
resourceVersion: "723770"
uid: ee850cf9-9014-4be2-97d8-5d1840e78d54
  • 将 ConfigMap 中的全部数据作为环境变量使用

1
2
3
4
5
6
7
8
9
10
11
12
13
# pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: env-configmap
spec:
containers:
- name: app
command: ["/bin/sh", "-c", "printenv"] # 打印环境变量
image: busybox:latest
envFrom: # 环境变量引用文件、configMap,等等
- configMapRef: # 这里引用 ConfigMap,此处将 ConfigMap 中的全部数据作为环境变量使用
name: myconfigmap # configMap 名称
  • 将 ConfigMap 中的部分数据作为环境变量使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# pod2.yaml
apiVersion: v1
kind: Pod
metadata:
name: env-configmap2
spec:
containers:
- name: app
command: ["/bin/sh", "-c"]
args: # 容器启动命令
- |
echo "username: ${CONFIGMAP_USERNAME}"
echo "password: ${CONFIGMAP_PASSWORD}"
image: busybox:latest
env: # 环境变量配置,key: value 形式
- name: CONFIGMAP_USERNAME # 要在pod中配置的环境变量的 key
valueFrom: # value 来源
configMapKeyRef: # 引用 ConfigMap 中的 key
name: myconfigmap # configMap 名称
key: username # configMap 中 key 的名称
- name: CONFIGMAP_PASSWORD
valueFrom:
configMapKeyRef:
name: myconfigmap
key: password
  • 查看pod日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ kubectl logs pods/env-configmap
access_level=1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
HOSTNAME=env-configmap
SHLVL=1
username=k8s-admin
HOME=/root
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
password=123456
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/


$ kubectl logs pods/env-configmap2
username: k8s-admin
password: 123456

存储卷引用

  • yaml创建

1
2
3
4
5
6
7
8
9
10
11
12
# configmap-configfile.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
app.properties: | # 文件名称 ,使用 | 创建多行
server.port=8080
log.level=INFO
db.properties: | # 文件名称
db.host=localhost
db.port=5432
  • 命令行创建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 # 注意这里是 --from-file,作为文件配置,而非环境变量
kubectl create configmap app-config \
--from-file=app.properties \
--from-file=db.properties
# app.properties 文件内容如下:
# server.port=8080
# log.level=INFO

# db.properties 文件内容如下:
# db.host=localhost
# db.port=5432

$ k get cm app-config -oyaml
apiVersion: v1
data:
app.properties: |
server.port=8080
log.level=INFO
db.properties: |
db.host=localhost
db.port=5432
kind: ConfigMap
metadata:
creationTimestamp: "2025-07-05T10:49:00Z"
name: app-config
namespace: default
resourceVersion: "726507"
uid: 05c9a228-ec69-4e88-b8d8-63f97eff2651
  • Pod 挂载 ConfigMap 为文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# configmap-pod.yaml 文件内容如下:
apiVersion: v1
kind: Pod
metadata:
name: configmap-demo
spec:
containers:
- name: myapp
image: busybox
command: ["sleep", "3600"]
volumeMounts:
- name: config-volume
mountPath: /etc/config # 挂载路径
readOnly: true
volumes:
- name: config-volume # 存储卷 名称
configMap: # 存储卷类型为 ConfigMap
name: app-config # 挂载的 ConfigMap 名称,本利中将 configMap 中的全部文件都挂载到pod目录下
  • 容器内的 /etc/config/ 目录下会有两个文件:

1
2
3
4
5
/etc/config/app.properties
/etc/config/db.properties

$ k exec -it configmap-demo -- ls /etc/config/
app.properties db.properties
  • 如果只想挂载 ConfigMap 中的某些文件,可以通过 items 字段指定:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: v1
kind: Pod
metadata:
name: configmap-demo
spec:
containers:
- name: myapp
image: busybox
command: ["sleep", "3600"]
volumeMounts:
- name: config-volume
mountPath: /etc/config
readOnly: true
volumes:
- name: config-volume
configMap:
name: app-config
items: # 明确指定挂载的key
- key: app.properties # configMap中的key
path: app.properties # 映射到容器内的路径,最终挂载路径为 /etc/config/app.properties

后记

  • --from-env-file=app.env--from-file=app.env 的区别

项目 --from-env-file=app.env --from-file=app.env
用途 解析为环境变量形式键值对 按文件整体读入为内容
适合场景 想把每个变量都单独用掉 挂载为配置文件使用
data 结构 每一行变一个键值对 文件名为 key,内容为值
读取方式 envFrom 注入环境变量 volumeMount 挂载整个文件
  • ConfigMap 也支持 二进制 数据,但需要用 base64 编码

1
2
3
4
5
6
7
8
9
apiVersion: v1
kind: ConfigMap
metadata:
name: my-config
data:
config.txt: |
Hello, world!
binaryData:
config.bin: aGVsbG8gd29ybGQK # 这是 "hello world" 的 base64 编码

binaryData 和 data 的区别

字段 内容类型 编码方式 适合存储
data 文本(UTF-8) 明文 配置文件、参数、脚本等
binaryData 任意二进制数据 base64 编码 图片、证书、非UTF-8文件等

❗注意事项

项目 说明
base64 编码格式 binaryData 中的值必须是标准 base64,不支持换行
解码后大小限制 ConfigMap 单个对象最大 1MB(无论 data 还是 binaryData)
二者可共存 databinaryData 可以同时出现在同一个 ConfigMap 中(字段名不能重复)
  • 修改 ConfigMap 后 :k edit configmap <configmap-name>

    • 如果 Pod 是作为 环境变量 关联的,Pod 不会更新,只能重新创建
    • 如果 Pod 是作为 volume 挂载的,Pod 会自动更新(大约几秒后)
  • 删除 ConfigMap 后:k delete configmap <configmap-name>

Pod 状态 ConfigMap 删除后影响
正在运行 不受影响
重启 / 扩容 失败:找不到 ConfigMap,无法创建容器