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 )
不晓得还有没有其他的方式?
1
dunhanson OP 例如:
spring boot 项目,配置文件:application.yml ,配置文件中包含数据库连接配置。 application.yml 单独创建一个 configmap,然后进行挂载,但是数据库连接配置要单独抽离出来创建一个 configmap 或者 secret 用于公用。这样要修改数据库配置的时候只需要修改一个 configmap 。 但是如何把 configmap 中的数据库配置信息覆盖掉 application.yml 中的 |
2
Bromine0x23 2020-07-14 23:37:44 +08:00
spring boot 的话,不同数据库的配置分到不同的 profile 里,然后按使用情况启用 profile ?
|
3
dunhanson OP @Bromine0x23 数据库配置要抽离成单独的 configmap,因为不同的项目都要用到,也不是每个项目都是 spring boot
|
4
yangbonis 2020-07-14 23:55:38 +08:00 via iPhone
我的话,会用 kubectl 读 secret,读 configmap,sed 组合下再 apply 。
|
5
yangbonis 2020-07-14 23:58:20 +08:00 via iPhone
要不就给 k8s 加个 configmap 嵌套引用的功能
|
6
napsterwu 2020-07-15 00:00:23 +08:00 via iPhone
比如:configMap 里面有个配置叫 profile,挂载到 /etc/config 启动脚本调整为 java -jar app.jar —spring.profiles.active=$(cat /etc/config/profile)。yml 里面的值都可以通过继续— 替换掉
|
7
napsterwu 2020-07-15 00:01:00 +08:00 via iPhone
可以多去看看腾讯云 tke 的文档,比较完善
|
8
calmzhu 2020-07-15 00:05:11 +08:00
configMap 注入环境变量,然后在 springboot 的 application.yml 直接配置读环境变量应该可以
|
9
Bromine0x23 2020-07-15 00:15:15 +08:00
@dunhanson 其实我没看懂问题到底在哪,如果说是复用问题的话,可以用一个 configmap/secret,各个部署自己拣选需要的配置项导入环境变量
|
13
dunhanson OP @Bromine0x23 导入环境变量我知道,但是还需要把“环境变量中的配置信息”覆盖“对应项目中的配置文件信息”,这一步不太清楚有哪些方式可以达到
|
14
calmzhu 2020-07-15 00:33:20 +08:00
|
15
calmzhu 2020-07-15 00:48:57 +08:00
或者,最粗暴的方式。
把所有 aksk/帐户密码放在阿里云 /aws/自建 valut 之类的密码箱里集成到发布平台,每次项目发布时通过 api 拿到帐户密码,然后正则替换代码的配置文件。 好处就是对代码无侵入,缺点就是更新个帐户密码,全部重新发一遍,有的应用发到吐。 |
16
binux 2020-07-15 08:11:09 +08:00 via Android
docker 的部署时配置标准就是环境变量,你非得问配置文件,那你自己处理去啊,不行你看看你用的框架有没有环境变量或者 secret 支持啊。
重要信息放环境变量不安全,你写文件里面就安全了? |
17
NaVient 2020-07-15 09:05:17 +08:00
K8S 的 secret 哲学就是密码不落地,在 k8s master 上启动一个服务调用 K8S API 更新 secret 是最优解
|
18
yuedingwangji 2020-07-15 09:18:54 +08:00 via Android
我们都是一个 pod 一个 cm 或 secret
|
21
vhwwls 2020-07-15 09:23:30 +08:00
nacos 和 spring cloud config server 之类的项目就是为了解决这种问题存在的。kubernetes 自己提供的方式只是一个设计理念,告诉你可以这么干,是不是最优解还是要自己权衡。
|
22
momocraft 2020-07-15 10:09:59 +08:00
为什么一定要用配置文件呢
自己要用就自己解决,sed+exec 也算一种解决 |
23
YzSama 2020-07-15 10:21:44 +08:00
搞一个 配置中心? 然后应用去监听配置和自动重启加载配置。
|
24
momocraft 2020-07-15 10:46:50 +08:00
可能 cat 出一个长模板再 exec 更省事
|
25
37Y37 2020-07-15 11:04:55 +08:00
我们大概是这样的方案,可以参考下:
- 代码中敏感信息加密: https://blog.ops-coffee.cn/s/dpgqiel4wcmgdqh1aeg4gw - 配置管理利用 etcd+confd,k8s 的 config map 也用到了 etcd,你可以考虑下 confd 这服务,还是很好用的: https://blog.ops-coffee.cn/s/uguvv4jl4yivnztuepdc8a |
26
ypcs03 2020-07-15 12:13:41 +08:00
https://github.com/kubernetes/kubernetes/issues/79224 应该不会 native 支持了
可以试试 init container 预处理 |
30
joesonw 2020-07-15 13:14:01 +08:00
用 initContainer 跑脚本注入呗.
|
32
joesonw 2020-07-15 17:37:04 +08:00
@dunhanson 要是不懒的话, 写个 mutation-webhook-controller, 自动注入 initContainer.
或者 https://github.com/dstreamcloud/configmap-map-operator 这我自用的, 合并 config-map, 不嫌弃的话可以用一用, 就是没文档. 不过是用的 operator-framework 写的, 逻辑部分极简, 可以看一看. |