Merge pull request #124901 from zhifei92/normalize-ephemeral-container-status

normalize ephemeral container statuses
This commit is contained in:
Kubernetes Prow Robot 2024-09-14 18:21:12 +01:00 committed by GitHub
commit 99891ef08d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 80 additions and 26 deletions

View File

@ -993,7 +993,7 @@ func (m *manager) needsReconcile(uid types.UID, status v1.PodStatus) bool {
// Related issue #15262/PR #15263 to move apiserver to RFC339NANO is closed. // Related issue #15262/PR #15263 to move apiserver to RFC339NANO is closed.
func normalizeStatus(pod *v1.Pod, status *v1.PodStatus) *v1.PodStatus { func normalizeStatus(pod *v1.Pod, status *v1.PodStatus) *v1.PodStatus {
bytesPerStatus := kubecontainer.MaxPodTerminationMessageLogLength bytesPerStatus := kubecontainer.MaxPodTerminationMessageLogLength
if containers := len(pod.Spec.Containers) + len(pod.Spec.InitContainers); containers > 0 { if containers := len(pod.Spec.Containers) + len(pod.Spec.InitContainers) + len(pod.Spec.EphemeralContainers); containers > 0 {
bytesPerStatus = bytesPerStatus / containers bytesPerStatus = bytesPerStatus / containers
} }
normalizeTimeStamp := func(t *metav1.Time) { normalizeTimeStamp := func(t *metav1.Time) {
@ -1021,23 +1021,23 @@ func normalizeStatus(pod *v1.Pod, status *v1.PodStatus) *v1.PodStatus {
normalizeTimeStamp(&condition.LastTransitionTime) normalizeTimeStamp(&condition.LastTransitionTime)
} }
// update container statuses normalizeContainerStatuses := func(containerStatuses []v1.ContainerStatus) {
for i := range status.ContainerStatuses { for i := range containerStatuses {
cstatus := &status.ContainerStatuses[i] cstatus := &containerStatuses[i]
normalizeContainerState(&cstatus.State) normalizeContainerState(&cstatus.State)
normalizeContainerState(&cstatus.LastTerminationState) normalizeContainerState(&cstatus.LastTerminationState)
}
} }
// Sort the container statuses, so that the order won't affect the result of comparison
normalizeContainerStatuses(status.ContainerStatuses)
sort.Sort(kubetypes.SortedContainerStatuses(status.ContainerStatuses)) sort.Sort(kubetypes.SortedContainerStatuses(status.ContainerStatuses))
// update init container statuses normalizeContainerStatuses(status.InitContainerStatuses)
for i := range status.InitContainerStatuses {
cstatus := &status.InitContainerStatuses[i]
normalizeContainerState(&cstatus.State)
normalizeContainerState(&cstatus.LastTerminationState)
}
// Sort the container statuses, so that the order won't affect the result of comparison
kubetypes.SortInitContainerStatuses(pod, status.InitContainerStatuses) kubetypes.SortInitContainerStatuses(pod, status.InitContainerStatuses)
normalizeContainerStatuses(status.EphemeralContainerStatuses)
sort.Sort(kubetypes.SortedContainerStatuses(status.EphemeralContainerStatuses))
return status return status
} }

View File

@ -445,22 +445,32 @@ func shuffle(statuses []v1.ContainerStatus) []v1.ContainerStatus {
} }
func TestStatusEquality(t *testing.T) { func TestStatusEquality(t *testing.T) {
pod := v1.Pod{ getContainersAndStatuses := func() ([]v1.Container, []v1.ContainerStatus) {
Spec: v1.PodSpec{}, var containers []v1.Container
} var containerStatuses []v1.ContainerStatus
containerStatus := []v1.ContainerStatus{} for i := 0; i < 10; i++ {
for i := 0; i < 10; i++ { containerName := fmt.Sprintf("container%d", i)
s := v1.ContainerStatus{ containers = append(containers, v1.Container{Name: containerName})
Name: fmt.Sprintf("container%d", i), containerStatuses = append(containerStatuses, v1.ContainerStatus{Name: containerName})
} }
containerStatus = append(containerStatus, s) return containers, containerStatuses
}
containers, containerStatuses := getContainersAndStatuses()
pod := v1.Pod{
Spec: v1.PodSpec{
InitContainers: containers,
},
} }
podStatus := v1.PodStatus{ podStatus := v1.PodStatus{
ContainerStatuses: containerStatus, ContainerStatuses: containerStatuses,
InitContainerStatuses: containerStatuses,
EphemeralContainerStatuses: containerStatuses,
} }
for i := 0; i < 10; i++ { for i := 0; i < 10; i++ {
oldPodStatus := v1.PodStatus{ oldPodStatus := v1.PodStatus{
ContainerStatuses: shuffle(podStatus.ContainerStatuses), ContainerStatuses: shuffle(podStatus.ContainerStatuses),
InitContainerStatuses: shuffle(podStatus.InitContainerStatuses),
EphemeralContainerStatuses: shuffle(podStatus.EphemeralContainerStatuses),
} }
normalizeStatus(&pod, &oldPodStatus) normalizeStatus(&pod, &oldPodStatus)
normalizeStatus(&pod, &podStatus) normalizeStatus(&pod, &podStatus)
@ -504,8 +514,9 @@ func TestStatusNormalizationEnforcesMaxBytes(t *testing.T) {
containerStatus = append(containerStatus, s) containerStatus = append(containerStatus, s)
} }
podStatus := v1.PodStatus{ podStatus := v1.PodStatus{
InitContainerStatuses: containerStatus[:24], InitContainerStatuses: containerStatus[:16],
ContainerStatuses: containerStatus[24:], ContainerStatuses: containerStatus[16:32],
EphemeralContainerStatuses: containerStatus[32:],
} }
result := normalizeStatus(&pod, &podStatus) result := normalizeStatus(&pod, &podStatus)
count := 0 count := 0
@ -521,6 +532,49 @@ func TestStatusNormalizationEnforcesMaxBytes(t *testing.T) {
} }
} }
func TestStatusNormalizeTimeStamp(t *testing.T) {
pod := v1.Pod{
Spec: v1.PodSpec{},
}
now := metav1.Now()
podStatus := v1.PodStatus{
ContainerStatuses: []v1.ContainerStatus{
{State: v1.ContainerState{Running: &v1.ContainerStateRunning{StartedAt: now}}},
{State: v1.ContainerState{Terminated: &v1.ContainerStateTerminated{StartedAt: now, FinishedAt: now}}},
},
InitContainerStatuses: []v1.ContainerStatus{
{State: v1.ContainerState{Running: &v1.ContainerStateRunning{StartedAt: now}}},
{State: v1.ContainerState{Terminated: &v1.ContainerStateTerminated{StartedAt: now, FinishedAt: now}}},
},
EphemeralContainerStatuses: []v1.ContainerStatus{
{State: v1.ContainerState{Running: &v1.ContainerStateRunning{StartedAt: now}}},
{State: v1.ContainerState{Terminated: &v1.ContainerStateTerminated{StartedAt: now, FinishedAt: now}}},
},
}
expectedTime := now.DeepCopy().Rfc3339Copy()
expectedPodStatus := v1.PodStatus{
ContainerStatuses: []v1.ContainerStatus{
{State: v1.ContainerState{Running: &v1.ContainerStateRunning{StartedAt: expectedTime}}},
{State: v1.ContainerState{Terminated: &v1.ContainerStateTerminated{StartedAt: expectedTime, FinishedAt: expectedTime}}},
},
InitContainerStatuses: []v1.ContainerStatus{
{State: v1.ContainerState{Running: &v1.ContainerStateRunning{StartedAt: expectedTime}}},
{State: v1.ContainerState{Terminated: &v1.ContainerStateTerminated{StartedAt: expectedTime, FinishedAt: expectedTime}}},
},
EphemeralContainerStatuses: []v1.ContainerStatus{
{State: v1.ContainerState{Running: &v1.ContainerStateRunning{StartedAt: expectedTime}}},
{State: v1.ContainerState{Terminated: &v1.ContainerStateTerminated{StartedAt: expectedTime, FinishedAt: expectedTime}}},
},
}
normalizedStatus := normalizeStatus(&pod, &podStatus)
if !isPodStatusByKubeletEqual(&expectedPodStatus, normalizedStatus) {
t.Fatalf("The timestamp is not correctly converted to RFC3339 format.")
}
}
func TestStaticPod(t *testing.T) { func TestStaticPod(t *testing.T) {
staticPod := getTestPod() staticPod := getTestPod()
staticPod.Annotations = map[string]string{kubetypes.ConfigSourceAnnotationKey: "file"} staticPod.Annotations = map[string]string{kubetypes.ConfigSourceAnnotationKey: "file"}