StatefulSet 重新创建 pod,为什么?
StatefulSet recreates pod, why?
我有我的部署,我在其中定义了 postgres statefulSet,但是我没有 PVC,所以如果 pod 死了 - 所有数据都消失了。如果我列出所有 pods 我会看到下面的图片:
pod1 - Running - 10 min
pod2 - Running - 10 min
postgresPod - Running - 10 min
一段时间后,我再次列出 pods 并查看以下内容:
pod1 - Running - 10 min
pod2 - Running - 10 min
postgresPod - Running - 5 min
如您所见,postgresPod 运行 5 分钟。我 "described" 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
所以我的问题是我怎么知道为什么 statefulSet 重新创建pods?是否有任何额外的日志?可能是它与机器的资源有某种关系,或者 pod 是在那个特定时刻拥有更多资源的另一个节点上创建的?
有什么想法吗?
你应该研究两件事:
Check the current state of the pod and recent events with the
following command:
kubectl describe pods ${POD_NAME}
Look at the state of the containers
in the pod. Are they all Running? Have there been recent restarts?
Continue debugging depending on the state of the pods.
特仔细看why the Pod crashed.
可以在我提供的链接中找到更多信息。
- 调试 StatefulSet。
StatefulSets 提供了一种调试机制,可以使用注释暂停 Pods 上的所有控制器操作。在任何 StatefulSet Pod 上将 pod.alpha.kubernetes.io/initialized
注释设置为 "false" 将暂停 StatefulSet 的所有操作。暂停时,StatefulSet 不会执行任何缩放操作。设置调试挂钩后,您可以在 StatefulSet pods 的容器内执行命令,而不受缩放操作的干扰。您可以通过执行以下命令将注释设置为 "false":
kubectl annotate pods <pod-name> pod.alpha.kubernetes.io/initialized="false" --overwrite
当注释设置为 "false" 时,StatefulSet 将不会响应其 Pods 变得不健康或不可用。在删除注解或在每个 StatefulSet Pod 上设置为 "true" 之前,它不会创建替换 Pods。
如果有帮助,请告诉我。
kubectl log -p postgresPod
-p
会给你以前的日志(如果是简单的重启)。
这里有一大堆“了解你的环境的其余部分”。您知道您的集群有多少个节点吗(我们说的是 1 个还是 2 个,还是 10 个或 100 个或更多)。你知道它们是专用实例还是你在像 AWS 这样的云提供商上使用 spot 实例。
看看 kubectl get nodes
它应该会告诉您节点的年龄。
您的广告连播是否设置了请求和限制?做一个kubectl describe ${POD_NAME}
。在请求、限制等中,您将看到 pod 在哪个节点上。描述它将具有 CPU 和内存详细信息的节点。你的豆荚能住在那些里面吗?您的应用程序配置是否符合这些限制?如果您没有设置限制,那么您的 pod 很容易消耗太多资源,以至于 kernel oom killer 会终止您的 pod。如果您确实有 pod 限制,但错误配置了您的应用程序,那么 K8s 可能会终止您的应用程序,因为它违反了限制
如果您有权访问该节点,请查看 dmesg
以查看 OOM-Killer
是否终止了您的任何 pods。如果您没有访问权限,请有人查看日志。当您描述节点时,寻找具有 0
限制的 pods,因为这是无限的,它们可能行为不当并导致您的应用程序被终止,因为它很不幸地从系统请求更多资源由于应用程序不受限制,无法使用。
我想出的另一个巧妙的小技巧是 describe
pod 一旦停止记录,使用
kubectl logs -f mypod && kubectl describe pod mypod
当 pod 失败并停止记录时,kubectl logs -f mypod
将终止,然后 shell 将立即执行 kubectl describe pod mypod
,(希望)让您捕获失败 pod 的状态在重新创建之前。
在我的例子中显示
Last State: Terminated
Reason: OOMKilled
Exit Code: 137
与蒂莫西所说的一致
我有我的部署,我在其中定义了 postgres statefulSet,但是我没有 PVC,所以如果 pod 死了 - 所有数据都消失了。如果我列出所有 pods 我会看到下面的图片:
pod1 - Running - 10 min
pod2 - Running - 10 min
postgresPod - Running - 10 min
一段时间后,我再次列出 pods 并查看以下内容:
pod1 - Running - 10 min
pod2 - Running - 10 min
postgresPod - Running - 5 min
如您所见,postgresPod 运行 5 分钟。我 "described" 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
所以我的问题是我怎么知道为什么 statefulSet 重新创建pods?是否有任何额外的日志?可能是它与机器的资源有某种关系,或者 pod 是在那个特定时刻拥有更多资源的另一个节点上创建的?
有什么想法吗?
你应该研究两件事:
Check the current state of the pod and recent events with the following command:
kubectl describe pods ${POD_NAME}
Look at the state of the containers in the pod. Are they all Running? Have there been recent restarts?Continue debugging depending on the state of the pods.
特仔细看why the Pod crashed.
可以在我提供的链接中找到更多信息。
- 调试 StatefulSet。
StatefulSets 提供了一种调试机制,可以使用注释暂停 Pods 上的所有控制器操作。在任何 StatefulSet Pod 上将 pod.alpha.kubernetes.io/initialized
注释设置为 "false" 将暂停 StatefulSet 的所有操作。暂停时,StatefulSet 不会执行任何缩放操作。设置调试挂钩后,您可以在 StatefulSet pods 的容器内执行命令,而不受缩放操作的干扰。您可以通过执行以下命令将注释设置为 "false":
kubectl annotate pods <pod-name> pod.alpha.kubernetes.io/initialized="false" --overwrite
当注释设置为 "false" 时,StatefulSet 将不会响应其 Pods 变得不健康或不可用。在删除注解或在每个 StatefulSet Pod 上设置为 "true" 之前,它不会创建替换 Pods。
如果有帮助,请告诉我。
kubectl log -p postgresPod
-p
会给你以前的日志(如果是简单的重启)。
这里有一大堆“了解你的环境的其余部分”。您知道您的集群有多少个节点吗(我们说的是 1 个还是 2 个,还是 10 个或 100 个或更多)。你知道它们是专用实例还是你在像 AWS 这样的云提供商上使用 spot 实例。
看看 kubectl get nodes
它应该会告诉您节点的年龄。
您的广告连播是否设置了请求和限制?做一个kubectl describe ${POD_NAME}
。在请求、限制等中,您将看到 pod 在哪个节点上。描述它将具有 CPU 和内存详细信息的节点。你的豆荚能住在那些里面吗?您的应用程序配置是否符合这些限制?如果您没有设置限制,那么您的 pod 很容易消耗太多资源,以至于 kernel oom killer 会终止您的 pod。如果您确实有 pod 限制,但错误配置了您的应用程序,那么 K8s 可能会终止您的应用程序,因为它违反了限制
如果您有权访问该节点,请查看 dmesg
以查看 OOM-Killer
是否终止了您的任何 pods。如果您没有访问权限,请有人查看日志。当您描述节点时,寻找具有 0
限制的 pods,因为这是无限的,它们可能行为不当并导致您的应用程序被终止,因为它很不幸地从系统请求更多资源由于应用程序不受限制,无法使用。
我想出的另一个巧妙的小技巧是 describe
pod 一旦停止记录,使用
kubectl logs -f mypod && kubectl describe pod mypod
当 pod 失败并停止记录时,kubectl logs -f mypod
将终止,然后 shell 将立即执行 kubectl describe pod mypod
,(希望)让您捕获失败 pod 的状态在重新创建之前。
在我的例子中显示
Last State: Terminated
Reason: OOMKilled
Exit Code: 137
与蒂莫西所说的一致