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

deployment 下多个副本在启动时是并发启动还是顺序启动?

  •  
  •   dong706 · 2023-02-13 15:48:29 +08:00 · 1456 次点击
    这是一个创建于 682 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目前已知的是 StatefulSet 是按序号索引顺序创建各个 Pod ,并且会等待前一个 Pod 变为 Running 和 Ready 才会启动下一个 Pod 。

    那 Deployment 也是按顺序启动么?或者是并发启动?

    没有找到相关的官方说明,求大佬解惑~~~
    21 条回复    2023-02-14 08:51:44 +08:00
    seers
        1
    seers  
       2023-02-13 15:53:40 +08:00 via Android
    init 会先起,其他的并发
    wunonglin
        2
    wunonglin  
       2023-02-13 15:54:57 +08:00 via iPhone
    Deployment 是不保证顺序。StatefulSet 可以按顺序。没有并发的说法吧
    cesign
        3
    cesign  
       2023-02-13 15:58:48 +08:00
    并发,不用等 ready
    dong706
        4
    dong706  
    OP
       2023-02-13 15:59:09 +08:00
    @seers 我是指 pod 这个维度,不是 pod 内部的启动顺序
    coderxy
        5
    coderxy  
       2023-02-13 16:02:49 +08:00
    Deployment 不保证顺序, 它本身就是无状态的,哪儿来的顺序概念
    shiyuu
        6
    shiyuu  
       2023-02-13 16:09:07 +08:00
    帮你问了一下 ChatGPT ,他的回答:

    在 Kubernetes 中,Deployment 控制器管理 Pod 的创建和更新。当 Deployment 启动时,它会同时启动多个副本的 Pod 。默认情况下,所有 Pod 都是并发启动的,这意味着它们可以同时启动和运行。

    但是,您也可以配置 Deployment 控制器来控制 Pod 的启动顺序。您可以通过设置 spec.strategy.rollingUpdate.maxUnavailable 参数来控制启动时最多可以有多少副本不可用,从而控制 Pod 的启动顺序。

    例如,如果您设置 maxUnavailable 为 0 ,则 Deployment 将等待现有副本退役后才能启动新副本,从而实现顺序启动。如果您设置 maxUnavailable 为 1 ,则 Deployment 可以在现有副本中的一个退役后同时启动新副本,从而实现并发启动。

    最后要注意的是,Deployment 中的 Pod 启动顺序取决于您设置的 maxUnavailable 参数,但不保证它们的启动时间或启动速度相同。每个 Pod 的启动时间和速度受多种因素的影响,包括容器镜像大小、容器启动命令和参数等。
    dong706
        7
    dong706  
    OP
       2023-02-13 16:15:17 +08:00
    @shiyuu 感谢感谢,我忘记问 chatGPT 了
    julyclyde
        8
    julyclyde  
       2023-02-13 16:29:50 +08:00
    我觉得这是个并不需要考虑的问题啊
    多个实例之间相互没有关系的,自然也就没有顺序要求
    dong706
        9
    dong706  
    OP
       2023-02-13 16:35:56 +08:00
    @julyclyde 有些业务会考虑到这一点
    dong706
        10
    dong706  
    OP
       2023-02-13 16:40:03 +08:00
    @julyclyde 比如第一个启动的 pod ,会自动创建根密钥,后续启动的 pod 不需要也不能去重新创建根密钥。
    julyclyde
        11
    julyclyde  
       2023-02-13 17:06:26 +08:00
    @dong706 那是你的设计有问题
    dong706
        12
    dong706  
    OP
       2023-02-13 17:25:00 +08:00
    @julyclyde 我也感觉是有问题,求指教,就我上面说的这个问题,该咋解决? pod 里的应用需要一个根密钥(不能预置,必须随机生成),deployment 下的多个 pod 共享这个根密钥文件。
    julyclyde
        13
    julyclyde  
       2023-02-13 17:28:42 +08:00
    @dong706 为什么不能预置呢?
    随机生成之后,怎么告知通信对手?
    Marinaaaa
        14
    Marinaaaa  
       2023-02-13 17:34:35 +08:00
    @dong706 写到 Volumes 里呢?
    dong706
        15
    dong706  
    OP
       2023-02-13 17:37:02 +08:00
    @Marinaaaa Volumes 是通过 nfs+存储类动态生成的,无法提前预先知道存储位置。
    dong706
        16
    dong706  
    OP
       2023-02-13 17:37:27 +08:00
    @julyclyde 业务原因不能预置。不是用于通信,用于数据安全存储。
    twinsdestiny
        17
    twinsdestiny  
       2023-02-13 18:02:07 +08:00
    用个分布式锁,谁抢到谁生成根密钥,其他直接跳过
    不然就 statefullset ,一个一个启动
    dong706
        18
    dong706  
    OP
       2023-02-13 18:25:03 +08:00
    @twinsdestiny 这个思路我实践过,但是要引入 redis....最终还是放弃了。

    不过现在已经知道怎么保证 deployement 按顺序启动了,这个问题就不存在了。

    就算实在没办法,我最终会采用 statefulset 来解决。
    idontnowhat2say
        19
    idontnowhat2say  
       2023-02-13 23:35:10 +08:00
    @dong706 只用 deployment 就在 spec 里加个 init 容器,里面判断下密钥是否存在,不存在就生成,存在就跳过。就一个 if else 的事
    julyclyde
        20
    julyclyde  
       2023-02-14 08:50:45 +08:00
    @dong706 既然是存储,按说 key 在各实例之间应该是相同的啊
    julyclyde
        21
    julyclyde  
       2023-02-14 08:51:44 +08:00
    @idontnowhat2say initContainer 是 pod 的而不是 deployment 的。你在这里边实现,和直接在 app 里实现也没什么区别啊,都是会遇到 race condition 的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5482 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 06:02 · PVG 14:02 · LAX 22:02 · JFK 01:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.