1
seers 2023-02-13 15:53:40 +08:00 via Android
init 会先起,其他的并发
|
2
wunonglin 2023-02-13 15:54:57 +08:00 via iPhone
Deployment 是不保证顺序。StatefulSet 可以按顺序。没有并发的说法吧
|
3
cesign 2023-02-13 15:58:48 +08:00
并发,不用等 ready
|
5
coderxy 2023-02-13 16:02:49 +08:00
Deployment 不保证顺序, 它本身就是无状态的,哪儿来的顺序概念
|
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 的启动时间和速度受多种因素的影响,包括容器镜像大小、容器启动命令和参数等。 |
8
julyclyde 2023-02-13 16:29:50 +08:00
我觉得这是个并不需要考虑的问题啊
多个实例之间相互没有关系的,自然也就没有顺序要求 |
10
dong706 OP @julyclyde 比如第一个启动的 pod ,会自动创建根密钥,后续启动的 pod 不需要也不能去重新创建根密钥。
|
12
dong706 OP @julyclyde 我也感觉是有问题,求指教,就我上面说的这个问题,该咋解决? pod 里的应用需要一个根密钥(不能预置,必须随机生成),deployment 下的多个 pod 共享这个根密钥文件。
|
17
twinsdestiny 2023-02-13 18:02:07 +08:00
用个分布式锁,谁抢到谁生成根密钥,其他直接跳过
不然就 statefullset ,一个一个启动 |
18
dong706 OP @twinsdestiny 这个思路我实践过,但是要引入 redis....最终还是放弃了。
不过现在已经知道怎么保证 deployement 按顺序启动了,这个问题就不存在了。 就算实在没办法,我最终会采用 statefulset 来解决。 |
19
idontnowhat2say 2023-02-13 23:35:10 +08:00
@dong706 只用 deployment 就在 spec 里加个 init 容器,里面判断下密钥是否存在,不存在就生成,存在就跳过。就一个 if else 的事
|
21
julyclyde 2023-02-14 08:51:44 +08:00
@idontnowhat2say initContainer 是 pod 的而不是 deployment 的。你在这里边实现,和直接在 app 里实现也没什么区别啊,都是会遇到 race condition 的
|