00:01
各位同学大家好,今天呢,我们一块儿来学习一下config map资源,Config map主要是用于管理配置文件的。那么它在实际的生产环境当中怎么用,以及它解决了什么问题?就借今天这个机会,咱们一起来深入的聊一下。本次课呢,我们分为6步走。第一,要了解coner map的本质定义,以及为什么我们需要它,它解决了什么问题。第二,要掌握computer map资源的创建方式,它有几种方式,这几种方式的区别又是什么?第三环境变量动态注入和第四配置文件挂载实战,这两个主要是讲解了我们创建好这个com贝外部资源以后怎么使用啊。对吧。然后再看第5生产集,场景落地,通过真实的案例加深理解,使用computer map动态配置inx虚拟主机实现配置及代码。
01:12
第6总结了一些大家使用computer map的遇到的一些问题哈,就是常比较常见的,我我这边整理一下,到时候呢,给大家一起来分享一下哈,避免了以后我们在使用的时候,嗯。又掉入同样一个坑里边儿。首先来看什么是coniger map coniger map是cooper nes生态中最核心的配置管理API对象,专门用于集中存储非敏感的应用配置数据。就像是一个外部的配置字典,允许开发者将配置信息从容器镜像中剥离出来,避免将配置硬编码在代码或者镜像内部,从而实现配置的动态管理。其实嗯,整理一下,核心就一个点。
02:06
镜像解耦。将应用的业务代码和运行时的配置彻底分离,容器镜像仅包含不可变的核心逻辑,而配置呢,作为外部资源动态挂载,从根本上解决配置跟随镜像走的耦合问题。这是他的核心思想。我们再来看一下为什么需要卡菲哥买。这里我总结了3点,就是。传统部署的一个缺陷。第一,硬编码配置。我们不用computer贝跟map的时候会遇到什么问题呢?这个业务配置直接写死在这个镜像里边儿了,或者是docker file里边是吧?与程序逻辑强绑定,这是最原始也是最不灵活的管理方式,核心问题是修改配置。
03:04
就需要重构镜像发布流程是吧?是很慢的,有过生产环境经验的同学都知道,在实际的环境当中,从发布到最后上线,这个流程是非常繁琐的。再看第二,配置与镜像仅耦合。为了适配开发、测试、生产等不同环境,不得不为同一应用维护多套内容高度相似的镜像,造成资源浪费。这个核心问题是镜像版本管理混乱,环境间迁移成本高,且大幅增加了存储和运维的负担。再看第三。敏感信息暴露隐患。若将数据库的密码、API、密钥等敏感数据直接写入配置文件,会因代码或镜像的公开传播而面临数据泄露的风险。核心问题是明文存储违背安全极限,一旦发生代码泄露,直接导致核心业务资产受损。
04:11
来,我们再来看一下computer map的创建,首先看第一种方式,使用压P文件,我们可以直接通过P文件的方式去定义我们的ctrl map中的K和value是吧?通过这个例子也可以看到啊,有个德塔字段,德塔字段里面前面就是K,后边就是VALUE6当然了,也可以通过管道的方式。把管道后边的所有全部都赋值给前面的K,好吧,这个比较简单啊,然后再看方式2和方式3,都是通过命密行的方式,首先我们来看方式2。通过cooper CL create con map资源对吧,然后后面写con名字,然后通过选项杠杠from lateral=king在等于value就可以了,当然了,这个可以定义一个,也可以定义多个。
05:12
再看方式3,从本地文件或目录导入配置。这里的。一个选项就是杠杠from-file等于后面可以跟上文件的名字,也可以跟上一个目录的名字,目录录可以目,如果说目录的方式哈,里边可以写多个文件,文件名就是key,文件的内容就是。我们再来看一下核心用法。第一个核心用法就是环境变量注入,将computer map中的键值对作为环境变量注入到容器当中,是云原生应用获取配置时最常用的也是最便捷的方式之一。这种方式无需修改应用代码,只需在pod中定义进行简单配置即可让容器内的进程通过环境变量读取关键的配置参数,实现配置与镜像的结偶。
06:13
我们可以来看一下这份雅某文件,通过因NV是吧,然后定义变量的名字,然后变量的值是吧?这里开始引用了volume from, 然后congu map king race声明引用了,要引用什么呢?引用这个APP杠、conve, 这个卡map资源,然后引用的是哪个king呢?这个就如实填也就可以了。好吧,这个也比较简单,我们再来看一下环境变量的注入第二种方式啊,这种方式是注入这个com map资源里所有的K和value,主要方式是通过env from, 然后指定conve map的资源名字就可以了。好吧,这个也比较简单。
07:06
我们再来看一下挂载配置文件的方式,将configgu mapb作为volume挂载到容器当中,是处理完整配置文件的首选方式。这种方式让应用以读取本地文件的传统方式获取配置,既保留了应用的工作习惯,又完美的实现了配置数据与镜像的结耦,是部署NX my circlel等等等等服务的文件。标准实践。基本挂载逻辑是将整个configu map资源挂载到容器内的指定目录,挂载完成后,Configu map中的每一个K会转化为该目录下的一个文件,VALUE6则成为文件的内容。这种方式呢,也非常适合需要同时加载多个配置项,或者应用程序本身依赖于某个特定目录结构的配置文件场景。好吧,这个相当于就是一个挂载嘛,挂载进挂载到这个容器里边了,也比较好理解。
08:10
高级挂载这里我也提一下吧,如果说哈,我们设想一个场景,我们卡贝跟map当中定义了多个K和VALUE6,但是呢,我又不需要引入这么多king和value,那么怎么办?我可以,我可不可以说是我引入某一个king或者value可以吧,可以我们就可以通过这个items这个字段。就是引入我们需要的king,并且还可以通过pass。来引入这个K的,呃,比方说我引入的这个K啊,原始的名字叫做123,我想把它挂载到这个容器里边,我让它叫四五六,可不可以,可以我们就通过pass字段来来搞定。然后再看右边的这个例子哈,3S,我们传统部署不不是传统部署,是传统的这个挂载是覆盖挂载,对吧,就比方说我这文件里面原来。
09:11
有个俩文件是吧,123和456两个文件,那么如果说你要挂载的话,那你这个123和456都不在了,能不能说我就是又想这种挂载,而且我也不想说影响到原来的这个文件呢,也可以,这个时候呢,就需要引入spas,避免覆盖目录的原有内容,S passs允许将单个文件精准的插入到目标目录中,完美的保留了原有的目录结构,我们来看一下它是怎么引用的哈。Value Mo, 然后指定了这个券的名字,APP杠卡菲格是吧,然后挂载的一个命令mod pass, 挂载到哪儿呢?挂载到URL shell n HTML下的app.js下面。
10:03
然后surpass,然后叫什么名字呀,叫这个runtime-conffigure的GS,然后只读。就是only,然后是true,这个就是相当相当于就是你挂载到容器里面,嗯,它作为一个只读的形式存在。嗯,这个也比较好理解哈,这里就嗯。可以过了,然后核心用法2,高级用法和更新策略,这个到时候在环境演示的时候,我们再拿出来说一下吧,这里如果干讲的话可能比较枯燥。应用场景配置外部服务器injax将injax的核心配置文件inx.com与静态的网页内容存储在computer mapb资源当中,能够实现配置数据和容器镜像的彻底解耦。这种方式允许我们在不重构镜像的情况下灵活的更新服务配置和网页内容,极大的提升了运名效率。当然了,这块的话也是举了一个挂载配置文件和网页的一个例子哈,跟之前的实现方式和原理是一样的。
11:15
最佳实践,最佳实践,嗯,我们这我这里就多提一个参数吧,啊叫immun table, 这个是什么意思。也就是说,我们在创建好computer map以后,通过增加这个mun table这个参数,可以避免这个computer map被误修改。就相当于是创建好了,而且我还有这个参数,那么这份文件,这个资源后边谁也改不了,除非你把它删了重建。好吧,这块大家知道一下就可以了。然后常见问题和解答,这里咱们一块儿来看一下啊,这个反馈的比较多一些啊,大家需要注意一下,第一个con菲map更新以后,应用为什么没有反应?如果是通过环境变量的注入,配置更新后必须重启破D才能生效,若是卷挂载的方式呢,需确定应用程序本身是否支持配置热加载的机制。此外,若挂载时使用了spas参数,会阻断con map的自动更新同步,这是最容易被忽略的关键点。
12:31
再看第二个挂载computer贝mapb后,容器原有文件为何消失?这是cooperbert卷挂载的默认行为。将卷直接挂载到一个目录时,会用卷的内容完全覆盖该目录的原有结构。正确的做法是使用spass将map中的单个文件挂载到文件目录的具体位置,这样既保留了目录的原有内容,又实现了配置文件的注入。
13:02
第三,能否跨命名空间引用con map呢?默认情况下是不允许的。Con map属于命名空间级别的隔离资源,设计上只允许被以同一个命名空间内的PD。Deployment等等控制器这种工作负载进行访问。若业务场景需要命名空间共享配置,建议使用集群级别的配置管理工具,或者使用CSCD的流水线流程将配置同步到目标的命名空间。再看最后一个computer bigger map的大小有什么限制吗?其实Computer map官方定义啊,不能超过1兆。然后再来看一下下面,如果配置超出了该限制,建议将其拆分成多个较小的ma,或者使用persistent volume挂载外部存储来保存大文件配置。好吧,以上就是PPT的全部内容,下面开始我们的实验环节。
14:07
大家好,下面就开始我们的实验环节,我这里呢,提前写了一份NX的配置文件,大家可以看一下啊,我在监听99端口,然后基基础的配置server和这个location,然后呢,我又把这个文件啊。给创建成了config map资源,我们一起来看一下这条命令。Cooper CTL create cm cm就是computer map的缩写,然后computer map-INS,这个是computer map的名字,可以由我们自己那个指定,然后刚刚from file=in点。相当于来自文件嘛。文件在哪儿?文件叫啥呢?文件叫nx.com。然后我执行完是吧,就开始创建了,我们一起来看一下cooper CTL GA cm是不是就创建出来一个叫con map-INS的资源呢。
15:08
这个时候已经有了,那么我们要把它挂载到这个pod里面,应该怎么办呢?我再给大家看一个。文件,这个是我提前写好这份deploy,我们一起来读一下它。API version apps v1,然后kind的deployment的一个这个资源原数据。我指定了一个标签,然后指定了这个deploy的名字,然后spike副本数是5,然后标签这个选择器,我要选这个标签的port。是吧,然后定义模板了,然后你看我又给这个破人起了一个标签,相当于做了一个匹配嘛。好,然后再看pod的一个规格描述。要起一个容器,容器的镜像是INS冒号latest的,然后拉取策略是本地有就就就用本地的,本地没有就从远端仓库拉取,然后容器的名字叫苏小轩杠N杰克。
16:15
然后卷挂载。卷挂载你看啊,我引用了一个券,这个券的名字叫做config-volume,然后挂载到哪呢?挂载到ETC下来的NG。下边的com复点D下边的99.com是吧,我挂载进去,我给它起名叫九十九点。Com.因为我们监听的是99端口,好吧,然后3PS。是点com some是什么意思呢?之前我们已经提过了,如果说你不指定这个参数的话,你直接挂载会将整个目录覆盖。如果说整个目录覆盖,嗯,你如果里边有比较重要的文件啊,就比方说我们现在用的这个NEX这个com复点D下面是有一个default点这个文件,如果说我不指定这个,那么它就99点会把嗯,Default点给覆盖掉,所以我这里加了一个。
17:14
是吧,然后这个呢,点这个是的名字。K的名字。因为我们。Computer map里面可能不止一个K对吧,所以说我这里我要指定一个名字,然后呢,把这个名字的。挂载到这个位置。是吧,然后并且叫这个名字。然后我这里又声明一个卷对吧,然后卷的名字叫做什么呢?卷的名字叫做confi volume confi volume的值来自于哪里呢?这里引用了一个computer map资源卡,Map的资源叫做。Computer map-in,这个是不是刚才我们创建的那个资源呀,对吧,这里这个一定要对应上哈,一定要写对不然的话你是无法引用到的。
18:01
你看就相当于是把它的一个嗯值给了他,然后呢,Volume挂载的时候又用了他。这个逻辑应该比较好理解哈,我们再来捋一遍。我们把这个conve map的资源,也就是值,哎,就相当于是复制给了他,然后呢,他呢又在挂载的时候被引用了。然后这个值挂载到了哪儿呢?挂载到了这个位置,名字叫99.com是吧,由于卡贝map里面不止一个K,所以我这里单独指定一个K。并且不覆盖是吧?3PASS就是。嗯,指定K,并且不覆盖原有的目录结构。好吧,这块也比较好理解,来,我们一起来执行看一下cooper CT分类杠f development回车。好,创建成功了,然后我们看一下。全部都讲对不对,来,我们一起来。
19:03
更更外的外的。我们一起来访问一下吧。我因为我这个起的是一个N的port啊,默认是80对吧,应该是可以访问到的。没问题啊好,这里没问题,然后呢,我们挂载进去的那个叫N这个点com复是不是它的端口,我指定的是99呀。那我们我们来试一下这个99能不能返回。是不是也可以返回?对不对,来,我们来进这个容器里边。c.ec, 我们进这个POS里边,我们看一下挂载到的那个位置哈。啊杠杠啊一下的DF。嗯,ETC下的NX下的C.D对吧。是不是有个99点对不对。这个就是我们刚才。
20:00
提前写好的,然后并且已经挂载到这个pod里边的这个配置文件,大家有没有发现这个目录下盘啊,它还有一个这个文件a.com,如果说我不指定。刚才的那个叫萨帕。我们一起来看一下啊,对吧,我这里写这个SPA,如果我不指定这个的话,那么。挂载,那我就会把这个com.d里面的这个目录结构给改变,也就是说我这个如果说不指定s pass, 我这里边只有99.com复了,那我的default.com就会被覆盖掉。好吧,这块比较重要哈,因为这个是经常会出问题的一个点,所以我这里多强调一下。好,这一块就没有任何问题了,我们把它回退掉E。杠,F deploy first TL cm, 我们或者把这个给删掉了,First t.
21:02
然后map。好,下面我们来做一个什么实验呢?配置急电挂载,哎,我们已经掌握了,那么还有一种方式就是通过变量注入。他是怎么注入的呢?我这里准备两个文件哈,一个叫尼姑子,一个叫。一个内容叫做苏小娟。Pass的内容是宋新更。啊。那么现在呢,我们再创建一个computer贝ER ma资源,把这两个是吧key和value全部都注入到一个computer贝ER map文件里面。好吧,来,我们一起来操作一下啊,库贝尔CTLA,然后我创建什么呢?卡格麦克资源,卡米格麦克资源的名字叫做菲麦更,嗯,里头有吧。明细是吧,然后杠杠from file等于等于什么呢?我是不是该指定文件了,这个目录下的user文件,好吧,然后再来一个。
22:09
份等于这个目录下的。Pass.这个相当于是把这两个文件。呃,文件名和图全部注入到这个外这个资源里面去。我同学。我们一起来看一下啊,DFCM一个叫computer。这个卖耕地资,我们一起来看一下它的明细。是不是注入成功了呀,是吧?Pass就叫苏小轩杠pass us就叫苏晓轩。注入成功了,那么我们是不是应该在压迫文件里面,哎,声明引用一下。我这里也提前准备好了这份年报文件,好吧,我们一起来看一下。读一下哈。嗯,API version, 我要用这个V1版本的这个接口组,然后kind。
23:05
Data, 我要给这个port起个名字叫test gun.Like规格描述来看一下它要起一个容器,容器的名字叫做苏小轩gun容器的镜像引用NEX冒号it。嗯,容器的拉取策略是not present, 意思是本地有就用本地的,如果本地没有就从远端仓库拉取。然后再看下面这个比较重要的话,我这里指定了一个command command命令,也就是在容器启动之后,我会让他执行一个什么呢,因为。EV是输出环境变量的一个命令是吧?来,然后我们再来看一下,我这里引入这个变量了,指定的e na, 然后EVA的名字叫什么呢?叫user,当然了,这个可以自己指定啊,User, 但是值来源于哪里呢?你看。
24:00
Value from是吧?值来自哪儿呢?Con map king, 相当于是computer map引用。然后conveger map的名字,我们刚才指定了conve map-detail,然后conve map的key是不是有两个呀,一个一个user,一个pass,对吧?哎,我这里把user的值复制过来。相当于就是把user的值赋值给了容器里这个变量的值。好吧,然后呢,我又指定了第二个变量名字叫做pass,然后指引只来自卡map的一个资源conve map的资源名字叫什么呢?卡Map detail, 然后呢,卡map里面不是有两个,嗯,这个叫。呃,K和value嘛,对吧,我这里又把这个pass,哎,赋值给了这个容器里边的这个变量。好,我们来执行一下本c LA ly-f port的杠M回车。
25:03
好。然后我们来看一下这个破,哎,这个坡的状态,现在是completed什么意思呢?完成了,那么我们来看一下它。他完成。你可以在完成之前他做了哪些动作,我们可以通过logs来看一下它的日志。因为我们指定要输出一下他的EV对吧。哎,回正。来找一下啊,有没有复制成功。嗯,来这里USA是不是等于苏小轩?是不是复制进去了。然后我们再找一下这个pass啊,Pass在这里,Pass等于苏小娟pass。对不对,相当于是我指定了一个变量,但是这个变量的值呢,来自于con map.这个就是computer map使用的一个场景,一种是通过变量注入,一种是通过配置文件挂载。
26:02
好吧,到这里的话,Config map的使用就结束了,如果说后面同学们还有什么疑问,可以在评论区留言,当然了,也可以单独给我私信。最后呢,感谢大家的观看,我们再见。
我来说两句