配置Kubernetes StatefulSet以启动pod,在启动后首先重启失败的容器?

时间:2017-10-23 16:00:55

标签: kubernetes containers restart statefulset

基本信息

嗨,我遇到了Kubernetes StatefulSets的问题。我试图用3个副本来旋转一个集合。 这些副本/ pod每个都有一个容器,根据其network-id对其他容器中的容器进行ping操作。 容器需要来自所有 pod的响应。如果它没有得到响应,容器将失败。在我的情况下,我需要3个pod / replicas才能使我的设置正常工作。

问题描述

以下是发生的事情。 Kubernetes相当快速地开始2个豆荚。但是,由于我需要3个pod用于功能齐全的群集,因此前3个pod会因为第3个尚未启动而崩溃。 出于某种原因,Kubernetes选择继续重新启动两个pod,而不是添加第三个pod,这样我的群集就可以正常运行。

我已经看到我的设置在大约15分钟后正常运行,因为Kubernetes在那时添加了第3个吊舱。

问题

所以,我的问题。

有没有人知道如何延迟重启失败的容器,直到启动了所需数量的pod /副本?

2 个答案:

答案 0 :(得分:0)

我认为处理问题的更好方法是利用活跃度探测,如document中所述,而不是延迟重启时间(不能在YAML中配置)。

你的pod在它们开始后立即响应活体探测器让Kubernetes知道它们还活着,这会阻止它们重新启动。与此同时,你的豆荚不断对其他人进行ping操仅当启动所有pod时,才会提供外部请求。这类似于creating a Zookeeper ensemble

答案 1 :(得分:0)

我发现了这个原因。 StatefulSets按特定顺序启动pod。如果其中一个pod无法启动,则无法启动下一个。

您可以添加podManagementPolicy: "Parallel"来启动广告连播,而无需等待之前的广告连播Running。 见this documentation