Merge pull request #127202 from SergeyKanzhelev/automated-cherry-pick-of-#127162-upstream-release-1.31

Automated cherry pick of #127162: Avoid SidecarContainers code path for non-sidecar pods
This commit is contained in:
Kubernetes Prow Robot 2024-09-09 20:51:57 +01:00 committed by GitHub
commit 8cf2eb9a9e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 46 additions and 12 deletions

View File

@ -832,7 +832,7 @@ func (m *kubeGenericRuntimeManager) killContainersWithSyncResult(ctx context.Con
wg.Add(len(runningPod.Containers)) wg.Add(len(runningPod.Containers))
var termOrdering *terminationOrdering var termOrdering *terminationOrdering
// we only care about container termination ordering if the sidecars feature is enabled // we only care about container termination ordering if the sidecars feature is enabled
if utilfeature.DefaultFeatureGate.Enabled(features.SidecarContainers) { if utilfeature.DefaultFeatureGate.Enabled(features.SidecarContainers) && types.HasRestartableInitContainer(pod) {
var runningContainerNames []string var runningContainerNames []string
for _, container := range runningPod.Containers { for _, container := range runningPod.Containers {
runningContainerNames = append(runningContainerNames, container.Name) runningContainerNames = append(runningContainerNames, container.Name)

View File

@ -833,6 +833,8 @@ func (m *kubeGenericRuntimeManager) computePodActions(ctx context.Context, pod *
ContainersToKill: make(map[kubecontainer.ContainerID]containerToKillInfo), ContainersToKill: make(map[kubecontainer.ContainerID]containerToKillInfo),
} }
handleRestartableInitContainers := utilfeature.DefaultFeatureGate.Enabled(features.SidecarContainers) && types.HasRestartableInitContainer(pod)
// If we need to (re-)create the pod sandbox, everything will need to be // If we need to (re-)create the pod sandbox, everything will need to be
// killed and recreated, and init containers should be purged. // killed and recreated, and init containers should be purged.
if createPodSandbox { if createPodSandbox {
@ -862,7 +864,7 @@ func (m *kubeGenericRuntimeManager) computePodActions(ctx context.Context, pod *
// is done and there is no container to start. // is done and there is no container to start.
if len(containersToStart) == 0 { if len(containersToStart) == 0 {
hasInitialized := false hasInitialized := false
if !utilfeature.DefaultFeatureGate.Enabled(features.SidecarContainers) { if !handleRestartableInitContainers {
_, _, hasInitialized = findNextInitContainerToRun(pod, podStatus) _, _, hasInitialized = findNextInitContainerToRun(pod, podStatus)
} else { } else {
// If there is any regular container, it means all init containers have // If there is any regular container, it means all init containers have
@ -880,7 +882,7 @@ func (m *kubeGenericRuntimeManager) computePodActions(ctx context.Context, pod *
// state. // state.
if len(pod.Spec.InitContainers) != 0 { if len(pod.Spec.InitContainers) != 0 {
// Pod has init containers, return the first one. // Pod has init containers, return the first one.
if !utilfeature.DefaultFeatureGate.Enabled(features.SidecarContainers) { if !handleRestartableInitContainers {
changes.NextInitContainerToStart = &pod.Spec.InitContainers[0] changes.NextInitContainerToStart = &pod.Spec.InitContainers[0]
} else { } else {
changes.InitContainersToStart = []int{0} changes.InitContainersToStart = []int{0}
@ -903,7 +905,7 @@ func (m *kubeGenericRuntimeManager) computePodActions(ctx context.Context, pod *
} }
// Check initialization progress. // Check initialization progress.
if !utilfeature.DefaultFeatureGate.Enabled(features.SidecarContainers) { if !handleRestartableInitContainers {
initLastStatus, next, done := findNextInitContainerToRun(pod, podStatus) initLastStatus, next, done := findNextInitContainerToRun(pod, podStatus)
if !done { if !done {
if next != nil { if next != nil {
@ -1027,7 +1029,7 @@ func (m *kubeGenericRuntimeManager) computePodActions(ctx context.Context, pod *
if keepCount == 0 && len(changes.ContainersToStart) == 0 { if keepCount == 0 && len(changes.ContainersToStart) == 0 {
changes.KillPod = true changes.KillPod = true
if utilfeature.DefaultFeatureGate.Enabled(features.SidecarContainers) { if handleRestartableInitContainers {
// To prevent the restartable init containers to keep pod alive, we should // To prevent the restartable init containers to keep pod alive, we should
// not restart them. // not restart them.
changes.InitContainersToStart = nil changes.InitContainersToStart = nil
@ -1285,7 +1287,7 @@ func (m *kubeGenericRuntimeManager) SyncPod(ctx context.Context, pod *v1.Pod, po
start(ctx, "ephemeral container", metrics.EphemeralContainer, ephemeralContainerStartSpec(&pod.Spec.EphemeralContainers[idx])) start(ctx, "ephemeral container", metrics.EphemeralContainer, ephemeralContainerStartSpec(&pod.Spec.EphemeralContainers[idx]))
} }
if !utilfeature.DefaultFeatureGate.Enabled(features.SidecarContainers) { if !types.HasRestartableInitContainer(pod) {
// Step 6: start the init container. // Step 6: start the init container.
if container := podContainerChanges.NextInitContainerToStart; container != nil { if container := podContainerChanges.NextInitContainerToStart; container != nil {
// Start the next init container. // Start the next init container.

View File

@ -51,6 +51,7 @@ import (
containertest "k8s.io/kubernetes/pkg/kubelet/container/testing" containertest "k8s.io/kubernetes/pkg/kubelet/container/testing"
imagetypes "k8s.io/kubernetes/pkg/kubelet/images" imagetypes "k8s.io/kubernetes/pkg/kubelet/images"
proberesults "k8s.io/kubernetes/pkg/kubelet/prober/results" proberesults "k8s.io/kubernetes/pkg/kubelet/prober/results"
kubelettypes "k8s.io/kubernetes/pkg/kubelet/types"
) )
var ( var (
@ -1428,6 +1429,20 @@ func testComputePodActionsWithInitContainers(t *testing.T, sidecarContainersEnab
ContainersToKill: getKillMapWithInitContainers(basePod, baseStatus, []int{}), ContainersToKill: getKillMapWithInitContainers(basePod, baseStatus, []int{}),
}, },
}, },
"an init container is in the created state due to an unknown error when starting container; restart it": {
mutatePodFn: func(pod *v1.Pod) { pod.Spec.RestartPolicy = v1.RestartPolicyAlways },
mutateStatusFn: func(status *kubecontainer.PodStatus) {
status.ContainerStatuses[2].State = kubecontainer.ContainerStateCreated
},
actions: podActions{
KillPod: false,
SandboxID: baseStatus.SandboxStatuses[0].Id,
NextInitContainerToStart: &basePod.Spec.InitContainers[2],
InitContainersToStart: []int{2},
ContainersToStart: []int{},
ContainersToKill: getKillMapWithInitContainers(basePod, baseStatus, []int{}),
},
},
} { } {
pod, status := makeBasePodAndStatusWithInitContainers() pod, status := makeBasePodAndStatusWithInitContainers()
if test.mutatePodFn != nil { if test.mutatePodFn != nil {
@ -1438,12 +1453,15 @@ func testComputePodActionsWithInitContainers(t *testing.T, sidecarContainersEnab
} }
ctx := context.Background() ctx := context.Background()
actions := m.computePodActions(ctx, pod, status) actions := m.computePodActions(ctx, pod, status)
if !sidecarContainersEnabled { handleRestartableInitContainers := sidecarContainersEnabled && kubelettypes.HasRestartableInitContainer(pod)
// If sidecar containers are disabled, we should not see any if !handleRestartableInitContainers {
// If sidecar containers are disabled or the pod does not have any
// restartable init container, we should not see any
// InitContainersToStart in the actions. // InitContainersToStart in the actions.
test.actions.InitContainersToStart = nil test.actions.InitContainersToStart = nil
} else { } else {
// If sidecar containers are enabled, we should not see any // If sidecar containers are enabled and the pod has any
// restartable init container, we should not see any
// NextInitContainerToStart in the actions. // NextInitContainerToStart in the actions.
test.actions.NextInitContainerToStart = nil test.actions.NextInitContainerToStart = nil
} }
@ -2041,12 +2059,15 @@ func testComputePodActionsWithInitAndEphemeralContainers(t *testing.T, sidecarCo
} }
ctx := context.Background() ctx := context.Background()
actions := m.computePodActions(ctx, pod, status) actions := m.computePodActions(ctx, pod, status)
if !sidecarContainersEnabled { handleRestartableInitContainers := sidecarContainersEnabled && kubelettypes.HasRestartableInitContainer(pod)
// If sidecar containers are disabled, we should not see any if !handleRestartableInitContainers {
// If sidecar containers are disabled or the pod does not have any
// restartable init container, we should not see any
// InitContainersToStart in the actions. // InitContainersToStart in the actions.
test.actions.InitContainersToStart = nil test.actions.InitContainersToStart = nil
} else { } else {
// If sidecar containers are enabled, we should not see any // If sidecar containers are enabled and the pod has any
// restartable init container, we should not see any
// NextInitContainerToStart in the actions. // NextInitContainerToStart in the actions.
test.actions.NextInitContainerToStart = nil test.actions.NextInitContainerToStart = nil
} }

View File

@ -202,3 +202,14 @@ func IsRestartableInitContainer(initContainer *v1.Container) bool {
return *initContainer.RestartPolicy == v1.ContainerRestartPolicyAlways return *initContainer.RestartPolicy == v1.ContainerRestartPolicyAlways
} }
// HasRestartableInitContainer returns true if the pod has any restartable init
// container
func HasRestartableInitContainer(pod *v1.Pod) bool {
for _, container := range pod.Spec.InitContainers {
if IsRestartableInitContainer(&container) {
return true
}
}
return false
}