From 2d8939c4aef8f060d413bb27272ba38cd7171fbe Mon Sep 17 00:00:00 2001 From: Sotiris Salloumis Date: Tue, 22 Oct 2024 19:25:39 +0200 Subject: [PATCH] Gate: disallow in-place resize for guaranteed pods on nodes with a static topology policy New gate "InPlacePodVerticalScalingExclusiveCPUs" is off by default, but can be enabled to unblock development of Static CPU management alongside InPlacePodVerticalScaling. --- pkg/features/kube_features.go | 8 ++++++++ pkg/features/versioned_kube_features.go | 4 ++++ pkg/kubelet/kubelet.go | 15 +++++++++++++++ .../test_data/versioned_feature_list.yaml | 6 ++++++ 4 files changed, 33 insertions(+) diff --git a/pkg/features/kube_features.go b/pkg/features/kube_features.go index 4fbfdee171c..d95fa0b6e6f 100644 --- a/pkg/features/kube_features.go +++ b/pkg/features/kube_features.go @@ -270,6 +270,14 @@ const ( // InPlacePodVerticalScaling also be enabled. InPlacePodVerticalScalingAllocatedStatus featuregate.Feature = "InPlacePodVerticalScalingAllocatedStatus" + // owner: @tallclair @esotsal + // alpha: v1.32 + // + // Allow resource resize for containers in Guaranteed pods with integer CPU requests ( default false ). + // Applies only in nodes with InPlacePodVerticalScaling and CPU Manager features enabled, and + // CPU Manager Static Policy option set. + InPlacePodVerticalScalingExclusiveCPUs featuregate.Feature = "InPlacePodVerticalScalingExclusiveCPUs" + // owner: @trierra // // Disables the Portworx in-tree driver. diff --git a/pkg/features/versioned_kube_features.go b/pkg/features/versioned_kube_features.go index 2211528cac0..ffebcbe75c8 100644 --- a/pkg/features/versioned_kube_features.go +++ b/pkg/features/versioned_kube_features.go @@ -397,6 +397,10 @@ var defaultVersionedKubernetesFeatureGates = map[featuregate.Feature]featuregate {Version: version.MustParse("1.32"), Default: false, PreRelease: featuregate.Alpha}, }, + InPlacePodVerticalScalingExclusiveCPUs: { + {Version: version.MustParse("1.32"), Default: false, PreRelease: featuregate.Alpha}, + }, + InTreePluginPortworxUnregister: { {Version: version.MustParse("1.23"), Default: false, PreRelease: featuregate.Alpha}, }, diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index 94f2a9ded95..d4416fce401 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -2838,6 +2838,21 @@ func isPodResizeInProgress(pod *v1.Pod, podStatus *kubecontainer.PodStatus) bool // pod should hold the desired (pre-allocated) spec. // Returns true if the resize can proceed. func (kl *Kubelet) canResizePod(pod *v1.Pod) (bool, v1.PodResizeStatus) { + if v1qos.GetPodQOS(pod) == v1.PodQOSGuaranteed && !utilfeature.DefaultFeatureGate.Enabled(features.InPlacePodVerticalScalingExclusiveCPUs) { + if utilfeature.DefaultFeatureGate.Enabled(features.CPUManager) { + if kl.containerManager.GetNodeConfig().CPUManagerPolicy == "static" { + klog.V(3).InfoS("Resize is infeasible for Guaranteed Pods alongside CPU Manager static policy") + return false, v1.PodResizeStatusInfeasible + } + } + if utilfeature.DefaultFeatureGate.Enabled(features.MemoryManager) { + if kl.containerManager.GetNodeConfig().ExperimentalMemoryManagerPolicy == "static" { + klog.V(3).InfoS("Resize is infeasible for Guaranteed Pods alongside Memory Manager static policy") + return false, v1.PodResizeStatusInfeasible + } + } + } + node, err := kl.getNodeAnyWay() if err != nil { klog.ErrorS(err, "getNodeAnyway function failed") diff --git a/test/featuregates_linter/test_data/versioned_feature_list.yaml b/test/featuregates_linter/test_data/versioned_feature_list.yaml index f640e4b2280..6451f5e259c 100644 --- a/test/featuregates_linter/test_data/versioned_feature_list.yaml +++ b/test/featuregates_linter/test_data/versioned_feature_list.yaml @@ -522,6 +522,12 @@ lockToDefault: false preRelease: Alpha version: "1.32" +- name: InPlacePodVerticalScalingExclusiveCPUs + versionedSpecs: + - default: false + lockToDefault: false + preRelease: Alpha + version: "1.32" - name: InTreePluginPortworxUnregister versionedSpecs: - default: false