ConfigMap
作为Kubernetes
中配置资源存储对象,通过ConfigMap
可以存储各种各样的配置文件,具体使用方式: 深入探究 K8S ConfigMap 和 Secret,但在使用过程中会碰到各种不方便,一般情况下,特别是没有接入分布式配置中心的服务,配置文件是存储在服务所在特定目录下,这就导致需要我们把配置copy
或者load
到Kubernetes ConfigMap
配置资源对象中,因为ConfigMap
使用yaml
格式进行存储,改变原来的使用习惯,使用和修改过程中难免出错,于是就引入了ConfigMapGenerator
, 它是Kustomize ConfigMap
自动生成配置插件,使用方式非常简单,如下图所示:
执行kubectl apply -k .
执行完成之后查看ConfigMap
, ConfigMap
倒是生成了,但是后边多了一堆hash
字符串如:test-conf-tmc5f824gt
什么鬼?我deployment
里面还需要引用这个ConfigMap
呢,通过测试发现这个hash
后缀,是针对文件内容生成的hash
,如果文件内容没有变化,这个hash
不会变化,否则重新生成。原来这个hash
类似于ConfigMap
版本的一个概念,但是我在使用过程中对配置文件的版本没有什么要求,通过查看文档可以发现https://github.com/kubernetes-sigs/kustomize/blob/master/examples/generatorOptions.md
,只需要添加参数,即可去除版本号后缀:
一顿操作之后,就可以通过一个引用把配置自动生成ConfigMap
资源对象,这样的话,如果配置出现变化,只需要修改我们原来的配置文件,然后重新生成即可完成ConfigMap
的更新,而且不会出什么错误了。
但是当我通过kubectl
获取ConfigMap
配置信息之后,日志xml
文本中出现了大量的\n\t
,虽然不影响使用,但是看起来糟心,而且当我们需要临时修改配置的时候,看起来眼花缭乱,影响工作效率。(当然普通的properties
配置文件也可能会出现这种问题,但是KV
对配置文件很少使用tab
缩进功能)什么原因呢?通过idea
编辑器打开隐藏字符(或者通过vim set list
功能,也可以显示隐藏字符),会发现xml
文件中存在tab
缩进字符,而对于Kubernetes yaml
编排文件不允许使用tab
只能使用空格,如下图所示。
猜测原因是因为Kubernetes ConfigMap
在load
过程中发现文件中包含tab
缩进,直接转化为\n\t
,如果把文本里面的tab全部替换空格,会不会直接解决问题呢?按照这个思路,我通过编辑器正则表达式把\t
替换为4
个空格,再次上传日志配置文件,之后通过ConfigMapGenerate生成配置时,发现问题已经解决,如下所示:
当然你也可以使用xmllint --format logback.xml -o logback.xml
进行格式化配置文件,通过这种方式也可以解决如上问题,另外因为配置文件的编辑可能在windows
操作系统上,而ConfigMap
的生成在linux
,这会导致文件中出现^M
不可见字符,可以使用dos2unix
转换文件格式,解决该问题。
本文主要介绍了如何使用Kustomize ConfigMapGenerate
自动生成Kubernetes ConfigMap
资源存储对象,以及生成的配置信息出现格式错乱问题如何解决。