mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-27 05:27:21 +00:00
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:
commit
8cf2eb9a9e
@ -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)
|
||||||
|
@ -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.
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user