From 95264a418d92c18d40591d36a81f5fdd32035f24 Mon Sep 17 00:00:00 2001 From: David Porter Date: Wed, 8 Dec 2021 17:53:34 -0800 Subject: [PATCH] kubelet: set failed phase during graceful shutdown Revert to previous behavior in 1.21/1.20 of setting pod phase to failed during graceful node shutdown. Setting pods to failed phase will ensure that external controllers that manage pods like deployments will create new pods to replace those that are shutdown. Many customers have taken a dependency on this behavior and it was breaking change in 1.22, so this change reverts back to the previous behavior. Signed-off-by: David Porter --- pkg/kubelet/nodeshutdown/nodeshutdown_manager_linux.go | 4 ++++ test/e2e_node/node_shutdown_linux_test.go | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/pkg/kubelet/nodeshutdown/nodeshutdown_manager_linux.go b/pkg/kubelet/nodeshutdown/nodeshutdown_manager_linux.go index bfbb841a1fa..1e857528f6a 100644 --- a/pkg/kubelet/nodeshutdown/nodeshutdown_manager_linux.go +++ b/pkg/kubelet/nodeshutdown/nodeshutdown_manager_linux.go @@ -316,6 +316,10 @@ func (m *managerImpl) processShutdownEvent() error { klog.V(1).InfoS("Shutdown manager killing pod with gracePeriod", "pod", klog.KObj(pod), "gracePeriod", gracePeriodOverride) if err := m.killPodFunc(pod, false, &gracePeriodOverride, func(status *v1.PodStatus) { + // set the pod status to failed (unless it was already in a successful terminal phase) + if status.Phase != v1.PodSucceeded { + status.Phase = v1.PodFailed + } status.Message = nodeShutdownMessage status.Reason = nodeShutdownReason }); err != nil { diff --git a/test/e2e_node/node_shutdown_linux_test.go b/test/e2e_node/node_shutdown_linux_test.go index eca0e681513..b7dd727cc5e 100644 --- a/test/e2e_node/node_shutdown_linux_test.go +++ b/test/e2e_node/node_shutdown_linux_test.go @@ -510,5 +510,5 @@ func isPodShutdown(pod *v1.Pod) bool { } } - return pod.Status.Message == podShutdownMessage && pod.Status.Reason == podShutdownReason && hasContainersNotReadyCondition + return pod.Status.Message == podShutdownMessage && pod.Status.Reason == podShutdownReason && hasContainersNotReadyCondition && pod.Status.Phase == v1.PodFailed }