kubernates ConfigMap 和 Secret 遇到的实际问题

2020-07-14 23:23:03 +08:00
 dunhanson

问题

ConfigMap 主要的用法有两种,一种是挂载变成环境变量,第二种是挂载变成目录或者文件

但是实际还有一种情况,无法覆盖到,那就是数据库连接配置,有 N 个项目对应 N 个 pod 。

假如我创建一个 Secret,其中包含线上的数据库连接地址、和账号密码配置。(键值对映射方式)

那么我怎么把对应的配置文件中的数据配置替换成 Secret 中的

PS:可以通过挂载文件的方式覆盖项目配置文件,但是数据库连接配置不能这样子,假如我有 N 个项目,我要修改数据库密码,不可能每个项目对应的 configmap 都去修改一遍这个效率太低了

方案

我想到的方式是假如 dockerfile 中的 CMD 命令是启动 catalina.sh ,那么新建一个 sh 脚本文件,里面包含读取

Secret 环境变量(或者读取挂载文件)中的数据库配置信息然后替换掉对应的项目中的配置,再启动 catalina.sh

PS:pod yaml 文件 containers 中的 command 改成新建的 sh 脚本文件( command 可以覆盖 dockerfile CMD )

思考

不晓得还有没有其他的方式?

3074 次点击
所在节点    Kubernetes
33 条回复
dunhanson
2020-07-14 23:29:58 +08:00
例如:
spring boot 项目,配置文件:application.yml ,配置文件中包含数据库连接配置。
application.yml 单独创建一个 configmap,然后进行挂载,但是数据库连接配置要单独抽离出来创建一个 configmap 或者 secret 用于公用。这样要修改数据库配置的时候只需要修改一个 configmap 。
但是如何把 configmap 中的数据库配置信息覆盖掉 application.yml 中的
Bromine0x23
2020-07-14 23:37:44 +08:00
spring boot 的话,不同数据库的配置分到不同的 profile 里,然后按使用情况启用 profile ?
dunhanson
2020-07-14 23:48:40 +08:00
@Bromine0x23 数据库配置要抽离成单独的 configmap,因为不同的项目都要用到,也不是每个项目都是 spring boot
yangbonis
2020-07-14 23:55:38 +08:00
我的话,会用 kubectl 读 secret,读 configmap,sed 组合下再 apply 。
yangbonis
2020-07-14 23:58:20 +08:00
要不就给 k8s 加个 configmap 嵌套引用的功能
napsterwu
2020-07-15 00:00:23 +08:00
比如:configMap 里面有个配置叫 profile,挂载到 /etc/config 启动脚本调整为 java -jar app.jar —spring.profiles.active=$(cat /etc/config/profile)。yml 里面的值都可以通过继续— 替换掉
napsterwu
2020-07-15 00:01:00 +08:00
可以多去看看腾讯云 tke 的文档,比较完善
calmzhu
2020-07-15 00:05:11 +08:00
configMap 注入环境变量,然后在 springboot 的 application.yml 直接配置读环境变量应该可以
Bromine0x23
2020-07-15 00:15:15 +08:00
@dunhanson 其实我没看懂问题到底在哪,如果说是复用问题的话,可以用一个 configmap/secret,各个部署自己拣选需要的配置项导入环境变量
dunhanson
2020-07-15 00:22:02 +08:00
@yangbonis 🤣不是很明白
dunhanson
2020-07-15 00:23:05 +08:00
@napsterwu 我的意思替换 yml 中的配置文件需要自己单独写脚本来完成?
dunhanson
2020-07-15 00:23:34 +08:00
@calmzhu 我只是举例子 spring boot,也有其它非 spring boot 项目
dunhanson
2020-07-15 00:24:56 +08:00
@Bromine0x23 导入环境变量我知道,但是还需要把“环境变量中的配置信息”覆盖“对应项目中的配置文件信息”,这一步不太清楚有哪些方式可以达到
calmzhu
2020-07-15 00:33:20 +08:00
@dunhanson
其他的代码类型的话,可能都是对代码有侵入了。
阿波罗配置中心之类,不过略重。
帐户密码更新后,怎么通知代码重载是个问题。
calmzhu
2020-07-15 00:48:57 +08:00
或者,最粗暴的方式。
把所有 aksk/帐户密码放在阿里云 /aws/自建 valut 之类的密码箱里集成到发布平台,每次项目发布时通过 api 拿到帐户密码,然后正则替换代码的配置文件。
好处就是对代码无侵入,缺点就是更新个帐户密码,全部重新发一遍,有的应用发到吐。
binux
2020-07-15 08:11:09 +08:00
docker 的部署时配置标准就是环境变量,你非得问配置文件,那你自己处理去啊,不行你看看你用的框架有没有环境变量或者 secret 支持啊。
重要信息放环境变量不安全,你写文件里面就安全了?
NaVient
2020-07-15 09:05:17 +08:00
K8S 的 secret 哲学就是密码不落地,在 k8s master 上启动一个服务调用 K8S API 更新 secret 是最优解
yuedingwangji
2020-07-15 09:18:54 +08:00
我们都是一个 pod 一个 cm 或 secret
dunhanson
2020-07-15 09:21:00 +08:00
@calmzhu 了解,谢谢了
dunhanson
2020-07-15 09:21:52 +08:00
@binux 莫激动,我只是问下有没有更好或者其它的方法而已

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/690082

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX