一、 Kubernetes 配置管理 ConfigMap
1.1 前言
应用部署的一个最佳实践是将应用所需的配置信息与程序分离,这样可以使应用程序被更好地复用,通过不同的配置也能实现更灵活的功能。将应用打包为容器镜像后,可以通过环境变量或者外挂文件的方式在创建容器时进行配置注入,但在大规模容器集群的环境中,对多个容器进行不同的配置将变得非常复杂。
FROM nginx:1.24.0
COPY ./xxxx.conf /etc/nginx/conf.d
1.2 ConfigMap简介
官网:https://kubernetes.io/zh-cn/docs/concepts/configuration/configmap/
ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时, Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。ConfigMap 将你的环境配置信息和 容器镜像 解耦,便于应用配置的修改。
从 Kubernetes 1.2 开始提供了一种统一的应用配置管理方案— ConfigMap。 ConfigMap 具有命名空间隔离性!
1.3 ConfigMap 使用方式
- 生成容器内的环境变量。
- 以 Volume 的形式挂载为容器内部的文件或目录。
ConfigMap 以一个或多个 key:value 的形式保存在 Kubernetes 系统中供应用使用,既可以用于表示一个变量的值(例如 name=maoxiansheng ), 也可以用于表示一个完整配置文件的内容(例如 server.xml=<? xml...>... )。

1.4 ConfigMap 创建方式
1.4.1 基于目录的形式创建 ConfigMap
# Step 1:准备测试文件
$ vim test.conf
server {
listen 80;
server_name test.tanke.love;
location / {
root /data/test;
index index.html index.htm;
}
}
$ vim study.conf
server {
listen 80;
server_name study.tanke.love;
location / {
root /data/study;
index index.html index.htm;
}
}
# Step 2:基于目录的形式创建ConfigMap
$ kubectl create cm filedir --from-file=configmap/
# Step 3:查看ConfigMap资源
$ kubectl get cm filedir
# Step 4:查看创建ConfigMap资源清单
$ kubectl get cm filedir -oyaml

1.4.2 基于文件的形式创建 ConfigMap
# Step 1:通过文件形式创建(使用场景最多,声明变量多使用,少则使用命令行形式创建)
$ vim study.conf
server {
listen 80;
server_name study.tanke.love;
location / {
root /data/study;
index index.html index.htm;
}
}
$ kubectl create cm test-file-cm --from-file=study.conf (如果需要还可以继续添加--from-file=***)
# Step2:查看创建的ConfigMap资源清单
$ kubectl get cm test-file-cm -oyaml
# Step 3:创建ConfigMap时修改配置文件的名称(了解)
$ kubectl create cm test-file-cm --from-file=study.conf=default.conf
--from-file=env02.conf=env.conf 解析:--from-file=<新文件名称>=<源文件名称>
1.4.3 基于环境变量的形式创建 ConfigMap
# Step1:创建环境变量形式的ConfigMap
$ vim mysql-configmap.conf
MYSQL_ROOT_PASSWORD=root
MYSQL_USER=maoxiansheng
MYSQL_PASSWORD=maoxiansheng
# Step 2:创建ConfigMap资源
$ kubectl create cm mysql-env --from-env-file=mysql-configmap.conf
# Step 3:查看资源清单
$ kubectl get cm mysql-env -oyaml
apiVersion: v1
data:
MYSQL_PASSWORD: maoxiansheng
MYSQL_ROOT_PASSWORD: root
MYSQL_USER: maoxiansheng
kind: ConfigMap
metadata:
creationTimestamp: "2025-08-18T11:15:52Z"
name: mysql-env
namespace: default
resourceVersion: "404905"
uid: f9e0cce2-d317-495c-a6ad-46ea08d8f459
1.4.4 基于命令行的形式创建 ConfigMap
$ kubectl create cm mysql-cm --from-literal=MYSQL_ROOT_PASSWORD=root --from-literal=MYSQL_USER=maoxiansheng --from-literal=MYSQL_PASSWORD=maoxiansheng
1.5 ConfigMap 的资源使用
1.5.1 ConfigMap 少数变量配置
# Step 1:准备测试文件
$ vim mysql-env.conf
MYSQL_ROOT_PASSWORD=root
MYSQL_USER=maoxiansheng
MYSQL_PASSWORD=maoxiansheng
# Step 2:创建ConfigMap资源
$ kubectl create cm mysql-env --from-env-file=mysql-env.conf
# Step 3:创建资源清单
$ vim mysql-pod.yml
---
apiVersion: v1
kind: Pod
metadata:
name: mysql-pod
spec:
containers:
- name: mysql
image: m.daocloud.io/docker.io/mysql:8.0
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
configMapKeyRef:
name: mysql-env
key: MYSQL_ROOT_PASSWORD
- name: MYSQL_USER
valueFrom:
configMapKeyRef:
name: mysql-env
key: MYSQL_USER
- name: MYSQL_PASSWORD
valueFrom:
configMapKeyRef:
name: mysql-env
key: MYSQL_PASSWORD
- name: MYSQL_DATABASE
value: maoxiansheng
ports:
- containerPort: 3306
# Step 5:创建deploy资源
$ kubectl apply -f mysql-pod.yml
# Step 6:进入MySQL Pod
$ kubectl exec -it mysql-pod -- bash
# Step 7:登录MySQL
bash-5.1# mysql -uroot -proot

1.5.2 ConfigMap 多环境变量配置
场景:多个环境变量需要注入,直接性 ConfigMap 文件全部注入,使用较多。
# Step 1:创建资源清单
$ vim mysql-pods.yml
---
apiVersion: v1
kind: Pod
metadata:
name: mysql-pods
spec:
containers:
- name: mysql
image: m.daocloud.io/docker.io/mysql:8.0
envFrom: # 固定语法格式
- configMapRef: # 固定语法格式
name: mysql-env # configMap名称
# Step 2:创建资源
$ kubectl apply -f mysql-pods.yml
# Step 3:查看变量是否注入Pod中
$ kubectl exec mysql-pods -- env | grep MYSQL

提示:同一个 Configmap 资源可以被多个 Pod 挂载呦!
1.5.3 Prefix 参数使用(了解)
为方便区分环境变量是否是以 ConfigMap 形式注入 Pod 中,在 yaml 文件中添加prefix(场景较少)
# Step 1:准备测试文件
$ vim mysql-env.conf
ROOT_PASSWORD=root
USER=maoxiansheng
PASSWORD=maoxisheng
# Step 2:创建Configmap
$ kubectl create cm mysql-env --from-env-file=mysql-env.conf
# Step 3:创建资源清单
$ vim mysql-pods.yml
---
apiVersion: v1
kind: Pod
metadata:
name: mysql-pods
spec:
containers:
- name: mysql
image: m.daocloud.io/docker.io/mysql:8.0
envFrom: # 固定语法格式
- configMapRef: # 固定语法格式
name: mysql-env # configMap名称
# 添加如下参数
prefix: MYSQL_ # 名称自己拟定,相当于给变量名加一个前缀
# Step 4:创建资源
$ kubectl create -f mysql-pods.yml
# Step 5:查看容器内环境变量
$ kubectl exec mysql-pods -- env | grep MYSQL

1.5.4 ConfigMap 文件形式挂载
以配置文件形式挂在容器中,一个容器可以挂载多个 ConfigMap。但是挂载路径不能重复,容器启动时就会加载配置文件。
# Step 1:准备测试文件
$ vim default.conf
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
location /status {
stub_status on;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
# Step 2:创建ConfigMap资源
$ kubectl create cm nginx-conf --from-file=default.conf
# Step 3:查看ConfigMap资源清单内容
$ kubectl get cm nginx-conf -oyaml
# Step 4:创建nginx pod,并把cm挂载容器中
$ vim nginx-pods.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-pods
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/hujiaming/nginx:1.24.0
name: nginx
volumeMounts:
- name: nginxconf
mountPath: /etc/nginx/conf.d # 挂载路径
volumes:
- name: nginxconf
configMap:
name: nginx-conf # configMap名称
# Step 5:创建deploy资源
$ kubectl apply -f nginx-pods.yaml
# Step 6:查看Pod IP地址
$ kubectl get po -owide
nginx-pods 1/1 Running 0 14s 172.16.215.205 prod-k8s-master01 <none> <none>
# Step 7:测试
$ curl 172.16.215.205/status

当 ConfigMap 配置文件出现变动时,如果程序可以实现热加载功能,会定时自动加载挂载的 ConfigMap ;如果程序不实现热加载,配置文件变动则挂载的 ConfigMap 不会变动。
1.5.5 ConfigMap 的限制条件
- ConfigMap 必须在 Pod 之前创建,Pod 才能引用。
- 如果 Pod 使用 envFrom 基于 ConfigMap 定义环境变量,则无效的环境变量名称(例如名称以数字开头)将被忽略。
- ConfigMap 受命名空间限制,只有处于相同命名空间中的 Pod 才可以引用。
更多推荐



所有评论(0)