跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • kubernates ConfigMap 和 Secret 遇到的实际问题
未分類
21 7 月 2020

kubernates ConfigMap 和 Secret 遇到的实际问题

kubernates ConfigMap 和 Secret 遇到的实际问题

資深大佬 : dunhanson 6

问题

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 )

思考

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

大佬有話說 (33)

  • 主 資深大佬 : dunhanson

    例如:
    spring boot 项目,配置文件:application.yml ,配置文件中包含数据库连接配置。
    application.yml 单独创建一个 configmap,然后进行挂载,但是数据库连接配置要单独抽离出来创建一个 configmap 或者 secret 用于公用。这样要修改数据库配置的时候只需要修改一个 configmap 。
    但是如何把 configmap 中的数据库配置信息覆盖掉 application.yml 中的

  • 資深大佬 : Bromine0x23

    spring boot 的话,不同数据库的配置分到不同的 profile 里,然后按使用情况启用 profile ?

  • 主 資深大佬 : dunhanson

    @Bromine0x23 数据库配置要抽离成单独的 configmap,因为不同的项目都要用到,也不是每个项目都是 spring boot

  • 資深大佬 : yangbonis

    我的话,会用 kubectl 读 secret,读 configmap,sed 组合下再 apply 。

  • 資深大佬 : yangbonis

    要不就给 k8s 加个 configmap 嵌套引用的功能

  • 資深大佬 : napsterwu

    比如:configMap 里面有个配置叫 profile,挂载到 /etc/config 启动脚本调整为 java -jar app.jar —spring.profiles.active=$(cat /etc/config/profile)。yml 里面的值都可以通过继续— 替换掉

  • 資深大佬 : napsterwu

    可以多去看看腾讯云 tke 的文档,比较完善

  • 資深大佬 : calmzhu

    configMap 注入环境变量,然后在 springboot 的 application.yml 直接配置读环境变量应该可以

  • 資深大佬 : Bromine0x23

    @dunhanson 其实我没看懂问题到底在哪,如果说是复用问题的话,可以用一个 configmap/secret,各个部署自己拣选需要的配置项导入环境变量

  • 主 資深大佬 : dunhanson

    @yangbonis

  • 主 資深大佬 : dunhanson

    @napsterwu 我的意思替换 yml 中的配置文件需要自己单独写脚本来完成?

  • 主 資深大佬 : dunhanson

    @calmzhu 我只是举例子 spring boot,也有其它非 spring boot 项目

  • 主 資深大佬 : dunhanson

    @Bromine0x23 导入环境变量我知道,但是还需要把“环境变量中的配置信息”覆盖“对应项目中的配置文件信息”,这一步不太清楚有哪些方式可以达到

  • 資深大佬 : calmzhu

    @dunhanson
    其他的代码类型的话,可能都是对代码有侵入了。
    阿波罗配置中心之类,不过略重。
    帐户密码更新后,怎么通知代码重载是个问题。

  • 資深大佬 : calmzhu

    或者,最粗暴的方式。
    把所有 aksk/帐户密码放在阿里云 /aws/自建 valut 之类的密码箱里集成到发布平台,每次项目发布时通过 api 拿到帐户密码,然后正则替换代码的配置文件。
    好处就是对代码无侵入,缺点就是更新个帐户密码,全部重新发一遍,有的应用发到吐。

  • 資深大佬 : binux

    docker 的部署时配置标准就是环境变量,你非得问配置文件,那你自己处理去啊,不行你看看你用的框架有没有环境变量或者 secret 支持啊。
    重要信息放环境变量不安全,你写文件里面就安全了?

  • 資深大佬 : NaVient

    K8S 的 secret 哲学就是密码不落地,在 k8s master 上启动一个服务调用 K8S API 更新 secret 是最优解

  • 資深大佬 : yuedingwangji

    我们都是一个 pod 一个 cm 或 secret

  • 主 資深大佬 : dunhanson

    @calmzhu 了解,谢谢了

  • 主 資深大佬 : dunhanson

    @binux 莫激动,我只是问下有没有更好或者其它的方法而已

  • 資深大佬 : vhwwls

    nacos 和 spring cloud config server 之类的项目就是为了解决这种问题存在的。kubernetes 自己提供的方式只是一个设计理念,告诉你可以这么干,是不是最优解还是要自己权衡。

  • 資深大佬 : momocraft

    为什么一定要用配置文件呢
    自己要用就自己解决,sed+exec 也算一种解决

  • 資深大佬 : YzSama

    搞一个 配置中心? 然后应用去监听配置和自动重启加载配置。

  • 資深大佬 : momocraft

    可能 cat 出一个长模板再 exec 更省事

  • 資深大佬 : 37Y37

    我们大概是这样的方案,可以参考下:

    – 代码中敏感信息加密: https://blog.ops-coffee.cn/s/dpgqiel4wcmgdqh1aeg4gw
    – 配置管理利用 etcd+confd,k8s 的 config map 也用到了 etcd,你可以考虑下 confd 这服务,还是很好用的: https://blog.ops-coffee.cn/s/uguvv4jl4yivnztuepdc8a

  • 資深大佬 : ypcs03

    https://github.com/kubernetes/kubernetes/issues/79224 应该不会 native 支持了
    可以试试 init container 预处理

  • 主 資深大佬 : dunhanson

    @momocraft 不怎么折腾确实可以用 sed

  • 主 資深大佬 : dunhanson

    @YzSama 嗯 ,上面有人提到阿波罗,准备有时间看下的

  • 主 資深大佬 : dunhanson

    @37Y37 @ypcs03 好的,谢谢,我了解下

  • 資深大佬 : joesonw

    用 initContainer 跑脚本注入呗.

  • 主 資深大佬 : dunhanson

    @joesonw 对的,这个参数可以用。之前没看到过,专门讲 pod 章节没写到这个参数。

  • 資深大佬 : joesonw

    @dunhanson 要是不懒的话, 写个 mutation-webhook-controller, 自动注入 initContainer.

    或者 https://github.com/dstreamcloud/configmap-map-operator 这我自用的, 合并 config-map, 不嫌弃的话可以用一用, 就是没文档. 不过是用的 operator-framework 写的, 逻辑部分极简, 可以看一看.

  • 主 資深大佬 : dunhanson

    @joesonw

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具