云计算时代操作系统Kubernetes之配置管理(中)

接着上篇文章的话题,我们继续讨论应用程序容器化部署后的配置管理。容器化应用除了可以在启动的时候通过command和args来指定启动命令和参数,很多时候我们也需要为每个POD设置环境变量(env variables),来提供应用运行的上下文信息,如下图所示:

《图1.1 在容器级别设置环境变量》

如上图所示,我们可以为每一个容器实例设置一套环境变量。这里需要读者注意的是,环境变量在最新版本的Kubernetes版本上,只支持设置在容器级别,这就意味着你无法设置POD级别的全局环境变量,但是后续Kubernetes版本有可能支持。环境变量可以被设置为”字面值“,或者引用另外一个环境变量的值,以及依赖外部的信息来初始化。接下来我们分别来介绍一下不同的设置方式。

我们可以在Dockerfile中使用ENV参数来进行环境变量的设置,但是修改环境变量就需要重新构建镜像,因此更好的做法是在POD的YAML文件定义中,如下图所示:

《图1.2 在POD定义YAML文件中设置环境变量》

从上图可以看出,env字段支持的是数组类型,因此我们可以通过name/value组合定义多个环境变量并赋值。话不多说,我们赶紧把上边的YAML文件部署到自己的集群中,然后运行kubectl exec yunpan-env -- env,在笔者的机器上输出如下:

《图1.3 POD中看到的环境变量列表》

如上图所示,env命令输出的环境变量远超我们的预期,读者也可以看到我们在POD的YAML文件中设置的环境变量显示在返回的清单中。环境变量的来源有多个,有些定义在容器镜像中,有些属于Kubernetes管理追加的,还有很多其他的源头。不幸的是我们无法从输出的环境变量列表确定具体的源头,但是我们一般情况下会只关心在Dockerfile或者POD的YAML文件中定义的配置项。

一般情况下,环境变量给应用程序提供配置信息,来支持特定的业务场景,接下来我们在我们的代码中直接读取环境变量,并返回给客户端的http请求,来看看我们的配置是否生效。如下图所示:

《图1.4 从应用中引用环境变量并输出》

从上图可以看到,我们从node应用程序中可以获取在POD的YAML文件或者Dockerfile中定义的环境变量,我们通过修改这些参数,就可以提供不同的数据给容器实例。但是,不知道大家是否已经发现了问题,无论是在Dockerfile中设置环境变量,还是在POD的YAML文件中设置环境变量,本质上是另外一种形式的"硬编码“,如何理解这句话呢?

在Dockerfile配置的环境变量,如果我们需求修改,更新这些变量的值,我们需要重新构建容器镜像,耗时耗力耗带宽和时间啊,这和直接修改源代码重新打包编译有相同的”坏味道“。聪明的你可能会说,那我写POD的YAML文件里啊。没错,如前边的介绍,我们可以在POD的YAML文件中重写环境变量,但是这又是另外一种代码修改,区别只是你不需要编译而已,本质上编译的过程是Kubernetes,从这个角度讲,你可以把Kubernetes看成是解析执行YAML文件的”编译+运行时“,也耗费时间和精力啊,因为我们要分别为不同的环境,不同的版本拷贝不同的YAML文件,唯一的区别就是几个字段的值,大部分内容都相同,如果你改了某个共用的字段,你可能需要同时维护10-20个不同的YAML文件,对文本文件进行修改,风险是极高的,比如0和O,眼神不好的同学,几乎无感。

那么有没有好的做法,让我们把容器化应用的配置和代码进行解耦呢?Kubernetes社区当然也知道这个问题,因此设计了ConfigMap对象,来解耦容器化应用的配置,接下来我们介绍一下ConfigMap。

在Kubernetes平台上,ConfigMap对象用来保存一组key-value值,并且value可以是字符串,也可以是一大块结构化的文本,常见于应用配置文件中。POD可以在运行的过程中,读取这些key的值,并且一个POD可以在YAML文件中引用多个ConfigMap,多个POD也可以引用到相同的ConfigMap。

为了让引用程序不强依赖于Kubernetes平台,通常情况下应用程序不直接读取ConfigMap中的配置项信息,取而代之的是,ConfigMap对象会作为环境变量注入到容器的上下文中,或者作为文件挂载到容器中,如下图所示:

《图1.5 容器通过环境变量或者configMap数据卷来访问配置项信息》

对于云原生应用来说,将配置信息和POD定义解耦到不同的文件中可以提升部署的灵活性,这样我们就可以用一套YAML文件和不同的环境配置信息ConfigMap的方案,来应对环境配置的差异。由于应用程序读取configMap中配置信息是通过key,因此我们在不同的环境加载对应的configMap配置信息,应用就可以获得对应环境的配置,按预期的方式运行,如下图所示:

《图1.6 通过configMap来配置不同的环境》

如上图所示,我们可以通过不同的configMap来提供配置信息给对应的运行环境,这样就可以不用修改POD的YAML文件和Dockerfile文件,满足在多个环境中部署的需求。接下来,我们来实际在自己的集群上实际操作一下,看看是否符合预期。

由于我们只是演示之用,因此我们的configMap对象会非常简单,只包含POD初始化键值对。并且正常情况下,我们需要通过YAML文件来创建configMap,但是一种更加高效的方法就是直接从kubectl命令行来创建。我们可以通过命令:kubectl create configmap yunpan-config --from-literal status-message="从configMap读取到的应用启动信息"。

注:定义configMap的时候,key只能包含英文字母,下划线和点,其他字符不被允许。运行上边的命令会在集群中创建一个叫yunpan-config的configMap对象,并且包含status-message为key的键值对。通常情况下ConfigMap包含一组键值对,并且除了使用--from-literal之外,Kubernetes还支持--from-file和--from-env-file,来分别从不同的源注入键值对。

大部分情况下,开发和运维人员都是通过编写YAML文件来创建configMap文件,如下图所示,我们可以通过YAML文件来定义相同的配置项信息:

《图1.7 通过YAML文件来定义configMap对象》

接下来我们把yunpan-config.yaml定义的configMap部署到本地集群,并通过kubect get cm来罗列机器上所有的configMap,输出如下:

➜  Kubernetes配置管理 kubectl apply -f yunpan-config.yaml

configmap/yunpan-config created

➜  Kubernetes配置管理 kubectl get cm

NAME                                          DATA  AGE

(删除若干.....)

yunpan-config                                1      3s

另外我们可以通过命令kubectl get cm kiada-config -o yaml来查看configMap的详细信息,为了不给文章注水,我就不贴大段的输出了,笔者可以在自己的集群上验证。我们可以从输出的信息中,找到代表配置项的键值对。

有了配置信息,接下来我们来把配置信息用起来。我们可以在POD的YAML文件定义中,使用valueFrom来将配置信息注入到容器的运行环境中,如下图所示:

《图1.8 将configMap定义的配置信息注入到POD》

如上图所示,高亮部分显示了如何从configMap来注入配置信息,简单明了,笔者就不浪费时间解释了。接下来我们来创建这个POD,验证一下环境变量已经被成功注入,如下图所示所示:


《图1.9 验证环境变量是否被成功注入》

好了,今天的内容就这么多了,我们下篇文章介绍如何将configMap以及文件的形式挂载到容器中,敬请关注!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,056评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,842评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,938评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,296评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,292评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,413评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,824评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,493评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,686评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,502评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,553评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,281评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,820评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,873评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,109评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,699评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,257评论 2 341

推荐阅读更多精彩内容