V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dunhanson
V2EX  ›  Kubernetes

kubernates ConfigMap 和 Secret 遇到的实际问题

  •  
  •   dunhanson · 2020-07-14 23:23:03 +08:00 · 3042 次点击
    这是一个创建于 1593 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题

    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 条附言  ·  2020-07-15 00:26:12 +08:00
    项目不值 spring boot,还有其它类型的
    第 2 条附言  ·  2020-07-15 00:28:48 +08:00
    可能我的表达不是很清晰。。。

    我的想实现的效果是,有没有一种通用的方式,可以把 configmap/secret 中的数据库配置

    覆盖掉对应的项目中配置文件的配置(目标对象配置文件可能是 txt 、xml 、yaml 、properties )
    第 3 条附言  ·  2020-07-15 00:31:50 +08:00
    把重要信息读取放入环境变量中会不会不安全?
    33 条回复    2020-07-15 22:52:16 +08:00
    dunhanson
        1
    dunhanson  
    OP
       2020-07-14 23:29:58 +08:00
    例如:
    spring boot 项目,配置文件:application.yml ,配置文件中包含数据库连接配置。
    application.yml 单独创建一个 configmap,然后进行挂载,但是数据库连接配置要单独抽离出来创建一个 configmap 或者 secret 用于公用。这样要修改数据库配置的时候只需要修改一个 configmap 。
    但是如何把 configmap 中的数据库配置信息覆盖掉 application.yml 中的
    Bromine0x23
        2
    Bromine0x23  
       2020-07-14 23:37:44 +08:00
    spring boot 的话,不同数据库的配置分到不同的 profile 里,然后按使用情况启用 profile ?
    dunhanson
        3
    dunhanson  
    OP
       2020-07-14 23:48:40 +08:00
    @Bromine0x23 数据库配置要抽离成单独的 configmap,因为不同的项目都要用到,也不是每个项目都是 spring boot
    yangbonis
        4
    yangbonis  
       2020-07-14 23:55:38 +08:00 via iPhone
    我的话,会用 kubectl 读 secret,读 configmap,sed 组合下再 apply 。
    yangbonis
        5
    yangbonis  
       2020-07-14 23:58:20 +08:00 via iPhone
    要不就给 k8s 加个 configmap 嵌套引用的功能
    napsterwu
        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 里面的值都可以通过继续— 替换掉
    napsterwu
        7
    napsterwu  
       2020-07-15 00:01:00 +08:00 via iPhone
    可以多去看看腾讯云 tke 的文档,比较完善
    calmzhu
        8
    calmzhu  
       2020-07-15 00:05:11 +08:00
    configMap 注入环境变量,然后在 springboot 的 application.yml 直接配置读环境变量应该可以
    Bromine0x23
        9
    Bromine0x23  
       2020-07-15 00:15:15 +08:00
    @dunhanson 其实我没看懂问题到底在哪,如果说是复用问题的话,可以用一个 configmap/secret,各个部署自己拣选需要的配置项导入环境变量
    dunhanson
        10
    dunhanson  
    OP
       2020-07-15 00:22:02 +08:00
    @yangbonis 🤣不是很明白
    dunhanson
        11
    dunhanson  
    OP
       2020-07-15 00:23:05 +08:00
    @napsterwu 我的意思替换 yml 中的配置文件需要自己单独写脚本来完成?
    dunhanson
        12
    dunhanson  
    OP
       2020-07-15 00:23:34 +08:00
    @calmzhu 我只是举例子 spring boot,也有其它非 spring boot 项目
    dunhanson
        13
    dunhanson  
    OP
       2020-07-15 00:24:56 +08:00
    @Bromine0x23 导入环境变量我知道,但是还需要把“环境变量中的配置信息”覆盖“对应项目中的配置文件信息”,这一步不太清楚有哪些方式可以达到
    calmzhu
        14
    calmzhu  
       2020-07-15 00:33:20 +08:00
    @dunhanson
    其他的代码类型的话,可能都是对代码有侵入了。
    阿波罗配置中心之类,不过略重。
    帐户密码更新后,怎么通知代码重载是个问题。
    calmzhu
        15
    calmzhu  
       2020-07-15 00:48:57 +08:00
    或者,最粗暴的方式。
    把所有 aksk/帐户密码放在阿里云 /aws/自建 valut 之类的密码箱里集成到发布平台,每次项目发布时通过 api 拿到帐户密码,然后正则替换代码的配置文件。
    好处就是对代码无侵入,缺点就是更新个帐户密码,全部重新发一遍,有的应用发到吐。
    binux
        16
    binux  
       2020-07-15 08:11:09 +08:00 via Android
    docker 的部署时配置标准就是环境变量,你非得问配置文件,那你自己处理去啊,不行你看看你用的框架有没有环境变量或者 secret 支持啊。
    重要信息放环境变量不安全,你写文件里面就安全了?
    NaVient
        17
    NaVient  
       2020-07-15 09:05:17 +08:00
    K8S 的 secret 哲学就是密码不落地,在 k8s master 上启动一个服务调用 K8S API 更新 secret 是最优解
    yuedingwangji
        18
    yuedingwangji  
       2020-07-15 09:18:54 +08:00 via Android
    我们都是一个 pod 一个 cm 或 secret
    dunhanson
        19
    dunhanson  
    OP
       2020-07-15 09:21:00 +08:00
    @calmzhu 了解,谢谢了
    dunhanson
        20
    dunhanson  
    OP
       2020-07-15 09:21:52 +08:00
    @binux 莫激动,我只是问下有没有更好或者其它的方法而已
    vhwwls
        21
    vhwwls  
       2020-07-15 09:23:30 +08:00
    nacos 和 spring cloud config server 之类的项目就是为了解决这种问题存在的。kubernetes 自己提供的方式只是一个设计理念,告诉你可以这么干,是不是最优解还是要自己权衡。
    momocraft
        22
    momocraft  
       2020-07-15 10:09:59 +08:00
    为什么一定要用配置文件呢
    自己要用就自己解决,sed+exec 也算一种解决
    YzSama
        23
    YzSama  
       2020-07-15 10:21:44 +08:00
    搞一个 配置中心? 然后应用去监听配置和自动重启加载配置。
    momocraft
        24
    momocraft  
       2020-07-15 10:46:50 +08:00
    可能 cat 出一个长模板再 exec 更省事
    37Y37
        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
    ypcs03
        26
    ypcs03  
       2020-07-15 12:13:41 +08:00
    https://github.com/kubernetes/kubernetes/issues/79224 应该不会 native 支持了
    可以试试 init container 预处理
    dunhanson
        27
    dunhanson  
    OP
       2020-07-15 12:15:54 +08:00
    @momocraft 不怎么折腾确实可以用 sed
    dunhanson
        28
    dunhanson  
    OP
       2020-07-15 12:17:27 +08:00
    @YzSama 嗯 ,上面有人提到阿波罗,准备有时间看下的
    dunhanson
        29
    dunhanson  
    OP
       2020-07-15 12:18:41 +08:00
    @37Y37 @ypcs03 好的,谢谢,我了解下
    joesonw
        30
    joesonw  
       2020-07-15 13:14:01 +08:00
    用 initContainer 跑脚本注入呗.
    dunhanson
        31
    dunhanson  
    OP
       2020-07-15 14:20:48 +08:00
    @joesonw 对的,这个参数可以用。之前没看到过,专门讲 pod 章节没写到这个参数。
    joesonw
        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 写的, 逻辑部分极简, 可以看一看.
    dunhanson
        33
    dunhanson  
    OP
       2020-07-15 22:52:16 +08:00
    @joesonw 🤣现阶段简单用即可
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2663 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 06:00 · PVG 14:00 · LAX 22:00 · JFK 01:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.