百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

轻松上手 ConfigMap,用作容器云服务的配置中心

zhezhongyun 2025-05-11 03:03 31 浏览

回复“资源”领取独家整理的学习资料!

每一个成功人士的背后,必定曾经做出过勇敢而又孤独的决定。

放弃不难,但坚持很酷~


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 客户端

扫一扫,我们的故事就开始了。

另外公众号改变了推送规则,大家看文章不要忘记点击最下方的在看,点赞按钮,这样微信自动识别为常看公众号,否则很可能推送的文章可能淹没在别的文章找不到,谢谢大家

让我知道你在看

相关推荐

Chinese vice premier calls for multilateralism at Davos

DAVOS,Switzerland,Jan.21(Xinhua)--ChineseVicePremierDingXuexiangdeliveredaspeechatthe...

用C++ Qt手把手打造炫酷汽车仪表盘

一、项目背景与核心价值在车载HMI(人机交互界面)开发领域,虚拟仪表盘是智能座舱的核心组件。本项目基于C++Qt框架实现一个具备专业级效果的时速表模块,涵盖以下技术要点:Qt图形绘制核心机制(QPa...

系列专栏(八):JS的第七种基本类型Symbols

ES6作为新一代JavaScript标准,已正式与广大前端开发者见面。为了让大家对ES6的诸多新特性有更深入的了解,MozillaWeb开发者博客推出了《ES6InDepth》系列文章。CSDN...

MFC界面开发工具BCG v31.1 - 增强功能区、工具箱功能

点击“了解更多”获取工具亲爱的BCGSoft用户,我们非常高兴地宣布BCGControlBarProfessionalforMFC和BCGSuiteforMFCv31.2正式发布!新版本支...

雅居乐上调出售吉隆坡项目保留金,预计亏损扩大至6.64亿元

1月2日,雅居乐集团(03383.HK)发布有关出售一家附属公司股权披露交易的补充公告。此前雅居乐集团曾公告,2023年11月8日(交易时段后),集团子公司AgileRealEstateDeve...

Full text: Address by Vice Premier Ding Xuexiang's at World Economic Forum Annual Meeting 2025

DAVOS,Switzerland,Jan.21(Xinhua)--ChineseVicePremierDingXuexiangonTuesdaydeliveredasp...

手机性能好不好 GPU玄学曲线告诉你

前言各位在看测试者对手机进行评测时或许会见过“安卓玄学曲线”,所谓中的安卓玄学曲线真名为“ProfileGPURendering”。大多数情况下,在系统“开发者选项中被称为“GPU显示配置文件”或...

小迈科技 X Hologres:高可用的百亿级广告实时数仓建设

通过本文,我们将会介绍小迈科技如何通过Hologres搭建高可用的实时数仓。一、业务介绍小迈科技成立于2015年1月,是一家致力以数字化领先为优势,实现业务高质量自增长的移动互联网科技公司。始...

vue3新特征和所有的属性,方法汇总及其对应源码分析

vue3新特征汇总与源码分析(备注:vue3使用typescript编写)何为应用?constapp=Vue.createApp({})app就是一个应用。应用的配置和应用的API就是app应用...

China's stability redefines global trade in a volatile era

ContainersareunloadedatQingdaoPort,eastChina'sShandongProvince,December10,2024.[Photo/X...

QML 实现图片帧渐隐渐显轮播

前言所谓图片帧渐隐渐显轮播就是,一组图片列表,当前图片逐渐改变透明度隐藏,同时下一张图片逐渐改变透明度显示,依次循环,达到渐隐渐显的效果,该效果常用于图片展示,相比左右自动切换的轮播方式来说,这种方式...

前端惊魂夜:我竟在CSS里写出了JavaScript?

凌晨两点,写字楼里只剩下我工位上的一盏孤灯。咖啡杯见底,屏幕的光映在疲惫的眼镜片上。为了实现一个极其复杂的动态渐变效果,我翻遍了MDN文档,试遍了所有已知的CSS技巧,却始终差那么一口气。“要是CSS...

10 个派上用场的 Flutter 小部件

尝试学习一门新语言可能会令人恐惧和厌烦。很多时候,我们希望我们知道早先存在的某些功能。在今天的文章中,我将告诉你我希望早点知道的最方便的颤振小部件。SpacerSpacer创建一个可调整的空白空...

让我的 Flutter 代码整洁 10 倍的 5 种

如果你曾在Flutter中使用过SingleTickerProviderStateMixin来制作动画,猜猜怎么着?你已经使用过Mixin了——恭喜你,你已经处于一段你甚至不知道的关...

daisyUI - 主题漂亮、代码纯净!免费开源的 Tailwind CSS 组件库

漂亮有特色的CSS组件库,组件代码非常简洁,也支持深度定制主题、定制组件,可以搭配Vue/React等框架使用。关于daisyUIdaisyUI是一款极为流行的CSSUI组件库,...