From 763e810fb58e03c32a26ed504668261795bf91bf Mon Sep 17 00:00:00 2001 From: vivzbansal Date: Thu, 7 Nov 2024 19:45:40 +0000 Subject: [PATCH 1/3] refactor code to add sidecar container support in IPPR --- pkg/api/pod/util.go | 9 +++++++++ pkg/api/v1/pod/util.go | 9 +++++++++ pkg/kubelet/apis/podresources/server_v1.go | 6 +++--- pkg/kubelet/cm/cpumanager/policy_static.go | 5 ++--- pkg/kubelet/cm/devicemanager/manager.go | 4 ++-- pkg/kubelet/cm/memorymanager/memory_manager.go | 4 ++-- pkg/kubelet/cm/memorymanager/policy_static.go | 7 +++---- pkg/kubelet/kubelet_pods.go | 4 ++-- .../kuberuntime/kuberuntime_container.go | 13 +++++++------ pkg/kubelet/kuberuntime/kuberuntime_manager.go | 3 ++- .../kuberuntime_termination_order.go | 4 ++-- pkg/kubelet/lifecycle/predicate.go | 3 ++- pkg/kubelet/prober/prober_manager.go | 6 +++--- pkg/kubelet/status/generate.go | 5 ++--- pkg/kubelet/status/status_manager.go | 4 ++-- pkg/kubelet/types/pod_update.go | 13 ++----------- pkg/printers/internalversion/printers.go | 18 ++++-------------- 17 files changed, 58 insertions(+), 59 deletions(-) diff --git a/pkg/api/pod/util.go b/pkg/api/pod/util.go index 9ad259147d0..1cf0c22e55d 100644 --- a/pkg/api/pod/util.go +++ b/pkg/api/pod/util.go @@ -1227,6 +1227,15 @@ func hasInvalidLabelValueInAffinitySelector(spec *api.PodSpec) bool { return false } +// IsRestartableInitContainer returns true if the initContainer has +// ContainerRestartPolicyAlways. +func IsRestartableInitContainer(initContainer *api.Container) bool { + if initContainer == nil || initContainer.RestartPolicy == nil { + return false + } + return *initContainer.RestartPolicy == api.ContainerRestartPolicyAlways +} + func MarkPodProposedForResize(oldPod, newPod *api.Pod) { if len(newPod.Spec.Containers) != len(oldPod.Spec.Containers) { // Update is invalid: ignore changes and let validation handle it diff --git a/pkg/api/v1/pod/util.go b/pkg/api/v1/pod/util.go index ba283df4163..5bad226b7ef 100644 --- a/pkg/api/v1/pod/util.go +++ b/pkg/api/v1/pod/util.go @@ -406,3 +406,12 @@ func UpdatePodCondition(status *v1.PodStatus, condition *v1.PodCondition) bool { // Return true if one of the fields have changed. return !isEqual } + +// IsRestartableInitContainer returns true if the initContainer has +// ContainerRestartPolicyAlways. +func IsRestartableInitContainer(initContainer *v1.Container) bool { + if initContainer == nil || initContainer.RestartPolicy == nil { + return false + } + return *initContainer.RestartPolicy == v1.ContainerRestartPolicyAlways +} diff --git a/pkg/kubelet/apis/podresources/server_v1.go b/pkg/kubelet/apis/podresources/server_v1.go index fdfd1e6650a..7d10449ad18 100644 --- a/pkg/kubelet/apis/podresources/server_v1.go +++ b/pkg/kubelet/apis/podresources/server_v1.go @@ -22,9 +22,9 @@ import ( v1 "k8s.io/api/core/v1" utilfeature "k8s.io/apiserver/pkg/util/feature" + podutil "k8s.io/kubernetes/pkg/api/v1/pod" kubefeatures "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/kubelet/metrics" - "k8s.io/kubernetes/pkg/kubelet/types" podresourcesv1 "k8s.io/kubelet/pkg/apis/podresources/v1" ) @@ -70,7 +70,7 @@ func (p *v1PodResourcesServer) List(ctx context.Context, req *podresourcesv1.Lis pRes.Containers = make([]*podresourcesv1.ContainerResources, 0, len(pod.Spec.InitContainers)+len(pod.Spec.Containers)) for _, container := range pod.Spec.InitContainers { - if !types.IsRestartableInitContainer(&container) { + if !podutil.IsRestartableInitContainer(&container) { continue } @@ -130,7 +130,7 @@ func (p *v1PodResourcesServer) Get(ctx context.Context, req *podresourcesv1.GetP podResources.Containers = make([]*podresourcesv1.ContainerResources, 0, len(pod.Spec.InitContainers)+len(pod.Spec.Containers)) for _, container := range pod.Spec.InitContainers { - if !types.IsRestartableInitContainer(&container) { + if !podutil.IsRestartableInitContainer(&container) { continue } diff --git a/pkg/kubelet/cm/cpumanager/policy_static.go b/pkg/kubelet/cm/cpumanager/policy_static.go index f3179b76375..26d1fc6d91b 100644 --- a/pkg/kubelet/cm/cpumanager/policy_static.go +++ b/pkg/kubelet/cm/cpumanager/policy_static.go @@ -30,7 +30,6 @@ import ( "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager" "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/bitmask" "k8s.io/kubernetes/pkg/kubelet/metrics" - "k8s.io/kubernetes/pkg/kubelet/types" "k8s.io/utils/cpuset" ) @@ -298,7 +297,7 @@ func (p *staticPolicy) updateCPUsToReuse(pod *v1.Pod, container *v1.Container, c // If so, add its cpuset to the cpuset of reusable CPUs for any new allocations. for _, initContainer := range pod.Spec.InitContainers { if container.Name == initContainer.Name { - if types.IsRestartableInitContainer(&initContainer) { + if podutil.IsRestartableInitContainer(&initContainer) { // If the container is a restartable init container, we should not // reuse its cpuset, as a restartable init container can run with // regular containers. @@ -489,7 +488,7 @@ func (p *staticPolicy) podGuaranteedCPUs(pod *v1.Pod) int { requestedCPU := p.guaranteedCPUs(pod, &container) // See https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/753-sidecar-containers#resources-calculation-for-scheduling-and-pod-admission // for the detail. - if types.IsRestartableInitContainer(&container) { + if podutil.IsRestartableInitContainer(&container) { requestedByRestartableInitContainers += requestedCPU } else if requestedByRestartableInitContainers+requestedCPU > requestedByInitContainers { requestedByInitContainers = requestedByRestartableInitContainers + requestedCPU diff --git a/pkg/kubelet/cm/devicemanager/manager.go b/pkg/kubelet/cm/devicemanager/manager.go index e13b03931da..b6a8104624a 100644 --- a/pkg/kubelet/cm/devicemanager/manager.go +++ b/pkg/kubelet/cm/devicemanager/manager.go @@ -37,6 +37,7 @@ import ( "k8s.io/apiserver/pkg/server/healthz" utilfeature "k8s.io/apiserver/pkg/util/feature" pluginapi "k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1" + podutil "k8s.io/kubernetes/pkg/api/v1/pod" "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/kubelet/checkpointmanager" "k8s.io/kubernetes/pkg/kubelet/checkpointmanager/errors" @@ -49,7 +50,6 @@ import ( "k8s.io/kubernetes/pkg/kubelet/lifecycle" "k8s.io/kubernetes/pkg/kubelet/metrics" "k8s.io/kubernetes/pkg/kubelet/pluginmanager/cache" - "k8s.io/kubernetes/pkg/kubelet/types" schedulerframework "k8s.io/kubernetes/pkg/scheduler/framework" ) @@ -384,7 +384,7 @@ func (m *ManagerImpl) Allocate(pod *v1.Pod, container *v1.Container) error { if err := m.allocateContainerResources(pod, container, m.devicesToReuse[string(pod.UID)]); err != nil { return err } - if !types.IsRestartableInitContainer(&initContainer) { + if !podutil.IsRestartableInitContainer(&initContainer) { m.podDevices.addContainerAllocatedResources(string(pod.UID), container.Name, m.devicesToReuse[string(pod.UID)]) } else { // If the init container is restartable, we need to keep the diff --git a/pkg/kubelet/cm/memorymanager/memory_manager.go b/pkg/kubelet/cm/memorymanager/memory_manager.go index 831afb193ea..fcadbbf4301 100644 --- a/pkg/kubelet/cm/memorymanager/memory_manager.go +++ b/pkg/kubelet/cm/memorymanager/memory_manager.go @@ -28,6 +28,7 @@ import ( "k8s.io/apimachinery/pkg/util/sets" runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1" "k8s.io/klog/v2" + podutil "k8s.io/kubernetes/pkg/api/v1/pod" corev1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" kubeletconfig "k8s.io/kubernetes/pkg/kubelet/apis/config" "k8s.io/kubernetes/pkg/kubelet/cm/containermap" @@ -35,7 +36,6 @@ import ( "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager" "k8s.io/kubernetes/pkg/kubelet/config" "k8s.io/kubernetes/pkg/kubelet/status" - "k8s.io/kubernetes/pkg/kubelet/types" ) // memoryManagerStateFileName is the file name where memory manager stores its state @@ -209,7 +209,7 @@ func (m *manager) AddContainer(pod *v1.Pod, container *v1.Container, containerID // Since a restartable init container remains running for the full // duration of the pod's lifecycle, we should not remove it from the // memory manager state. - if types.IsRestartableInitContainer(&initContainer) { + if podutil.IsRestartableInitContainer(&initContainer) { continue } diff --git a/pkg/kubelet/cm/memorymanager/policy_static.go b/pkg/kubelet/cm/memorymanager/policy_static.go index 0959d789215..115e74afa27 100644 --- a/pkg/kubelet/cm/memorymanager/policy_static.go +++ b/pkg/kubelet/cm/memorymanager/policy_static.go @@ -34,7 +34,6 @@ import ( "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager" "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/bitmask" "k8s.io/kubernetes/pkg/kubelet/metrics" - "k8s.io/kubernetes/pkg/kubelet/types" ) const policyTypeStatic policyType = "Static" @@ -353,7 +352,7 @@ func getPodRequestedResources(pod *v1.Pod) (map[v1.ResourceName]uint64, error) { // See https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/753-sidecar-containers#resources-calculation-for-scheduling-and-pod-admission // for the detail. - if types.IsRestartableInitContainer(&ctr) { + if podutil.IsRestartableInitContainer(&ctr) { reqRsrcsByRestartableInitCtrs[rsrcName] += qty } else if reqRsrcsByRestartableInitCtrs[rsrcName]+qty > reqRsrcsByInitCtrs[rsrcName] { reqRsrcsByInitCtrs[rsrcName] = reqRsrcsByRestartableInitCtrs[rsrcName] + qty @@ -969,7 +968,7 @@ func (p *staticPolicy) updateInitContainersMemoryBlocks(s state.State, pod *v1.P break } - if types.IsRestartableInitContainer(&initContainer) { + if podutil.IsRestartableInitContainer(&initContainer) { // we should not reuse the resource from any restartable init // container continue @@ -1011,7 +1010,7 @@ func (p *staticPolicy) updateInitContainersMemoryBlocks(s state.State, pod *v1.P func isRegularInitContainer(pod *v1.Pod, container *v1.Container) bool { for _, initContainer := range pod.Spec.InitContainers { if initContainer.Name == container.Name { - return !types.IsRestartableInitContainer(&initContainer) + return !podutil.IsRestartableInitContainer(&initContainer) } } diff --git a/pkg/kubelet/kubelet_pods.go b/pkg/kubelet/kubelet_pods.go index 3d1a08cd740..670fe7ef880 100644 --- a/pkg/kubelet/kubelet_pods.go +++ b/pkg/kubelet/kubelet_pods.go @@ -1585,7 +1585,7 @@ func getPhase(pod *v1.Pod, info []v1.ContainerStatus, podIsTerminal bool) v1.Pod // regular init containers for _, container := range spec.InitContainers { - if kubetypes.IsRestartableInitContainer(&container) { + if podutil.IsRestartableInitContainer(&container) { // Skip the restartable init containers here to handle them separately as // they are slightly different from the init containers in terms of the // pod phase. @@ -1628,7 +1628,7 @@ func getPhase(pod *v1.Pod, info []v1.ContainerStatus, podIsTerminal bool) v1.Pod if utilfeature.DefaultFeatureGate.Enabled(features.SidecarContainers) { // restartable init containers for _, container := range spec.InitContainers { - if !kubetypes.IsRestartableInitContainer(&container) { + if !podutil.IsRestartableInitContainer(&container) { // Skip the regular init containers, as they have been handled above. continue } diff --git a/pkg/kubelet/kuberuntime/kuberuntime_container.go b/pkg/kubelet/kuberuntime/kuberuntime_container.go index 631af02b4fe..a154754d285 100644 --- a/pkg/kubelet/kuberuntime/kuberuntime_container.go +++ b/pkg/kubelet/kuberuntime/kuberuntime_container.go @@ -50,6 +50,7 @@ import ( runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1" remote "k8s.io/cri-client/pkg" kubelettypes "k8s.io/kubelet/pkg/types" + podutil "k8s.io/kubernetes/pkg/api/v1/pod" "k8s.io/kubernetes/pkg/features" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" "k8s.io/kubernetes/pkg/kubelet/events" @@ -1070,13 +1071,13 @@ func (m *kubeGenericRuntimeManager) computeInitContainerActions(pod *v1.Pod, pod // If the container is previously initialized but its status is not // found, it means its last status is removed for some reason. // Restart it if it is a restartable init container. - if isPreviouslyInitialized && types.IsRestartableInitContainer(container) { + if isPreviouslyInitialized && podutil.IsRestartableInitContainer(container) { changes.InitContainersToStart = append(changes.InitContainersToStart, i) } continue } - if isPreviouslyInitialized && !types.IsRestartableInitContainer(container) { + if isPreviouslyInitialized && !podutil.IsRestartableInitContainer(container) { // after initialization, only restartable init containers need to be kept // running continue @@ -1092,11 +1093,11 @@ func (m *kubeGenericRuntimeManager) computeInitContainerActions(pod *v1.Pod, pod changes.InitContainersToStart = append(changes.InitContainersToStart, i) case kubecontainer.ContainerStateRunning: - if !types.IsRestartableInitContainer(container) { + if !podutil.IsRestartableInitContainer(container) { break } - if types.IsRestartableInitContainer(container) { + if podutil.IsRestartableInitContainer(container) { if container.StartupProbe != nil { startup, found := m.startupManager.Get(status.ID) if !found { @@ -1167,7 +1168,7 @@ func (m *kubeGenericRuntimeManager) computeInitContainerActions(pod *v1.Pod, pod // If the init container failed and the restart policy is Never, the pod is terminal. // Otherwise, restart the init container. case kubecontainer.ContainerStateExited: - if types.IsRestartableInitContainer(container) { + if podutil.IsRestartableInitContainer(container) { changes.InitContainersToStart = append(changes.InitContainersToStart, i) } else { // init container if isInitContainerFailed(status) { @@ -1190,7 +1191,7 @@ func (m *kubeGenericRuntimeManager) computeInitContainerActions(pod *v1.Pod, pod } default: // kubecontainer.ContainerStatusUnknown or other unknown states - if types.IsRestartableInitContainer(container) { + if podutil.IsRestartableInitContainer(container) { // If the restartable init container is in unknown state, restart it. changes.ContainersToKill[status.ID] = containerToKillInfo{ name: container.Name, diff --git a/pkg/kubelet/kuberuntime/kuberuntime_manager.go b/pkg/kubelet/kuberuntime/kuberuntime_manager.go index 949024d66e2..fe2a338433c 100644 --- a/pkg/kubelet/kuberuntime/kuberuntime_manager.go +++ b/pkg/kubelet/kuberuntime/kuberuntime_manager.go @@ -46,6 +46,7 @@ import ( runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1" "k8s.io/kubernetes/pkg/api/legacyscheme" + podutil "k8s.io/kubernetes/pkg/api/v1/pod" "k8s.io/kubernetes/pkg/credentialprovider" "k8s.io/kubernetes/pkg/credentialprovider/plugin" "k8s.io/kubernetes/pkg/features" @@ -1321,7 +1322,7 @@ func (m *kubeGenericRuntimeManager) SyncPod(ctx context.Context, pod *v1.Pod, po container := &pod.Spec.InitContainers[idx] // Start the next init container. if err := start(ctx, "init container", metrics.InitContainer, containerStartSpec(container)); err != nil { - if types.IsRestartableInitContainer(container) { + if podutil.IsRestartableInitContainer(container) { klog.V(4).InfoS("Failed to start the restartable init container for the pod, skipping", "initContainerName", container.Name, "pod", klog.KObj(pod)) continue } diff --git a/pkg/kubelet/kuberuntime/kuberuntime_termination_order.go b/pkg/kubelet/kuberuntime/kuberuntime_termination_order.go index 21fff12d46d..eee7c869b23 100644 --- a/pkg/kubelet/kuberuntime/kuberuntime_termination_order.go +++ b/pkg/kubelet/kuberuntime/kuberuntime_termination_order.go @@ -22,7 +22,7 @@ import ( v1 "k8s.io/api/core/v1" - "k8s.io/kubernetes/pkg/kubelet/types" + podutil "k8s.io/kubernetes/pkg/api/v1/pod" ) // terminationOrdering is used to enforce a termination ordering for sidecar containers. It sets up @@ -80,7 +80,7 @@ func newTerminationOrdering(pod *v1.Pod, runningContainerNames []string) *termin close(channel) } - if types.IsRestartableInitContainer(&ic) { + if podutil.IsRestartableInitContainer(&ic) { // sidecars need to wait for all main containers to exit to.prereqs[ic.Name] = append(to.prereqs[ic.Name], mainContainerChannels...) diff --git a/pkg/kubelet/lifecycle/predicate.go b/pkg/kubelet/lifecycle/predicate.go index fc0361cd188..dea1ca9a4a0 100644 --- a/pkg/kubelet/lifecycle/predicate.go +++ b/pkg/kubelet/lifecycle/predicate.go @@ -24,6 +24,7 @@ import ( utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/component-helpers/scheduling/corev1" "k8s.io/klog/v2" + podutil "k8s.io/kubernetes/pkg/api/v1/pod" v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/kubelet/types" @@ -141,7 +142,7 @@ func (w *predicateAdmitHandler) Admit(attrs *PodAdmitAttributes) PodAdmitResult // TODO: Remove this after the SidecarContainers feature gate graduates to GA. if !utilfeature.DefaultFeatureGate.Enabled(features.SidecarContainers) { for _, c := range admitPod.Spec.InitContainers { - if types.IsRestartableInitContainer(&c) { + if podutil.IsRestartableInitContainer(&c) { message := fmt.Sprintf("Init container %q may not have a non-default restartPolicy", c.Name) klog.InfoS("Failed to admit pod", "pod", klog.KObj(admitPod), "message", message) return PodAdmitResult{ diff --git a/pkg/kubelet/prober/prober_manager.go b/pkg/kubelet/prober/prober_manager.go index 1a92699f075..a400bd094ab 100644 --- a/pkg/kubelet/prober/prober_manager.go +++ b/pkg/kubelet/prober/prober_manager.go @@ -26,10 +26,10 @@ import ( "k8s.io/client-go/tools/record" "k8s.io/component-base/metrics" "k8s.io/klog/v2" + podutil "k8s.io/kubernetes/pkg/api/v1/pod" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" "k8s.io/kubernetes/pkg/kubelet/prober/results" "k8s.io/kubernetes/pkg/kubelet/status" - kubetypes "k8s.io/kubernetes/pkg/kubelet/types" kubeutil "k8s.io/kubernetes/pkg/kubelet/util" "k8s.io/utils/clock" ) @@ -171,7 +171,7 @@ func (t probeType) String() string { func getRestartableInitContainers(pod *v1.Pod) []v1.Container { var restartableInitContainers []v1.Container for _, c := range pod.Spec.InitContainers { - if kubetypes.IsRestartableInitContainer(&c) { + if podutil.IsRestartableInitContainer(&c) { restartableInitContainers = append(restartableInitContainers, c) } } @@ -325,7 +325,7 @@ func (m *manager) UpdatePodStatus(pod *v1.Pod, podStatus *v1.PodStatus) { klog.V(4).InfoS("Mismatch between pod spec and status, likely programmer error", "pod", klog.KObj(pod), "containerName", c.Name) continue } - if !kubetypes.IsRestartableInitContainer(&initContainer) { + if !podutil.IsRestartableInitContainer(&initContainer) { if c.State.Terminated != nil && c.State.Terminated.ExitCode == 0 { podStatus.InitContainerStatuses[i].Ready = true } diff --git a/pkg/kubelet/status/generate.go b/pkg/kubelet/status/generate.go index 774cbadb4c2..2c3a9b08026 100644 --- a/pkg/kubelet/status/generate.go +++ b/pkg/kubelet/status/generate.go @@ -24,7 +24,6 @@ import ( podutil "k8s.io/kubernetes/pkg/api/v1/pod" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" runtimeutil "k8s.io/kubernetes/pkg/kubelet/kuberuntime/util" - kubetypes "k8s.io/kubernetes/pkg/kubelet/types" ) const ( @@ -57,7 +56,7 @@ func GenerateContainersReadyCondition(spec *v1.PodSpec, containerStatuses []v1.C unreadyContainers := []string{} for _, container := range spec.InitContainers { - if !kubetypes.IsRestartableInitContainer(&container) { + if !podutil.IsRestartableInitContainer(&container) { continue } @@ -159,7 +158,7 @@ func GeneratePodReadyCondition(spec *v1.PodSpec, conditions []v1.PodCondition, c } func isInitContainerInitialized(initContainer *v1.Container, containerStatus *v1.ContainerStatus) bool { - if kubetypes.IsRestartableInitContainer(initContainer) { + if podutil.IsRestartableInitContainer(initContainer) { if containerStatus.Started == nil || !*containerStatus.Started { return false } diff --git a/pkg/kubelet/status/status_manager.go b/pkg/kubelet/status/status_manager.go index d3f5ce831c0..3da131d5392 100644 --- a/pkg/kubelet/status/status_manager.go +++ b/pkg/kubelet/status/status_manager.go @@ -552,7 +552,7 @@ func hasPodInitialized(pod *v1.Pod) bool { } containerStatus := pod.Status.InitContainerStatuses[l-1] - if kubetypes.IsRestartableInitContainer(&container) { + if podutil.IsRestartableInitContainer(&container) { if containerStatus.State.Running != nil && containerStatus.Started != nil && *containerStatus.Started { return true @@ -616,7 +616,7 @@ func checkContainerStateTransition(oldStatuses, newStatuses *v1.PodStatus, podSp return fmt.Errorf("found mismatch between pod spec and status, container: %v", oldStatus.Name) } // Skip any restartable init container as it always is allowed to restart - if kubetypes.IsRestartableInitContainer(&initContainer) { + if podutil.IsRestartableInitContainer(&initContainer) { continue } // Skip any container that wasn't terminated diff --git a/pkg/kubelet/types/pod_update.go b/pkg/kubelet/types/pod_update.go index 2bec6a9f785..ee4bd58c7e6 100644 --- a/pkg/kubelet/types/pod_update.go +++ b/pkg/kubelet/types/pod_update.go @@ -21,6 +21,7 @@ import ( v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + podutil "k8s.io/kubernetes/pkg/api/v1/pod" "k8s.io/kubernetes/pkg/apis/scheduling" ) @@ -193,21 +194,11 @@ func IsNodeCriticalPod(pod *v1.Pod) bool { return IsCriticalPod(pod) && (pod.Spec.PriorityClassName == scheduling.SystemNodeCritical) } -// IsRestartableInitContainer returns true if the initContainer has -// ContainerRestartPolicyAlways. -func IsRestartableInitContainer(initContainer *v1.Container) bool { - if initContainer.RestartPolicy == nil { - return false - } - - 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) { + if podutil.IsRestartableInitContainer(&container) { return true } } diff --git a/pkg/printers/internalversion/printers.go b/pkg/printers/internalversion/printers.go index c86fb4aaa92..2c1aba0d7bf 100644 --- a/pkg/printers/internalversion/printers.go +++ b/pkg/printers/internalversion/printers.go @@ -53,6 +53,7 @@ import ( "k8s.io/apimachinery/pkg/util/sets" "k8s.io/client-go/util/certificate/csr" + podutil "k8s.io/kubernetes/pkg/api/pod" podutil "k8s.io/kubernetes/pkg/api/v1/pod" "k8s.io/kubernetes/pkg/apis/admissionregistration" "k8s.io/kubernetes/pkg/apis/apiserverinternal" @@ -896,7 +897,7 @@ func printPod(pod *api.Pod, options printers.GenerateOptions) ([]metav1.TableRow initContainers := make(map[string]*api.Container) for i := range pod.Spec.InitContainers { initContainers[pod.Spec.InitContainers[i].Name] = &pod.Spec.InitContainers[i] - if isRestartableInitContainer(&pod.Spec.InitContainers[i]) { + if podutil.IsRestartableInitContainer(&pod.Spec.InitContainers[i]) { totalContainers++ } } @@ -911,7 +912,7 @@ func printPod(pod *api.Pod, options printers.GenerateOptions) ([]metav1.TableRow lastRestartDate = terminatedDate } } - if isRestartableInitContainer(initContainers[container.Name]) { + if podutil.IsRestartableInitContainer(initContainers[container.Name]) { restartableInitContainerRestarts += int(container.RestartCount) if container.LastTerminationState.Terminated != nil { terminatedDate := container.LastTerminationState.Terminated.FinishedAt @@ -923,7 +924,7 @@ func printPod(pod *api.Pod, options printers.GenerateOptions) ([]metav1.TableRow switch { case container.State.Terminated != nil && container.State.Terminated.ExitCode == 0: continue - case isRestartableInitContainer(initContainers[container.Name]) && + case podutil.IsRestartableInitContainer(initContainers[container.Name]) && container.Started != nil && *container.Started: if container.Ready { readyContainers++ @@ -3227,17 +3228,6 @@ func (list SortableResourceNames) Less(i, j int) bool { return list[i] < list[j] } -func isRestartableInitContainer(initContainer *api.Container) bool { - if initContainer == nil { - return false - } - if initContainer.RestartPolicy == nil { - return false - } - - return *initContainer.RestartPolicy == api.ContainerRestartPolicyAlways -} - func isPodInitializedConditionTrue(status *api.PodStatus) bool { for _, condition := range status.Conditions { if condition.Type != api.PodInitialized { From 0548756f06f1fe03a60057993ab6f4109e534701 Mon Sep 17 00:00:00 2001 From: vivzbansal Date: Thu, 7 Nov 2024 21:23:18 +0000 Subject: [PATCH 2/3] Fix duplicate import error --- pkg/printers/internalversion/printers.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/printers/internalversion/printers.go b/pkg/printers/internalversion/printers.go index 2c1aba0d7bf..dacbaca4c9d 100644 --- a/pkg/printers/internalversion/printers.go +++ b/pkg/printers/internalversion/printers.go @@ -54,7 +54,7 @@ import ( "k8s.io/client-go/util/certificate/csr" podutil "k8s.io/kubernetes/pkg/api/pod" - podutil "k8s.io/kubernetes/pkg/api/v1/pod" + podutilv1 "k8s.io/kubernetes/pkg/api/v1/pod" "k8s.io/kubernetes/pkg/apis/admissionregistration" "k8s.io/kubernetes/pkg/apis/apiserverinternal" "k8s.io/kubernetes/pkg/apis/apps" @@ -994,7 +994,7 @@ func printPod(pod *api.Pod, options printers.GenerateOptions) ([]metav1.TableRow if pod.DeletionTimestamp != nil && pod.Status.Reason == node.NodeUnreachablePodReason { reason = "Unknown" - } else if pod.DeletionTimestamp != nil && !podutil.IsPodPhaseTerminal(apiv1.PodPhase(podPhase)) { + } else if pod.DeletionTimestamp != nil && !podutilv1.IsPodPhaseTerminal(apiv1.PodPhase(podPhase)) { reason = "Terminating" } From cf8ee421f186380d0289d7c921456b1d75731132 Mon Sep 17 00:00:00 2001 From: vivzbansal Date: Thu, 7 Nov 2024 22:05:15 +0000 Subject: [PATCH 3/3] Updated the comment of IsRestartableInitContainer(...) --- pkg/api/pod/util.go | 5 +++-- pkg/api/v1/pod/util.go | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/pkg/api/pod/util.go b/pkg/api/pod/util.go index 1cf0c22e55d..a8e19064838 100644 --- a/pkg/api/pod/util.go +++ b/pkg/api/pod/util.go @@ -1227,8 +1227,9 @@ func hasInvalidLabelValueInAffinitySelector(spec *api.PodSpec) bool { return false } -// IsRestartableInitContainer returns true if the initContainer has -// ContainerRestartPolicyAlways. +// IsRestartableInitContainer returns true if the container has ContainerRestartPolicyAlways. +// This function is not checking if the container passed to it is indeed an init container. +// It is just checking if the container restart policy has been set to always. func IsRestartableInitContainer(initContainer *api.Container) bool { if initContainer == nil || initContainer.RestartPolicy == nil { return false diff --git a/pkg/api/v1/pod/util.go b/pkg/api/v1/pod/util.go index 5bad226b7ef..c2fe5197146 100644 --- a/pkg/api/v1/pod/util.go +++ b/pkg/api/v1/pod/util.go @@ -407,8 +407,9 @@ func UpdatePodCondition(status *v1.PodStatus, condition *v1.PodCondition) bool { return !isEqual } -// IsRestartableInitContainer returns true if the initContainer has -// ContainerRestartPolicyAlways. +// IsRestartableInitContainer returns true if the container has ContainerRestartPolicyAlways. +// This function is not checking if the container passed to it is indeed an init container. +// It is just checking if the container restart policy has been set to always. func IsRestartableInitContainer(initContainer *v1.Container) bool { if initContainer == nil || initContainer.RestartPolicy == nil { return false