From 14aef0c739a62ad0404633baab2fc1585367ae8e Mon Sep 17 00:00:00 2001 From: Vinay Kulkarni Date: Wed, 3 Nov 2021 15:43:43 -0700 Subject: [PATCH] In-place Pod Vertical Scaling - API changes 1. Define ContainerResizePolicy and add it to Container struct. 2. Add ResourcesAllocated and Resources fields to ContainerStatus struct. 3. Define ResourcesResizeStatus and add it to PodStatus struct. 4. Add InPlacePodVerticalScaling feature gate and drop disabled fields. 5. ResizePolicy validation & defaulting and Resources mutability for CPU/Memory. 6. Various fixes from code review feedback (originally committed on Apr 12, 2022) KEP: /enhancements/keps/sig-node/1287-in-place-update-pod-resources Kubernetes-commit: 76962b0fa7862727e93ef591f4b0822c8d80534b --- pkg/admission/plugin/resourcequota/controller.go | 11 ++++++++++- pkg/features/kube_features.go | 9 +++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/pkg/admission/plugin/resourcequota/controller.go b/pkg/admission/plugin/resourcequota/controller.go index be6e75fcd..75dcc5e3a 100644 --- a/pkg/admission/plugin/resourcequota/controller.go +++ b/pkg/admission/plugin/resourcequota/controller.go @@ -35,8 +35,10 @@ import ( "k8s.io/apimachinery/pkg/util/wait" "k8s.io/apiserver/pkg/admission" resourcequotaapi "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota" + "k8s.io/apiserver/pkg/features" quota "k8s.io/apiserver/pkg/quota/v1" "k8s.io/apiserver/pkg/quota/v1/generic" + "k8s.io/apiserver/pkg/util/feature" "k8s.io/client-go/util/workqueue" ) @@ -516,7 +518,14 @@ func CheckRequest(quotas []corev1.ResourceQuota, a admission.Attributes, evaluat if innerErr != nil { return quotas, innerErr } - deltaUsage = quota.SubtractWithNonNegativeResult(deltaUsage, prevUsage) + if feature.DefaultFeatureGate.Enabled(features.InPlacePodVerticalScaling) { + // allow negative usage for pods as pod resources can increase or decrease + if a.GetResource().GroupResource() == corev1.Resource("pods") { + deltaUsage = quota.Subtract(deltaUsage, prevUsage) + } + } else { + deltaUsage = quota.SubtractWithNonNegativeResult(deltaUsage, prevUsage) + } } } diff --git a/pkg/features/kube_features.go b/pkg/features/kube_features.go index a46827064..1e9868001 100644 --- a/pkg/features/kube_features.go +++ b/pkg/features/kube_features.go @@ -198,6 +198,13 @@ const ( // // Enables support for watch bookmark events. WatchBookmark featuregate.Feature = "WatchBookmark" + + // owner: @vinaykul + // kep: http://kep.k8s.io/1287 + // alpha: v1.27 + // + // Enables In-Place Pod Vertical Scaling + InPlacePodVerticalScaling featuregate.Feature = "InPlacePodVerticalScaling" ) func init() { @@ -249,4 +256,6 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS StorageVersionHash: {Default: true, PreRelease: featuregate.Beta}, WatchBookmark: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, + + InPlacePodVerticalScaling: {Default: false, PreRelease: featuregate.Alpha}, }