Kustomize ConfigMapGenerate自动生成ConfigMap中的坑
背景问题
最近在使用Kubernetes ConfigMap
过程中,由于需要把配置文件复制ConfigMap yaml
编排文件中,在copy
的过程中,容易出错,于是引入了Kustomize ConfigMapGenerate
,通过引用外部配置文件,自动生成配置,但在使用过程中碰到新问题。
-
ConfigMap
名称生成多余hash
。 -
加载到配置文件中内容格式错乱。
以下分别对这两个个问题进行分析、并给出具体解决方式。
ConfigMapGenerate使用
ConfigMapGenerator
是Kustomize ConfigMap
自动生成配置插件,使用方式非常简单,如下图所示:
执行kubectl apply -k .
执行完成之后查看ConfigMap
, ConfigMap
倒是生成了,但是后边多了一堆hash
字符串如:test-conf-tmc5f824gt。
。
why?
deployment
里面还需要引用这个ConfigMap
呢?通过测试发现这个hash
后缀,是针对文件内容生成的hash
,如果文件内容没有变化,这个hash
不会变化,否则重新生成。
原来这个hash
类似于ConfigMap
版本的一个概念,但是我在使用过程中对配置文件的版本没有什么要求。
解决方案
通过查看文档可以发现https://github.com/kubernetes-sigs/kustomize/blob/master/examples/generatorOptions.md
,只需要添加参数即可控制版本号变化:
一顿操作之后,就可以通过一个引用把配置自动ConfigMap
资源对象,我们只需要修改我们原来的配置文件,然后重新生成即可完成ConfigMap
的更新,而且不会出现多余字符串,当然如果你使用了helm
等模板工具,可以考虑使用这个版本号,这样的话ConfigMap
也有了版本的概念。
ConfigMap中文本错乱
当我通过kubectl
获取ConfigMap
配置信息之后,日志xml
文本中出现了大量的\n\t
,虽然不影响使用,但是看起来糟心,而且当我们需要临时修改配置的时候,看起来眼花缭乱,影响工作效率。(当然普通的properties
配置文件也可能会出现这种问题,但是KV
对配置文件很少使用tab
缩进功能)
why?
通过idea
编辑器打开隐藏字符(或者通过vim set list
功能,也可以显示隐藏字符),会发现xml
文件中存在tab
缩进字符,而对于Kubernetes yaml
编排文件不允许使用tab
只能使用空格,如下图所示。
原因分析
猜测原因是因为Kubernetes ConfigMap
在load
过程中发现文件中包含tab
,直接转化为\n\t
。如果把文本里面的tab全部替换空格,会不会直接解决问题呢?按照这个思路,我得到了如下两种解决方式。
解决方案(1)
通过编辑器正则表达式把\t
替换为4
个空格,再次上传日志配置文件,之后通过ConfigMapGenerate生成配置时,发现问题已经解决,如下所示:
解决方案(2)
使用xmllint --format logback.xml -o logback.xml
进行格式化配置文件,通过这种方式也可以解决如上问题。
另外因为配置文件的编辑可能在windows
操作系统上,而ConfigMap
的生成在linux
,这会导致文件中出现^M
不可见字符,可以使用dos2unix
转换文件格式,解决该问题。
总结
本文主要介绍了如何使用Kustomize ConfigMapGenerate
自动生成Kubernetes ConfigMap
资源存储对象,以及生成的配置信息出现格式错乱问题如何解决。希望能够帮助到大家,谢谢。
推荐阅读
Kustomize 轻松解决多环境 yaml 编排文件的管理
完整的Kubernetes Deployment yaml文件应该包含什么?
原创不易,随手关注或者”三连“,诚挚感谢!
本文分享自微信公众号 - 云原生技术爱好者社区(programmer_java)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
实例分析如何远离漫天飞舞的全局变量
关注、星标 嵌入式客栈 ,精彩及时送达 [ 导读]大家好,首先欢迎来了很多新朋友!感谢关注小号,我将一如既往认真分享,广交朋友,共同进步!前篇《由static来谈谈模块封装》基本实现了对外隐藏属性,隐藏局部模块函数,开放接口的功能。对于这个话题还有些点没有深入探讨:为什么要这样做?以及这样做的好处。或许很多刚刚开始用C或者其他面向对象编程语言(比如C++)的小伙伴们,常常在一个项目里为了图省事,整了很多全局对象、全局变量满天飞,这样做其实是有很多弊端,本文来聊聊这个话题。 先谈谈全局变量的特点 全局变量(Global Variables):在计算机编程语言中,所谓全局变量是指具有全局作用域的变量,这意味着它在整个程序中是可见的,因此是可访问的。所谓可访问,是指全局可读、全局可写。在编译语言中,全局变量通常是静态变量,其范围(生命周期)是程序的整个运行时。当然解释性语言除外,解释性语言包括命令行解释器(比如python, Java script,shell等)中,全局变量通常在声明时由解释器动态分配,这是由于解释性语言是读取>解释>执行模式,不像编译性语言,运行前可预知变量属...
- 下一篇
算法篇:树之树的高度
算法: 这一类题目很简单,不过却是树的最基本操作之一,引申为判断树是不是平衡二叉树。 一般做法是,计算二叉树的左右子树的高度+1,然后取它们的最大值或者最小值。 题目1: https://leetcode-cn.com/problems/balanced-binary-tree/ 代码实现: /** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ // 一棵平衡二叉树,左右两棵子树的高度差的绝对值不超过1 // 备注:其中任意一个节点如果不满足平衡二叉树时,那么这棵树就不是平衡二叉树了,此时我们可以直接返回flasefunc isBalanced(root *TreeNode) bool { if root == nil { // nil表示的是平衡二叉树 return true } // 1.用来计算当前节点的左右子树高度差是1 lH := maxDepth(root.Left) rH := maxDept...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2整合Thymeleaf,官方推荐html解决方案