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

Docker 转 k8s 求助

  •  
  •   Davic1 · 158 天前 · 3515 次点击
    这是一个创建于 158 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    第 1 条附言  ·  158 天前
    谢谢各位的解答.

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

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

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

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

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

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

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

    没有什么优缺点,看你的 pod 内跑的应用是怎么设计的。
    amrom
        12
    amrom  
       158 天前
    虽然方案有很多组合,但是我比较倾向于以下:
    1. 全部配置以 configmap 存在
    2. 一个 deployment 对应一个服务,服务间的日志共享用 pv 实现
    swulling
        13
    swulling  
       158 天前
    一个 Pod 里可以放多个容器~
    az467
        14
    az467  
       157 天前
    1.使用 SubPath 是不会更新,但是 Env 也不会更新啊。而且修改配置之后一般都是要重启的吧……
    2.如果 A 和 B 合起来对外提供一个服务,那就用一个 Deployment 。
    dayeye2006199
        15
    dayeye2006199  
       157 天前
    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  
       155 天前
    @Davic1 看你程序怎么读文件,你可以理解为如果你的程序跑在独立系统,你程序读配置是走 env 还是配置文件
    Davic1
        17
    Davic1  
    OP
       155 天前
    @zhanggg 程序是读的配置文件. 现状是配置文件不论是路径还是内容均已硬编码. 基于此我们就先暂停了它的上线要求.
    也谢谢你的回答~
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3589 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 10:12 · PVG 18:12 · LAX 03:12 · JFK 06:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.