V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
Davic1

Docker 转 k8s 求助

  •  
  •   Davic1 · Dec 10, 2021 · 5103 views
    This topic created in 1613 days ago, the information mentioned may be changed or developed.

    原来是用单机容器部署的, 现在要上 k8s,遇到两个问题

    1. 原来容器里要读取配置文件, 放在 K8S 上是直接把所有配置项写在 ConfigMap 里吗? (把镜像里配置文件对应的值替换为环境变量, 然后用 ConfigMap 设置环境变量?)

    2. 原来的容器(A)会依赖另一个容器做日志读取(B), 那在 K8S 里是分成两个 Deployment, 分别部署 A 和 B 还是用一个 Deployment 呢

    Supplement 1  ·  Dec 10, 2021
    谢谢各位的解答.

    目前的情况是收到开发推送过来的镜像, 所有的配置文件都是硬编码(也没有指定配置文件位置的功能)

    与开发沟通提出需要一个配置文件里使用环境变量的镜像

    开发不愿意改,说可以挂载 ConfigMap.

    于是我就照做了,但是对于日志收集容器, 同个目录下除了有配置文件外还有其他文件, 如果继续挂载 ConfigMap,会清除其他文件, 如果用 subPath, 如果 ConfigMap 更新了, 挂载过去的内容也会更新吗?(我在官网上看到的解释是不会收到 ConfigMap 的更新, https://kubernetes.io/zh/docs/concepts/storage/volumes/#configmap)

    是不是只有改成环境变量一种方法才能运维起来舒爽一些?
    17 replies    2021-12-13 13:33:01 +08:00
    chenset
        1
    chenset  
       Dec 10, 2021   ❤️ 1
    1. 配置中心 /随镜像打包 /ConfigMap/目录共享
    2. 两种都可以, 看自己需求 或者使用 DaemonSet

    这些都不是唯一解的
    qping
        2
    qping  
       Dec 10, 2021   ❤️ 1
    2. 放一个 deployment 的好处是,启动的时候 deployment 会同时启动两个, 如果需要多个 AAAAA 依赖于一个 B 就分成两个 deploy 吧
    xx6412223
        3
    xx6412223  
       Dec 10, 2021
    1 不同环境的镜像应该一致,配置不一致,K8S 最佳实践就是放 CM 里,为了不改变代码,可以错 volumeMount
    2 一个 Deployment 就是一个微服务,如果 AB 不是一一对应,就多个 Deployment
    basefas
        4
    basefas  
       Dec 10, 2021
    需要看下原来的日志采集容器有没有特殊规则或者使用,否则可以考虑部署 k8s 集群的日志采集工具统一采集
    qq1009479218
        5
    qq1009479218  
       Dec 10, 2021   ❤️ 1
    1. 如果读取的是文件配置的话,不用环境变量,把文件内容写进 configMap ,挂载到容器的对应目录就行
    2. 看 B 是不是只为 A 提供服务,如果是的话,建议一个 Deployment ,当然,两种都行

    和一楼说的一样,确实可以随意一点,怎么快怎么来,怎么简单怎么来
    zhanggg
        6
    zhanggg  
       Dec 10, 2021   ❤️ 1
    1. ConfigMap mount 到 deploy 里成为一个文件,这样在 deploy 里起的 pod 能直接读到文件(也可以直接把配置写进 deploy 的 env 配置,程序通过 env 读
    2. 如果你的依赖指的就是 A 生成的日志 B 读取,且 B 的功能仅有读日志功能,那建议放在一个 deploy 里面,通过一个 volumn 挂载到两个 pod 里面去,这样相当于直接有了共享目录
    Alliot
        7
    Alliot  
       Dec 10, 2021 via Android
    第一题 configMap 或者 volume 或者配置中心
    第二题 为了灵活可以用边车模式 一个 deployment 里面跑两个容器 和 docker 之前无异。
    Davic1
        8
    Davic1  
    OP
       Dec 10, 2021
    @xx6412223 挂在 ConfigMap 相比于通过它给环境变量赋值来说有什么缺点吗
    Davic1
        9
    Davic1  
    OP
       Dec 10, 2021
    @zhanggg thx, 请问下挂载 ConfigMap 与程序通过 env 来读 有什么缺点吗
    goushenggege
        10
    goushenggege  
       Dec 10, 2021
    1 是的
    2 有多种方式,甚至用边车都可以
    fisherwei
        11
    fisherwei  
       Dec 10, 2021   ❤️ 1
    @Davic1
    configmap 有两种用法
    1 、把 configmap 每一项当作一个文件映射为 pod 内的某个路径的某个文件(这文件是只读的)
    2 、把 configmap 每一项当作一个 env 注入 pod

    没有什么优缺点,看你的 pod 内跑的应用是怎么设计的。
    amrom
        12
    amrom  
       Dec 10, 2021
    虽然方案有很多组合,但是我比较倾向于以下:
    1. 全部配置以 configmap 存在
    2. 一个 deployment 对应一个服务,服务间的日志共享用 pv 实现
    swulling
        13
    swulling  
       Dec 10, 2021
    一个 Pod 里可以放多个容器~
    az467
        14
    az467  
       Dec 11, 2021
    1.使用 SubPath 是不会更新,但是 Env 也不会更新啊。而且修改配置之后一般都是要重启的吧……
    2.如果 A 和 B 合起来对外提供一个服务,那就用一个 Deployment 。
    dayeye2006199
        15
    dayeye2006199  
       Dec 11, 2021
    ConfigMap 变更之后需要重启服务,有几种办法;
    1. 手动模式 kubectl rollout restart xxxxx 重新启动 deployment
    2. 需要将 deployment 指向一个新的 configmap 才能触发更新;例如老的 configmap 叫 config1 ,新的更改了里面的部分值之后,重命名成 config2 ,然后 deployment 里面指向 config2 。


    一些做 release 管理的工具,例如 kustomize 用的是方法 2 ; helm 用的是生成一个 configmap hash 的 annotation 放在 deployment 上;每次 configmap 内容变更之后,这个 annotation 也会变更,所以会触发 deployment 自动更新
    zhanggg
        16
    zhanggg  
       Dec 13, 2021
    @Davic1 看你程序怎么读文件,你可以理解为如果你的程序跑在独立系统,你程序读配置是走 env 还是配置文件
    Davic1
        17
    Davic1  
    OP
       Dec 13, 2021
    @zhanggg 程序是读的配置文件. 现状是配置文件不论是路径还是内容均已硬编码. 基于此我们就先暂停了它的上线要求.
    也谢谢你的回答~
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1379 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 55ms · UTC 17:08 · PVG 01:08 · LAX 10:08 · JFK 13:08
    ♥ Do have faith in what you're doing.