【Kubernetes专项】K8s 配置管理中心 ConfigMap 实现微服务配置管理

作者:.Kaser.日期:2026/2/9

十六、K8s 配置管理中心 ConfigMap 实现微服务配置管理

16.1 ConfigMap 相关概念及cm字段

16.1.1 ConfigMap 概述

​ Configmap 是 k8s 中的资源对象,用于保存非机密性的配置的,数据可以用 key/value键值对 的形式保存,也可通过 文件 的形式保存。

  1. Configmap 是 k8s 中的资源, 相当于配置文件,可以有一个或者多个 Configmap;
  2. Configmap 可以做成 Volume,k8s pod 启动之后,通过 volume 形式映射到容器内部指定目录上;
  3. 容器中应用程序按照原有方式读取容器特定目录上的配置文件;
  4. 在容器看来,配置文件就像是打包在容器内部特定目录,整个过程对应用没有任何侵入。

configmap 注入方式有两种:

  • 第一种:将 configMap 做为存储卷;
  • 第二种:将 configMap 通过 env字段 中 configMapKeyRef变量 注入到容器中。
16.1.2 ConfigMap 能解决什么问题?

​ 我们在部署服务的时候,每个服务都有自己的配置文件,如果一台服务器上部署多个服务:nginx、tomcat、apache等,那么这些配置都存在这个节点上,假如一台服务器不能满足线上高并发的要求,需要对服务器扩容,扩容之后的服务器还是需要部署多个服务:nginx、tomcat、apache,新增加的服务器上还是要管理这些服务的配置,如果有一个服务出现问题,需要修改配置文件,每台物理节点上的配置都需要修改,这种方式肯定满足不了线上大批量的配置变更要求。 所以,k8s 中引入了 Configmap 资源对象,可以当成 volume 挂载到 pod中,实现统一的配置管理。

16.1.3 ConfigMap 应用场景
16.1.3.1 场景1-部署应用

​ 使用 k8s 部署应用,当你将应用配置写进代码中,更新配置时也需要打包镜像,configmap 可以将配置信息和 docker镜像 解耦,以便实现镜像的可移植性和可复用性,因为一个 configMap 其实就是一系列配置信息的集合,可直接注入到 Pod 中给容器使用。

16.1.3.2 场景2-使用微服务架构

​ 使用微服务架构的话,存在多个服务共用配置的情况,如果每个服务中单独一份配置的话,那么更新配置就很麻烦,使用configmap 可以友好的进行配置共享。

16.1.4 ConfigMap 局限性

​ ConfigMap 在设计上不是用来保存大量数据的。在 ConfigMap 中保存的数据不可超过 1 MiB。如果你需要保存超出此尺寸限制的数据,可以考虑挂载存储卷或者使用独立的数据库或者文件服务。

16.1.5 cm字段
1]# kubectl explain cm
2  apiVersion    <string>
3  kind  <string>
4  metadata      <ObjectMeta>
5  
6  data  <map[string]string>  
7  # 以键值对的形式存储非二进制配置数据(适用于普通文本配置)
8  
9  binaryData    <map[string]string>
10  #	以Base64编码的形式存储二进制数据(适用于图片、证书等非文本文件) 
11
12  immutable		<boolean>
13  #  ConfigMap 标记为不可变,默认为 true,反之为 false
14  
15# [`data`](https://xplanc.org/primers/document/zh/03.HTML/EX.HTML%20%E5%85%83%E7%B4%A0/EX.data.md) `binaryData`两者不可包含相同的键名,否则创建时会报错
16

16.2 ConfigMap 创建方式

16.2.1 方式1:命令行直接创建
1[root@k8s-master1 ~]# kubectl create configmap tomcat-cm --from-literal=tomcat_port=8080 --from-literal=server_name=tomcat
2
3[root@k8s-master1 ~]# kubectl get cm
4tomcat-cm          2      6s
5
6[root@k8s-master1 ~]# kubectl describe cm tomcat-cm
7server_name:
8----
9tomcat
10
11tomcat_port:
12----
138080
14

image-20260131214849852

16.2.2 方式2:命令行指定文件创建
1[root@k8s-master1 ~]# kubectl create cm nginx-vhosts-conf --from-file=nginx=./nginx_vhosts.conf
2
3[root@k8s-master1 ~]# kubectl get cm
4nginx-vhosts-conf   1      14s
5
6[root@k8s-master1 ~]# kubectl describe cm nginx-vhosts-conf
7nginx:
8----
9server {
10  listen       80;
11  server_name  www.kaser.com;
12  root         /usr/local/nginx/conf/conf.d/
13}
14

image-20260131214900859

16.2.3 方式3:命令行指定目录创建
1[root@k8s-master1 ~]# mkdir cm_test
2[root@k8s-master1 ~]# cd cm_test/
3[root@k8s-master1 cm_test]# echo "server-id=1" > sql_master.cnf
4[root@k8s-master1 cm_test]# echo "server-id=2" > sql_slave.cnf
5[root@k8s-master1 cm_test]# ls
6sql_master.cnf  sql_slave.cnf
7
8
9[root@k8s-master1 cm_test]# kubectl create cm sql-config-dir --from-file=/root/cm_test
10
11[root@k8s-master1 cm_test]# kubectl get cm
12sql-config-dir      2      26s
13
14[root@k8s-master1 cm_test]# kubectl describe cm sql-config-dir
15sql_master.cnf:
16----
17server-id=1
18
19
20sql_slave.cnf:
21----
22server-id=2
23

image-20260131215425193

16.2.4 方式4:编写 yaml 文件创建
1[root@k8s-master1 ~]# vim mysql-cm.yaml
2apiVersion: v1
3kind: ConfigMap
4metadata:
5  name: mysql
6  labels:
7    app: mysql
8data:
9  test_sql_master.cnf: |		# 写文件,后面必须要有 |
10    [mysqld]
11    log-bin
12    log_bin_trust_function_creators=1
13    lower_case_table_names=1
14  test_sql_slave.cnf: |
15    [mysqld]
16    super-read-only
17    log_bin_trust_function_creators=1
18    
19[root@k8s-master1 ~]# kubectl apply -f mysql-cm.yaml
20[root@k8s-master1 ~]# kubectl get cm
21mysql               2      6s
22
23[root@k8s-master1 ~]# kubectl describe cm mysql
24test_sql_master.cnf:
25----
26[mysqld]
27log-bin
28log_bin_trust_function_creators=1
29lower_case_table_names=1
30
31
32test_sql_slave.cnf:
33----
34[mysqld]
35super-read-only
36log_bin_trust_function_creators=1
37

image-20260131221437040

16.3 ConfigMap 使用方式

16.3.1 方式1:环境变量configMapKeyRef注入

优先使用 env + valueFrom

  • 显式声明依赖的配置项,提高可读性和可维护性
  • 避免因 ConfigMap 新增无关键导致意外行为
1]# kubectl explain pod.spec.containers.env
2  name  <string> -required-
3  value <string>
4  valueFrom     <EnvVarSource>
5# value  valueFrom 不能同时使用,二者互斥。
6
7[root@k8s-master1 ~]# kubectl explain pod.spec.containers.env.valueFrom
8  configMapKeyRef       <ConfigMapKeySelector>
9  fieldRef      <ObjectFieldSelector>
10  resourceFieldRef      <ResourceFieldSelector>
11  secretKeyRef  <SecretKeySelector>
12  
13[root@k8s-master1 ~]# kubectl explain pod.spec.containers.env.valueFrom.configMapKeyRef
14  key   <string> -required-
15  name  <string>
16  optional      <boolean>
17  # 是否可选:
18  #  false(默认):ConfigMap 或键不存在时,Pod 创建失败
19  #  true:ConfigMap/键不存在时忽略该环境变量,Pod 仍可创建
20
1[root@k8s-master1 ~]# vim cmkr-sql-cm.yaml
2apiVersion: v1
3kind: ConfigMap
4metadata:
5  name: cmkr-sql
6  labels:
7    app: mysql
8data:
9  log: "1"
10  lower: "1"
11
12[root@k8s-master1 ~]# kubectl apply -f cmkr-sql-cm.yaml
13[root@k8s-master1 ~]# kubectl get cm
14cmkr-sql            2      27s
15
16[root@k8s-master1 ~]# kubectl describe cm cmkr-sql
17log:
18----
191
20
21lower:
22----
231
24
25[root@k8s-master1 ~]# vim mysql-pod.yaml
26apiVersion: v1
27kind: Pod
28metadata:
29  name: mysql-pod
30spec:
31  containers:
32    - name: mysql
33      image: docker.io/library/busybox:1.28
34      imagePullPolicy: IfNotPresent
35      command: ["/bin/sh","-c","sleep 3600"]
36      env:
37        - name: log_bin
38          valueFrom:
39            configMapKeyRef:
40              name: cmkr-sql
41              key: log
42        - name: lower_bin
43          valueFrom:
44            configMapKeyRef:
45              name: cmkr-sql
46              key: lower
47
48[root@k8s-master1 ~]# kubectl apply -f mysql-pod.yaml
49[root@k8s-master1 ~]# kubectl get pods | grep mysql
50mysql-pod                          1/1     Running
51
52[root@k8s-master1 ~]# kubectl exec  mysql-pod -it -c mysql -- /bin/sh
53/ # printenv | grep log
54log_bin=1
55/ # printenv | grep lower
56lower_bin=1
57
16.3.2 方式2:环境变量envfrom注入

谨慎使用 envFrom:

  • 仅当确认 ConfigMap 所有键均需导入且命名合法时使用
  • 建议配合 prefix 避免命名冲突:
1]# kubectl explain pod.spec.containers.env
2  name  <string> -required-
3  value <string>
4  valueFrom     <EnvVarSource>
5# value  valueFrom 不能同时使用,二者互斥。
6
7[root@k8s-master1 ~]# kubectl explain pod.spec.containers.env.valueFrom
8  configMapKeyRef       <ConfigMapKeySelector>
9  fieldRef      <ObjectFieldSelector>
10  resourceFieldRef      <ResourceFieldSelector>
11  secretKeyRef  <SecretKeySelector>
12  
13[root@k8s-master1 ~]# kubectl explain pod.spec.containers.envFrom
14  configMapRef  <ConfigMapEnvSource>
15  prefix        <string>
16  secretRef     <SecretEnvSource>
17
1[root@k8s-master1 ~]# vim cmkr-sql-cm.yaml
2apiVersion: v1
3kind: ConfigMap
4metadata:
5  name: cmkr-sql
6  labels:
7    app: mysql
8data:
9  log: "1"
10  lower: "1"
11
12[root@k8s-master1 ~]# kubectl apply -f cmkr-sql-cm.yaml
13[root@k8s-master1 ~]# kubectl get cm
14cmkr-sql            2      27s
15
16[root@k8s-master1 ~]# vim envfrom-mysql-pod.yaml
17apiVersion: v1
18kind: Pod
19metadata:
20  name: mysql-pod
21spec:
22  containers:
23    - name: mysql
24      image: docker.io/library/busybox:1.28
25      imagePullPolicy: IfNotPresent
26      command: ["/bin/sh","-c","sleep 3600"]
27      envFrom:
28        - configMapRef:
29            name: cmkr-sql
30
31[root@k8s-master1 ~]# kubectl apply -f envfrom-mysql-pod.yaml
32[root@k8s-master1 ~]# kubectl get pods
33mysql-pod                          1/1     Running   0          23s
34
35[root@k8s-master1 ~]# kubectl exec -it mysql-pod -c mysql -- /bin/sh
36/ # printenv | grep log
37log=1
38/ # printenv | grep lower
39lower=1
40
16.3.3 方式3:volume卷挂载注入
1[root@k8s-master1 ~]# vim volume-sql-cm.yaml
2apiVersion: v1
3kind: ConfigMap
4metadata:
5  name: volume-sql
6  labels:
7    app: mysql
8data:
9  log: "1"
10  lower: "1"
11  my.cnf: |
12    [HelloWord]
13    xixixixixi
14
15[root@k8s-master1 ~]# kubectl apply -f volme-sql-cm.yaml
16[root@k8s-master1 ~]# kubectl get cm
17volume-sql         3      3s
18
19[root@k8s-master1 ~]# kubectl describe cm volume-sql
20log:
21----
221
23
24lower:
25----
261
27
28my.cnf:
29----
30[HelloWord]
31xixixixixi
32
33[root@k8s-master1 ~]# vim volume-cm-pod.yaml
34apiVersion: v1
35kind: Pod
36metadata:
37  name: volume-cm-pod
38spec:
39  containers:
40    - name: buxybox
41      image: docker.io/library/busybox:1.28
42      imagePullPolicy: IfNotPresent
43      command: ["/bin/sh","-c","sleep 3600"]
44      volumeMounts:
45        - name: vol-cm
46          mountPath: /tmp/config
47  volumes:
48    - name: vol-cm
49      configMap:
50        name: volume-sql
51
52[root@k8s-master1 ~]# kubectl apply -f volume-cm-pod.yaml
53[root@k8s-master1 ~]# kubectl get pods
54volume-cm-pod                      1/1     Running   0          4s
55
56[root@k8s-master1 ~]# kubectl exec -it volume-cm-pod -c buxybox -- /bin/sh
57/ # ls -l /tmp/config/
58total 0
59lrwxrwxrwx    1 root     root            10 Jan 29 01:26 log -> ..data/log
60lrwxrwxrwx    1 root     root            12 Jan 29 01:26 lower -> ..data/lower
61lrwxrwxrwx    1 root     root            13 Jan 29 01:26 my.cnf -> ..data/my.cnf
62
63/ # cat /tmp/config/log
641/ #
65/ # cat /tmp/config/lower
661/ #
67/ # cat /tmp/config/my.cnf
68[HelloWord]
69xixixixixi
70/ #
71

16.4 ConfigMap 热更新

volume卷挂载注入的方式才可

1[root@k8s-master1 ~]# kubectl edit cm volume-sql
2......
3apiVersion: v1
4data:
5  log: "6"			# 1 --> 6
6  lower: "123123"	# 2 --> 123123
7......
8:wq	# 保存退出
9
10[root@k8s-master1 ~]# kubectl get pods
11volume-cm-pod                      1/1     Running   0          7m32s
12
13# 进入容器查看是否改变
14[root@k8s-master1 ~]# kubectl exec -it volume-cm-pod -- /bin/sh
15/ # cat /tmp/config/log
166/ #
17/ # cat /tmp/config/lower
18123123/ #
19/ #
20

注意:

  • 更新 ConfigMap 后:
    • 使用该 ConfigMap 挂载的 Env 不会同步更新
    • 使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概10秒)才能同步更新

【Kubernetes专项】K8s 配置管理中心 ConfigMap 实现微服务配置管理》 是转载文章,点击查看原文


相关推荐


VScode引入claude+deepseek
何亚告2026/1/31

最近由于项目需求以及效率需要,在vscode引入claude进行代码整理,现将引入过程记录,将相关踩坑问题复盘: 1. 安装CC-Switch ccSwitch(CC-Switch)是基于 Rust+Tauri 开发的跨平台桌面应用,核心作用是一键管理与切换 Claude Code、Codex、Gemini CLI 等 AI 编程工具的 API 配置,替代手动修改 JSON / 环境变量,大幅提升配置效率。以下是核心功能与价值 安装包下载地址:https://github.com


多标签页强提醒不重复打扰:从“弹框轰炸”到“共享待处理队列”的实战
_Jude2026/1/22

场景:我在多标签页里“接力”处理紧急待办 这篇文章讨论的不是“消息列表怎么做”,而是紧急待办的强提醒体验应该如何落地。我的核心需求很明确: 紧急消息必须强制弹框提醒(不能靠用户自己去小铃铛里找) 弹框不能手动关闭,只能通过“去处理/已读”等业务动作逐条消解 刷新后仍要继续弹:只要还有“高优先级且未处理”的消息,就必须再次弹框 多标签页不重复打扰:同一时间只允许一个标签页弹;未处理的消息能跨标签页接力,不丢失 ✅ 问题 1:多标签页重复强弹(“弹框轰炸”)💥 现象 A 中点“去处理”打开


10分钟复刻爆火「死了么」App:vibe coding 实战(Expo+Supabase+MCP)
mCell2026/1/14

视频链接:10分钟复刻爆火「死了么」App:vibe coding 实战 仓库地址:github.com/minorcell/s… 最近“死了么”App 突然爆火:内容极简——签到 + 把紧急联系人邮箱填进去。 它的产品形态很轻,但闭环很完整: 你每天打卡即可;如果你连续两天没打,系统就给紧急联系人发邮件。 恰好我最近在做 Supabase 相关调研,就顺手把它当成一次“极限验证”: 我想看看:Expo + Supabase 能不能把后端彻底“抹掉” 我也想看看:Codex + MCP 能


耗时 8 天,我用 Claude Code 开发了 AI 漫剧 APP,并开源了。
苍何2026/1/5

这是苍何的第 468 篇原创! 大家好,我是热爱编程的苍何。 去年底的时候,我写过 2 篇 AI 漫剧的文章,感兴趣的还挺多的。 也认识了非常多做 AI 漫剧的朋友,我们武汉 AI 圈也举办了 AI 漫剧沙龙,来了超级多的感兴趣的圈友。 听了很多的干货分享,当时脑海中只想快速上手来做漫剧。 但我看了很多的平台目前还只能在电脑 web 上操作,手机随时创作我还没找到什么好的 APP。 当时就有一股冲动,要不自己来尝试搞一个?当我和老婆说这个想法的时候,她说我一定疯了。 为了证明我不是疯子,我还


数据结构(四)————图
旺仔小拳头..2025/12/27

1. 无向图与有向图 1.1 定义 无向图:边是无方向的,用(顶点, 顶点)表示边有向图:边(称为 “弧”)是有方向的,用<弧尾, 弧头>表示方向 2. 连通图 2.1 连通的定义 在无向图中,若从顶点v到顶点w存在路径,则称v到w是连通的。 2.2 连通图的定义 若图中任意两个顶点都连通,则称此图为连通图。 3. 完全图 3.1 定义 具有最多边数的图称为完全图。 3.2 边数公式 无向完全图(n 个顶点):边数最大值为n(n-1)/2。有向完全图(n 个顶点):边数最


OpenAI 甩出王炸:GPT-5.2-Codex 上线,这次它想做你的“赛博合伙人”
墨风如雪2025/12/19

老实说,在 AI 模型像下饺子一样发布的 2025 年年底,大家对“颠覆性升级”这个词早就脱敏了。但 OpenAI 刚刚在 12 月 18 日悄悄放出的 GPT-5.2-Codex,还是让不少熬夜写代码的工程师虎躯一震。 这不仅仅是 GPT-5.2 的一个微调版本,更像是一次针对程序员痛点的“精准爆破”。如果说以前的 AI 是帮你补全代码的实习生,那么这次上线的 Codex,更像是一个能扛事儿的“高级合伙人”。 我花了一点时间扒了扒这背后的技术细节和实测数据,有些东西确实值得聊聊。 告别“金鱼


Cursor 又偷偷更新,这个功能太实用:Visual Editor for Cursor Browser
张拭心2025/12/11

凌晨 1 点,我正要关电脑睡觉,屏幕左下角突然弹出一个弹窗: Cursor 又上新功能了?带着好奇我仔细看了下文档:cursor.com/cn/docs/age… 我去,这个功能很重磅啊! 这次更新的 Visual Editor for Cursor Browser 是一个打破“设计”与“编码”边界的重磅功能,它让 Cursor 不仅仅是编辑器,更是一个“能直接写代码的浏览器”。 核心价值 它解决了前端开发中最大的痛点——“在浏览器里调好了样式,还得手动回代码里改”。 现在,我们可以像在 Fi


桌面应用开发,Flutter 与 Electron如何选
Karl_wei2025/12/1

前言:这一年来我基本处于断更的状态,我知道在AI时代,编码的成本已经变得越来越低,技术分享的流量必然会下降。但这依然是一个艰难的过程,日常斥责自己没有成长,没有作品。 除了流量问题、巨量的工作,更多的原因是由于技术栈的变化。我开始使用Electron编写一个重要的AI产品,并且在 Flutter 与 Electron 之间来回拉扯...... 背景 我们对 Flutter 技术的应用,不仅是在移动端APP,在我们的终端设备也用来做 OS 应用,跨Android、Windows、Linux系统。


TypeScript 类型体操练习笔记(二)
我不吃饼干2026/2/18

进度(90 /188) 其中标记 ※ 的是我认为比较难或者涉及新知识点的题目 刷题也许没有什么意义,但是喜欢一个人思考一整天的灵光一现,也喜欢看到新奇的答案时的恍然大悟,仅此而已。 42. Medium - 1130 - ReplaceKeys ※ 实现一个类型 ReplaceKeys,用于替换联合类型中的键,如果某个类型不包含该键则跳过替换。该类型接受三个参数。 一开始我只是想这么写,我想分布式条件类型 + Pick + Omit 来实现。 type ReplaceKeys<U, T, Y>


AI 原生应用开源开发者沙龙·深圳站精彩回顾 & PPT下载
阿里云云原生2026/2/26

作者:盈楹 近日,AI 原生应用开源开发者沙龙·深圳站圆满落幕。本场活动吸引了 140+ 名技术从业者深度参与,聚焦 AI 原生应用架构领域的开源技术与落地实践, 围绕 AgentScope、RocketMQ、HiMarket、Higress、LoongSuite、Agent 技术实践等议题展开深度分享,并设置了动手实操环节。 关注「阿里云云原生」公众号,后台回复:0210 免费获得深圳站讲师 PPT 合辑 精彩回顾 议题一:AgentScope:迈向 Agentic 智能体应用丨高大伟(大玮)

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 XYZ博客