diff --git a/pkg/kubelet/kuberuntime/kuberuntime_manager.go b/pkg/kubelet/kuberuntime/kuberuntime_manager.go index 2c7a8af44f4..7808a331fd9 100644 --- a/pkg/kubelet/kuberuntime/kuberuntime_manager.go +++ b/pkg/kubelet/kuberuntime/kuberuntime_manager.go @@ -534,10 +534,11 @@ func shouldRestartOnFailure(pod *v1.Pod) bool { func containerSucceeded(c *v1.Container, podStatus *kubecontainer.PodStatus) bool { cStatus := podStatus.FindContainerStatusByName(c.Name) - if cStatus == nil || cStatus.State == kubecontainer.ContainerStateRunning { + if cStatus == nil { return false } - return cStatus.ExitCode == 0 + // Container has exited, with an exit code of 0. + return cStatus.State == kubecontainer.ContainerStateExited && cStatus.ExitCode == 0 } func isInPlacePodVerticalScalingAllowed(pod *v1.Pod) bool { diff --git a/pkg/kubelet/kuberuntime/kuberuntime_manager_test.go b/pkg/kubelet/kuberuntime/kuberuntime_manager_test.go index 732a6f7f1c8..e39f04da9c6 100644 --- a/pkg/kubelet/kuberuntime/kuberuntime_manager_test.go +++ b/pkg/kubelet/kuberuntime/kuberuntime_manager_test.go @@ -994,6 +994,22 @@ func TestComputePodActions(t *testing.T) { ContainersToKill: getKillMap(basePod, baseStatus, []int{}), }, }, + "restart created but not started containers if RestartPolicy == OnFailure": { + mutatePodFn: func(pod *v1.Pod) { pod.Spec.RestartPolicy = v1.RestartPolicyOnFailure }, + mutateStatusFn: func(status *kubecontainer.PodStatus) { + // The first container completed, don't restart it. + status.ContainerStatuses[0].State = kubecontainer.ContainerStateExited + status.ContainerStatuses[0].ExitCode = 0 + + // The second container was created, but never started. + status.ContainerStatuses[1].State = kubecontainer.ContainerStateCreated + }, + actions: podActions{ + SandboxID: baseStatus.SandboxStatuses[0].Id, + ContainersToStart: []int{1}, + ContainersToKill: getKillMap(basePod, baseStatus, []int{}), + }, + }, "don't restart containers if RestartPolicy == Never": { mutatePodFn: func(pod *v1.Pod) { pod.Spec.RestartPolicy = v1.RestartPolicyNever }, mutateStatusFn: func(status *kubecontainer.PodStatus) {