StatefulSet 重新创建 pod,为什么?

lio*_*tur 6 deployment kubernetes devops kubernetes-statefulset

我有我的部署,我在其中定义了 postgres statefulSet,但是我没有 PVC,所以如果 pod 死了 - 所有数据都消失了。如果我将列出所有豆荚,我会看到下图:

pod1 - Running - 10 min
pod2 - Running - 10 min
postgresPod - Running - 10 min
Run Code Online (Sandbox Code Playgroud)

一段时间后,我再次列出豆荚,如下所示:

pod1 - Running - 10 min
pod2 - Running - 10 min
postgresPod - Running - 5 min
Run Code Online (Sandbox Code Playgroud)

如您所见,postgresPod 运行了 5 分钟。我“描述”了 statefulset 并在下面看到:

Type     Reason               Age                From                    Message
  ----     ------               ----               ----                    -------
  Normal   SuccessfulCreate     5m **(x2 over 10m)**  statefulset-controller  create Pod postgresPod in StatefulSet x-postgres successful
  Warning  RecreatingFailedPod  5m                statefulset-controller  StatefulSet xx/x-postgres is recreating failed Pod postgresPod
  Normal   SuccessfulDelete     5m                statefulset-controller  **delete Pod postgresPod** in StatefulSet x-postgres successful
Run Code Online (Sandbox Code Playgroud)

所以我的问题是我怎么知道为什么statefulSet 会重新创建 Pod?有没有额外的日志?可能它与机器的资源有某种关系,或者 pod 是在另一个节点上创建的,该节点在特定时刻拥有更多资源?

有任何想法吗?

Mat*_*amn 6

我想出的另一个巧妙的小技巧是在describePod 停止记录时立即使用

kubectl logs -f mypod && kubectl describe pod mypod
Run Code Online (Sandbox Code Playgroud)

当 Pod 失败并停止记录时,kubectl logs -f mypod将终止,然后 shell 将立即执行kubectl describe pod mypod,(希望)让您在重新创建失败的 Pod 之前捕获其状态。

就我而言,它显示

    Last State:     Terminated
      Reason:       OOMKilled
      Exit Code:    137
Run Code Online (Sandbox Code Playgroud)

与蒂莫西所说的一致


OhH*_*ark 4

你应该考虑两件事:

  1. 调试 Pod

使用以下命令检查 pod 的当前状态和最近发生的事件:

kubectl describe pods ${POD_NAME}查看 Pod 中容器的状态。他们都在跑步吗?最近有重启吗?

根据 Pod 的状态继续调试。

特别是仔细看看Pod 崩溃的原因

更多信息可以在我提供的链接中找到。

  1. 调试 StatefulSet。

StatefulSet 提供了一种调试机制,可以使用注释暂停 Pod 上的所有控制器操作。在任何 StatefulSet Pod 上将注释设置pod.alpha.kubernetes.io/initialized为“false”将暂停 StatefulSet 的所有操作。暂停时,StatefulSet 将不会执行任何缩放操作。设置调试挂钩后,您可以在 StatefulSet Pod 的容器内执行命令,而不会受到扩展操作的干扰。您可以通过执行以下命令将注释设置为“false”:

kubectl annotate pods <pod-name> pod.alpha.kubernetes.io/initialized="false" --overwrite

当注释设置为“false”时,StatefulSet 将不会响应其 Pod 变得不健康或不可用。在每个 StatefulSet Pod 上的注释被删除或设置为“true”之前,它不会创建替换 Pod。

请告诉我这是否有帮助。