Skip to content

Commit

Permalink
Generate containers ready condition including restartable init contai…
Browse files Browse the repository at this point in the history
…ners
  • Loading branch information
gjkim42 committed Jul 17, 2023
1 parent 3bf2826 commit 9d6c103
Show file tree
Hide file tree
Showing 4 changed files with 94 additions and 5 deletions.
7 changes: 4 additions & 3 deletions pkg/kubelet/kubelet_pods.go
Original file line number Diff line number Diff line change
Expand Up @@ -1725,9 +1725,10 @@ func (kl *Kubelet) generateAPIPodStatus(pod *v1.Pod, podStatus *kubecontainer.Po
if utilfeature.DefaultFeatureGate.Enabled(features.PodReadyToStartContainersCondition) {
s.Conditions = append(s.Conditions, status.GeneratePodReadyToStartContainersCondition(pod, podStatus))
}
s.Conditions = append(s.Conditions, status.GeneratePodInitializedCondition(&pod.Spec, append(s.InitContainerStatuses, s.ContainerStatuses...), s.Phase))
s.Conditions = append(s.Conditions, status.GeneratePodReadyCondition(&pod.Spec, s.Conditions, s.ContainerStatuses, s.Phase))
s.Conditions = append(s.Conditions, status.GenerateContainersReadyCondition(&pod.Spec, s.ContainerStatuses, s.Phase))
allContainerStatuses := append(s.InitContainerStatuses, s.ContainerStatuses...)
s.Conditions = append(s.Conditions, status.GeneratePodInitializedCondition(&pod.Spec, allContainerStatuses, s.Phase))
s.Conditions = append(s.Conditions, status.GeneratePodReadyCondition(&pod.Spec, s.Conditions, allContainerStatuses, s.Phase))
s.Conditions = append(s.Conditions, status.GenerateContainersReadyCondition(&pod.Spec, allContainerStatuses, s.Phase))
s.Conditions = append(s.Conditions, v1.PodCondition{
Type: v1.PodScheduled,
Status: v1.ConditionTrue,
Expand Down
15 changes: 15 additions & 0 deletions pkg/kubelet/status/generate.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,21 @@ func GenerateContainersReadyCondition(spec *v1.PodSpec, containerStatuses []v1.C
}
unknownContainers := []string{}
unreadyContainers := []string{}

for _, container := range spec.InitContainers {
if !kubetypes.IsRestartableInitContainer(&container) {
continue
}

if containerStatus, ok := podutil.GetContainerStatus(containerStatuses, container.Name); ok {
if !containerStatus.Ready {
unreadyContainers = append(unreadyContainers, container.Name)
}
} else {
unknownContainers = append(unknownContainers, container.Name)
}
}

for _, container := range spec.Containers {
if containerStatus, ok := podutil.GetContainerStatus(containerStatuses, container.Name); ok {
if !containerStatus.Ready {
Expand Down
72 changes: 72 additions & 0 deletions pkg/kubelet/status/generate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ import (
"k8s.io/utils/pointer"
)

var (
containerRestartPolicyAlways = v1.ContainerRestartPolicyAlways
)

func TestGenerateContainersReadyCondition(t *testing.T) {
tests := []struct {
spec *v1.PodSpec
Expand Down Expand Up @@ -112,6 +116,74 @@ func TestGenerateContainersReadyCondition(t *testing.T) {
podPhase: v1.PodSucceeded,
expectReady: getPodCondition(v1.ContainersReady, v1.ConditionFalse, PodCompleted, ""),
},
{
spec: &v1.PodSpec{
InitContainers: []v1.Container{
{Name: "restartable-init-1", RestartPolicy: &containerRestartPolicyAlways},
},
Containers: []v1.Container{
{Name: "regular-1"},
},
},
containerStatuses: []v1.ContainerStatus{
getReadyStatus("regular-1"),
},
podPhase: v1.PodRunning,
expectReady: getPodCondition(v1.ContainersReady, v1.ConditionFalse, ContainersNotReady, "containers with unknown status: [restartable-init-1]"),
},
{
spec: &v1.PodSpec{
InitContainers: []v1.Container{
{Name: "restartable-init-1", RestartPolicy: &containerRestartPolicyAlways},
{Name: "restartable-init-2", RestartPolicy: &containerRestartPolicyAlways},
},
Containers: []v1.Container{
{Name: "regular-1"},
},
},
containerStatuses: []v1.ContainerStatus{
getReadyStatus("restartable-init-1"),
getReadyStatus("restartable-init-2"),
getReadyStatus("regular-1"),
},
podPhase: v1.PodRunning,
expectReady: getPodCondition(v1.ContainersReady, v1.ConditionTrue, "", ""),
},
{
spec: &v1.PodSpec{
InitContainers: []v1.Container{
{Name: "restartable-init-1", RestartPolicy: &containerRestartPolicyAlways},
{Name: "restartable-init-2", RestartPolicy: &containerRestartPolicyAlways},
},
Containers: []v1.Container{
{Name: "regular-1"},
},
},
containerStatuses: []v1.ContainerStatus{
getReadyStatus("restartable-init-1"),
getReadyStatus("regular-1"),
},
podPhase: v1.PodRunning,
expectReady: getPodCondition(v1.ContainersReady, v1.ConditionFalse, ContainersNotReady, "containers with unknown status: [restartable-init-2]"),
},
{
spec: &v1.PodSpec{
InitContainers: []v1.Container{
{Name: "restartable-init-1", RestartPolicy: &containerRestartPolicyAlways},
{Name: "restartable-init-2", RestartPolicy: &containerRestartPolicyAlways},
},
Containers: []v1.Container{
{Name: "regular-1"},
},
},
containerStatuses: []v1.ContainerStatus{
getReadyStatus("restartable-init-1"),
getNotReadyStatus("restartable-init-2"),
getReadyStatus("regular-1"),
},
podPhase: v1.PodRunning,
expectReady: getPodCondition(v1.ContainersReady, v1.ConditionFalse, ContainersNotReady, "containers with unready status: [restartable-init-2]"),
},
}

for i, test := range tests {
Expand Down
5 changes: 3 additions & 2 deletions pkg/kubelet/status/status_manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -349,8 +349,9 @@ func (m *manager) SetContainerReadiness(podUID types.UID, containerID kubecontai
status.Conditions = append(status.Conditions, condition)
}
}
updateConditionFunc(v1.PodReady, GeneratePodReadyCondition(&pod.Spec, status.Conditions, status.ContainerStatuses, status.Phase))
updateConditionFunc(v1.ContainersReady, GenerateContainersReadyCondition(&pod.Spec, status.ContainerStatuses, status.Phase))
allContainerStatuses := append(status.InitContainerStatuses, status.ContainerStatuses...)
updateConditionFunc(v1.PodReady, GeneratePodReadyCondition(&pod.Spec, status.Conditions, allContainerStatuses, status.Phase))
updateConditionFunc(v1.ContainersReady, GenerateContainersReadyCondition(&pod.Spec, allContainerStatuses, status.Phase))
m.updateStatusInternal(pod, status, false, false)
}

Expand Down

0 comments on commit 9d6c103

Please sign in to comment.