轻松上手 ConfigMap,用作容器云服务的配置中心
zhezhongyun 2025-05-11 03:03 46 浏览
回复“资源”领取独家整理的学习资料!
每一个成功人士的背后,必定曾经做出过勇敢而又孤独的决定。
放弃不难,但坚持很酷~
k8s:v1.13.5
一、背景
将 spring boot 项目部署在 k8s 上,需要打镜像,为了实现配置文件可配置,就需要将配置文件与镜像解耦。
之前我们都是使用的 k8s 部署的 spring cloud configserver 组件来当作 spring boot 项目的配置中心。在项目中引入
spring-cloud-starter-config 依赖,配置上 configserver 的内部域名即可。
但有一个痛点就是:configserver 不稳定,有时候会造成其他 pod 应用重启,所以想使用别的方案,那就是 k8s 中的 configMap 。
二、K8s ConfigMap
ConfigMap 顾名思义,是用于保存配置数据的键值对,可以用来保存单个属性,也可以保存配置文件。
如下述代码所示,metadata.name 为 configMap 的名称,namespace 为作用域,需要与用到的 pod 作用域保持一致,否则 pod 会因为找不到 configMap 起不来。
以下是一个 configMap 的内容,data 里面有两项,一个是 TENANTID ,一个是 application-test.yml 内容。后续会将它们配置在 deploy 里面,让其在 pod 运行时生效。
kind: ConfigMap
apiVersion: v1
metadata:
name: spring-boot-demo-configmap
namespace: public
labels:
app: spring-boot-demo-app
data:
TENANTID: "0000"
application-test.yml: |-
spring:
application:
name: spring-boot-demo
说说 k8s configmap 的相关命令:
# 创建 configmap,yaml 文件内容为标题二所示:
kubectl apply -f spring-boot-demo-configmap.yaml
# 获取指定作用域下的 configmap 列表
kubectl get configmaps -n public
# 编辑 configmap
kubectl edit configmap -n public spring-boot-demo-configmap
# 删除 configmap
kubectl delete configmap -n public spring-boot-demo-configmap
三、将 ConfigMap 的某些数据挂载为文件
我想让 pod 容器中的 spring boot 项目读取上面 configmap 中 application-test.yml 的内容,这个应该怎么操作呢?
基于以上,将 configMap 创建好之后,我们可以选择将 application-test.yml 的内容挂载到 pod 中,让 spring boot 项目可读,这样就实现了我们的目的。
在一般情况下,使用 configmap 挂载文件时,会先覆盖掉挂载目录,然后再将 congfigmap 中的内容作为文件挂载进行。如果不想对原来的文件夹下的文件造成覆盖,只是将 configmap 中的每个 key,按照文件的方式挂载到目录下,可以使用 mountPath + subpath 参数。
以下是 deployment 里面的部分代码:
spec:
template:
spec:
volumes:
- name: conf
configMap:
name: spring-boot-demo-configmap # 指定要使用的configmap名称
containers:
- name: spring-boot-demo-app
volumeMounts:
- name: conf # 与上面的volumes.name保持一致
mountPath: /spring-boot-demo/conf/application-test.yml
subPath: application-test.yml
readOnly: true
当 subPath 配合 mountPath 使用时,application-test.yml 为文件名,即 pod 容器中只生成了 /spring-boot-demo/conf/ 目录,目录之下为文件,会挂载出一个名为 application-test.yml 的文件(subPath 筛选只挂载 application-test.yml 文件),设置 readOnly 为 true ,表示只读。
四、将 ConfigMap 的某些数据配置成环境变量
针对多租户等场景,我们可能就需要用到环境变量了。那么如何将 ConfigMap 的某些数据配置成环境变量呢?
以下是 deployment 里面的部分代码:
spec:
template:
spec:
volumes:
- name: conf
configMap:
name: spring-boot-demo-configmap # 指定要使用的configmap名称
containers:
- name: spring-boot-demo-app
env:
- name: TENANT # 传入pod中的变量名
valueFrom:
configMapKeyRef:
name: data-center-management-configmap
key: TENANTID # configmap中的key
通过 valueFrom.configMapKeyRef 可以指定使用哪个 configmap 的 哪个 key 来当做环境变量传入 pod 容器中,这样,spring boot 项目可以直接通过 ${TENANT} 使用。
五、小结
本文介绍了两种使用 configMap 的方法:
将 configMap 作为一种环境变量
将 configMap 挂载为文件
按照这样总结下来,configMap 还挺好用。相对来说,k8s 的 configMap 要比 k8s 部署的 spring cloud configserver 稳定得多。configMap 可以直接将配置内容挂载成文件到你的 pod 容器中,供 spring boot 项目加载使用。
但也有不方便的地方,那就是没有实现热加载。即:如果修改 configMap 后,需要重启服务才会使新配置生效。不过在生产环境上也没事,我们可以将服务调整为双副本嘛。
如果各位小伙伴们,也正在挑选容器云服务的配置中心的话,不妨试试 k8s 的 configmap,或者有更好的方案,也可以在评论中和我们分享一下。
有什么想法你就说
(内部资料)Ambari 自定义服务第八讲:添加自定义告警
天呐,你生产环境中的密码还在裸奔吗?
入群指南(大数据实战演练群分布情况)
如何优雅地使用 java 连接 HBase 客户端
扫一扫,我们的故事就开始了。
另外公众号改变了推送规则,大家看文章不要忘记点击最下方的在看,点赞按钮,这样微信自动识别为常看公众号,否则很可能推送的文章可能淹没在别的文章找不到,谢谢大家
让我知道你在看
相关推荐
- Python入门学习记录之一:变量_python怎么用变量
-
写这个,主要是对自己学习python知识的一个总结,也是加深自己的印象。变量(英文:variable),也叫标识符。在python中,变量的命名规则有以下三点:>变量名只能包含字母、数字和下划线...
- python变量命名规则——来自小白的总结
-
python是一个动态编译类编程语言,所以程序在运行前不需要如C语言的先行编译动作,因此也只有在程序运行过程中才能发现程序的问题。基于此,python的变量就有一定的命名规范。python作为当前热门...
- Python入门学习教程:第 2 章 变量与数据类型
-
2.1什么是变量?在编程中,变量就像一个存放数据的容器,它可以存储各种信息,并且这些信息可以被读取和修改。想象一下,变量就如同我们生活中的盒子,你可以把东西放进去,也可以随时拿出来看看,甚至可以换成...
- 绘制学术论文中的“三线表”具体指导
-
在科研过程中,大家用到最多的可能就是“三线表”。“三线表”,一般主要由三条横线构成,当然在变量名栏里也可以拆分单元格,出现更多的线。更重要的是,“三线表”也是一种数据记录规范,以“三线表”形式记录的数...
- Python基础语法知识--变量和数据类型
-
学习Python中的变量和数据类型至关重要,因为它们构成了Python编程的基石。以下是帮助您了解Python中的变量和数据类型的分步指南:1.变量:变量在Python中用于存储数据值。它们充...
- 一文搞懂 Python 中的所有标点符号
-
反引号`无任何作用。传说Python3中它被移除是因为和单引号字符'太相似。波浪号~(按位取反符号)~被称为取反或补码运算符。它放在我们想要取反的对象前面。如果放在一个整数n...
- Python变量类型和运算符_python中变量的含义
-
别再被小名词坑哭了:Python新手常犯的那些隐蔽错误,我用同事的真实bug拆给你看我记得有一次和同事张姐一起追查一个看似随机崩溃的脚本,最后发现罪魁祸首竟然是她把变量命名成了list。说实话...
- 从零开始:深入剖析 Spring Boot3 中配置文件的加载顺序
-
在当今的互联网软件开发领域,SpringBoot无疑是最为热门和广泛应用的框架之一。它以其强大的功能、便捷的开发体验,极大地提升了开发效率,成为众多开发者构建Web应用程序的首选。而在Spr...
- Python中下划线 ‘_’ 的用法,你知道几种
-
Python中下划线()是一个有特殊含义和用途的符号,它可以用来表示以下几种情况:1在解释器中,下划线(_)表示上一个表达式的值,可以用来进行快速计算或测试。例如:>>>2+...
- 解锁Shell编程:变量_shell $变量
-
引言:开启Shell编程大门Shell作为用户与Linux内核之间的桥梁,为我们提供了强大的命令行交互方式。它不仅能执行简单的文件操作、进程管理,还能通过编写脚本实现复杂的自动化任务。无论是...
- 一文学会Python的变量命名规则!_python的变量命名有哪些要求
-
目录1.变量的命名原则3.内置函数尽量不要做变量4.删除变量和垃圾回收机制5.结语1.变量的命名原则①由英文字母、_(下划线)、或中文开头②变量名称只能由英文字母、数字、下画线或中文字所组成。③英文字...
- 更可靠的Rust-语法篇-区分语句/表达式,略览if/loop/while/for
-
src/main.rs://函数定义fnadd(a:i32,b:i32)->i32{a+b//末尾表达式}fnmain(){leta:i3...
- C++第五课:变量的命名规则_c++中变量的命名规则
-
变量的命名不是想怎么起就怎么起的,而是有一套固定的规则的。具体规则:1.名字要合法:变量名必须是由字母、数字或下划线组成。例如:a,a1,a_1。2.开头不能是数字。例如:可以a1,但不能起1a。3....
- Rust编程-核心篇-不安全编程_rust安全性
-
Unsafe的必要性Rust的所有权系统和类型系统为我们提供了强大的安全保障,但在某些情况下,我们需要突破这些限制来:与C代码交互实现底层系统编程优化性能关键代码实现某些编译器无法验证的安全操作Rus...
- 探秘 Python 内存管理:背后的神奇机制
-
在编程的世界里,内存管理就如同幕后的精密操控者,确保程序的高效运行。Python作为一种广泛使用的编程语言,其内存管理机制既巧妙又复杂,为开发者们提供了便利的同时,也展现了强大的底层控制能力。一、P...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 教程 (33)
- HTML 简介 (35)
- HTML 实例/测验 (32)
- HTML 测验 (32)
- JavaScript 和 HTML DOM 参考手册 (32)
- HTML 拓展阅读 (30)
- HTML文本框样式 (31)
- HTML滚动条样式 (34)
- HTML5 浏览器支持 (33)
- HTML5 新元素 (33)
- HTML5 WebSocket (30)
- HTML5 代码规范 (32)
- HTML5 标签 (717)
- HTML5 标签 (已废弃) (75)
- HTML5电子书 (32)
- HTML5开发工具 (34)
- HTML5小游戏源码 (34)
- HTML5模板下载 (30)
- HTTP 状态消息 (33)
- HTTP 方法:GET 对比 POST (33)
- 键盘快捷键 (35)
- 标签 (226)
- opacity 属性 (32)
- transition 属性 (33)
- 1-1. 变量声明 (31)
