mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-18 08:09:58 +00:00
Generate containers ready condition including restartable init containers
This commit is contained in:
parent
3bf282652f
commit
9d6c1030db
@ -1725,9 +1725,10 @@ func (kl *Kubelet) generateAPIPodStatus(pod *v1.Pod, podStatus *kubecontainer.Po
|
|||||||
if utilfeature.DefaultFeatureGate.Enabled(features.PodReadyToStartContainersCondition) {
|
if utilfeature.DefaultFeatureGate.Enabled(features.PodReadyToStartContainersCondition) {
|
||||||
s.Conditions = append(s.Conditions, status.GeneratePodReadyToStartContainersCondition(pod, podStatus))
|
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))
|
allContainerStatuses := append(s.InitContainerStatuses, s.ContainerStatuses...)
|
||||||
s.Conditions = append(s.Conditions, status.GeneratePodReadyCondition(&pod.Spec, s.Conditions, s.ContainerStatuses, s.Phase))
|
s.Conditions = append(s.Conditions, status.GeneratePodInitializedCondition(&pod.Spec, allContainerStatuses, s.Phase))
|
||||||
s.Conditions = append(s.Conditions, status.GenerateContainersReadyCondition(&pod.Spec, s.ContainerStatuses, 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{
|
s.Conditions = append(s.Conditions, v1.PodCondition{
|
||||||
Type: v1.PodScheduled,
|
Type: v1.PodScheduled,
|
||||||
Status: v1.ConditionTrue,
|
Status: v1.ConditionTrue,
|
||||||
|
@ -55,6 +55,21 @@ func GenerateContainersReadyCondition(spec *v1.PodSpec, containerStatuses []v1.C
|
|||||||
}
|
}
|
||||||
unknownContainers := []string{}
|
unknownContainers := []string{}
|
||||||
unreadyContainers := []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 {
|
for _, container := range spec.Containers {
|
||||||
if containerStatus, ok := podutil.GetContainerStatus(containerStatuses, container.Name); ok {
|
if containerStatus, ok := podutil.GetContainerStatus(containerStatuses, container.Name); ok {
|
||||||
if !containerStatus.Ready {
|
if !containerStatus.Ready {
|
||||||
|
@ -30,6 +30,10 @@ import (
|
|||||||
"k8s.io/utils/pointer"
|
"k8s.io/utils/pointer"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
containerRestartPolicyAlways = v1.ContainerRestartPolicyAlways
|
||||||
|
)
|
||||||
|
|
||||||
func TestGenerateContainersReadyCondition(t *testing.T) {
|
func TestGenerateContainersReadyCondition(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
spec *v1.PodSpec
|
spec *v1.PodSpec
|
||||||
@ -112,6 +116,74 @@ func TestGenerateContainersReadyCondition(t *testing.T) {
|
|||||||
podPhase: v1.PodSucceeded,
|
podPhase: v1.PodSucceeded,
|
||||||
expectReady: getPodCondition(v1.ContainersReady, v1.ConditionFalse, PodCompleted, ""),
|
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 {
|
for i, test := range tests {
|
||||||
|
@ -349,8 +349,9 @@ func (m *manager) SetContainerReadiness(podUID types.UID, containerID kubecontai
|
|||||||
status.Conditions = append(status.Conditions, condition)
|
status.Conditions = append(status.Conditions, condition)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
updateConditionFunc(v1.PodReady, GeneratePodReadyCondition(&pod.Spec, status.Conditions, status.ContainerStatuses, status.Phase))
|
allContainerStatuses := append(status.InitContainerStatuses, status.ContainerStatuses...)
|
||||||
updateConditionFunc(v1.ContainersReady, GenerateContainersReadyCondition(&pod.Spec, status.ContainerStatuses, status.Phase))
|
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)
|
m.updateStatusInternal(pod, status, false, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user