配置 Kubernetes StatefulSet 以启动 pods 启动后首先重新启动失败的容器?

Configure Kubernetes StatefulSet to start pods first restart failed containers after start?

基本信息

嗨,我遇到了 Kubernetes StatefulSets 的问题。我正在尝试启动一个包含 3 个副本的集合。 这些 replicas/pods 每个都有一个容器,它根据它们的网络 ID ping 另一个 pods 中的容器。 容器需要来自 all pods 的响应。如果没有得到响应,容器将失败。在我的情况下,我需要 3 pods/replicas 才能使我的设置正常工作。

问题描述

发生的事情如下。 Kubernetes 启动 2 pods 相当快。但是,由于我需要 3 pods 来构建功能齐全的集群,因此前 2 pods 一直崩溃,因为第 3 个尚未启动。 出于某种原因,Kubernetes 选择继续重启两者 pods 而不是添加第三个 pod,这样我的集群才能正常运行。

我已经在大约 15 分钟后正确地看到了我的设置 运行,因为 Kubernetes 那时已经添加了第三个 pod。

问题

所以,我的问题。

有谁知道在启动所需数量的 pods/replicas 之前延迟重启失败容器的方法?

我认为解决您的问题的更好方法是利用 document 中所述的活性探测,而不是延迟重启时间(在 YAML 中不可配置)。

您的 pods 在它们启动后立即响应活性探测,让 Kubernetes 知道它们是活动的,从而防止它们被重新启动。同时,您的 pods 会一直 ping 其他人,直到他们都启动为止。只有当你所有的 pods 都启动时才会为外部请求提供服务。这类似于 creating a Zookeeper ensemble.

我已经找到了原因。 StatefulSets 按特定顺序启动 pods。如果 pods 之一无法启动,则不会启动下一个。

您可以添加 podManagementPolicy: "Parallel" 来启动 pods,而无需等待之前的 pods 成为 Running。 参见 this documentation