kubernates ConfigMap 和 Secret 遇到的实际问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dunhanson
V2EX    Kubernetes

kubernates ConfigMap 和 Secret 遇到的实际问题

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

    问题

    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 嵌套引用的功能
    orcusfox
        6
    orcusfox  
       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 里面的值都可以通过继续 替换掉
    orcusfox
        7
    orcusfox  
       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     < href="/solana" class="dark" target="_self">Solana     5509 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 06:36 PVG 14:36 LAX 22:36 JFK 01:36
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86