ConfigMap在kubernetes中的应用
admin
2023-03-26 18:01:45
0

ConfigMap概念

在生产环境中经常会遇到需要修改配置文件的情况,传统的修改方式不仅会影响到服务的正常运行,而且操作步骤也很繁琐。为了解决这个问题,kubernetes项目从1.2版本引入了ConfigMap功能,用于将应用的配置信息与程序的分离。这种方式不仅可以实现应用程序被的复用,而且还可以通过不同的配置实现更灵活的功能。在创建容器时,用户可以将应用程序打包为容器镜像后,通过环境变量或者外接挂载文件的方式进行配置注入。

ConfigMap是以key:value的形式保存配置项,既可以用于表示一个变量的值(例如config=info),也可以用于表示一个完整配置文件的内容(例如server.xml=…)。

如果你对Spring Cloud的生态很熟悉,那么接下来你会发现ConfigMap与Spring Cloud server十分类似。这里有两种使用ConfigMap的方法:

  1. 将ConfigMap作为一种环境变量

  2. 将ConfigMap挂载为文件

让我们开始进行实践!我们将使用一个简单的应用程序,基于Spring Boot、Docker和Kubernetes进行演示

将ConfigMap作为一种环境变量

在本例中,我们将在Kubernetes中创建一个新的环境变量,并将其用于代码中。在Java中,可以通过System.getenv(String) API在代码中使用环境变量。在常规Java应用程序中,可以在J2EE应用程序容器(如Oracle WLS或IBM WAS)中设置环境变量,也可以在OS中设置环境变量。然而,在Kubernetes中情况并不相同。要使用环境变量,我们必须根据literal创建配置映射。
 
ConfigMap在kubernetes中的应用
 
通过kubectl create configmap命令,我们创建了两个环境变量:app.name 和 app.desc。

我们来了解一下这背后发生了什么。
 
ConfigMap在kubernetes中的应用
 
现在注意数据部分,在数据部分下,你会找到键值对。从技术上来说,ConfigMap仅仅是键值存储。属性的名称是键,属性的值是值。应用程序的代码会要求你查找这些键值对。

为了在Java代码中使用此环境变量,我们需要编写以下代码:
 
ConfigMap在kubernetes中的应用
 
下面的代码段定义了两个K8s环境变量,分别为“ SPRING_BOOT_HELLO_WORLD_APP_NAME”和“ SPRING_BOOT_HELLO_WORLD_DESC”。这些变量将从ConfigMap app-env-config获取值。需要重点关注的是键。
 
ConfigMap在kubernetes中的应用
 
属性配置文件可以在单个文件中保存很多个属性,以在不同环境中运行应用程序。在Spring Boot应用程序中,属性保存在classpath下的application.properties文件中。我们来看一下打包在应用程序jar包中的application.properties文件。
 
ConfigMap在kubernetes中的应用
 
我们正在使用命令kubectl create configmap从单个文件或从多个文件创建ConfigMap。

现在让我们查看完整的代码
ConfigMap在kubernetes中的应用

ConfigMap在kubernetes中的应用

将ConfigMap挂载为文件

在本节中,我将说明如何使用ConfigMap挂载文件以外部化配置。在此示例中,我将使用ConfigMap来外部化application.properties文件。即使默认文件打包在jar中,也位于src / main / resources下。简单来说,我们将通过ConfigMap所提供的文件来覆盖默认文件。

第一步是从application.properties创建ConfigMap。让我们了解如何在K8s中存储此ConfigMap
ConfigMap在kubernetes中的应用
通过ConfigMap,我们将挂载application.properties文件到K8s集群中,并且可以在应用程序中使用它。请注意,数据部分包含了application.properties的内容,键是文件名。

现在,为了覆盖默认配置文件,我们需要(通过ConfigMap)将application.properties挂载到应用程序的classpath中。Spring Boot通过提供不同的选项来提供这一功能。SpringApplication在以下位置从application.properties文件加载属性,并将它们添加到Spring Environment

  • 当前目录的/config 子目录

  • 当前目录

  • classpath / config包

  • The classpath root

如果你想了解更多信息,可以查阅官方文档
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-application-property-files

最简单,最好的方法是将application.properties挂载在“ / config”目录中。
 
ConfigMap在kubernetes中的应用
 
仔细检查挂载路径,请注意ConfigMap的名称应与我们在上面创建的app-file-configmap完全相同,键为文件名。另外,请确保将volume mount配置的名称更改为volume配置的名称
ConfigMap在kubernetes中的应用
这段代码说明了如何在application.properties文件中定义属性。如果使用Spring推荐的标准方法的话,这十分简单。具体而言,就是使用@Value 注释将属性值注入到变量中。

现在,我们可以继续进行ConfigMap示例应用程序了。我们来看一下完整的代码段。
 
ConfigMap在kubernetes中的应用
 
让我们创建一个Docker镜像并将其上传到Dockerhub。在本例中,镜像名称是k8s-springboot-helloworld-configmap—app。

以下是K8S pod配置文件:
 
ConfigMap在kubernetes中的应用
 
现在我们使用NodePort服务类型创建服务,以便可以从K8S集群外部使用Welcome服务。
 
ConfigMap在kubernetes中的应用
 
现在,让我们把这些更改应用于K8S

导航到浏览器并访问http://:/welcome。在本例,应该是http:// 192.168.99.100:30880/welcome

认真观察输出,返回的字符串是:
 
ConfigMap在kubernetes中的应用
 
同时,检查代码中硬编码的环境变量的默认值,以及打包在jar中的application.properties的property默认值。你发现从ConfigMap中获取了环境变量和application.properties的值。

相关内容

热门资讯

伊朗提议美方在30天内撤销对伊... 据伊朗方面10日消息,知情人士表示,伊朗在其向美方的提议中,要求美国财政部外国资产控制办公室在30天...
特朗普:伊朗的回应“完全不可接... 当地时间5月10日,美国总统特朗普在其社交媒体“真实社交”发文表示,他刚刚读了伊朗那些所谓的“代表”...
训练运行模式缺陷或致AI提供危... 据新华社伦敦5月9日电 英国《自然》杂志网站日前发表文章说,人工智能(AI)聊天机器人可能向用户提供...
原创 都... 其实也很简单,很大一部分人就是找不到成就感。 只能去信这些,几乎没有认知门槛啊。 智商75以上的人,...
“宇宙超级快递小哥”即将出发 ... 新一单“太空快递”即将发货! 近日 天舟十号完成转运和全区合练 各项发射准备工作全部就绪 我国第十艘...
美媒证实一艘美国商船遭伊朗无人... 新华社华盛顿5月10日电 (记者徐剑梅 黄强)据美国福克斯新闻数字网报道,一艘美国商船10日在波斯湾...
特朗普声称伊朗47年来一直在“... 美国总统特朗普于当地时间5月10日在社交媒体发文,“猛烈抨击”伊朗长期“玩弄”美国和世界,同时还痛批...
学生放学回家后又返回学校坠亡,... 学生符某放学后回到家中,后又从家中返回学校,并于当晚从学校教学楼楼顶坠亡。符某父母随后将学校告上法庭...
泽连斯基称乌已向俄方提交100... 当地时间10日,乌克兰总统泽连斯基表示,乌俄双方将以“千人换千人”的方式交换战俘,乌方已向俄方提交了...
国网上海市电力公司举办“明灯引... 5月7日至9日,在第十个“中国品牌日”来临之际,国网上海市电力公司(以下简称“国网上海电力”)以“明...