diff --git a/go.mod b/go.mod index a864b32b8..7df6621f2 100644 --- a/go.mod +++ b/go.mod @@ -42,12 +42,12 @@ require ( google.golang.org/protobuf v1.28.1 gopkg.in/natefinch/lumberjack.v2 v2.0.0 gopkg.in/square/go-jose.v2 v2.2.2 - k8s.io/api v0.0.0-20230224170233-ec40acc5b8d7 - k8s.io/apimachinery v0.0.0-20230223090012-28259f54ab7d - k8s.io/client-go v0.0.0-20230225010603-b46677097d03 + k8s.io/api v0.0.0-20230228090259-b5b22ca1babf + k8s.io/apimachinery v0.0.0-20230227225516-80f59387d3d1 + k8s.io/client-go v0.0.0-20230228090623-8f4ee7119f1d k8s.io/component-base v0.0.0-20230215215219-ae9be4dda9da k8s.io/klog/v2 v2.80.1 - k8s.io/kms v0.0.0-20230227050942-c7df77c16432 + k8s.io/kms v0.0.0-20230228010948-9674935696a9 k8s.io/kube-openapi v0.0.0-20230123231816-1cb3ae25d79a k8s.io/utils v0.0.0-20230209194617-a36077c30491 sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.1.1 @@ -124,9 +124,9 @@ require ( ) replace ( - k8s.io/api => k8s.io/api v0.0.0-20230224170233-ec40acc5b8d7 - k8s.io/apimachinery => k8s.io/apimachinery v0.0.0-20230223090012-28259f54ab7d - k8s.io/client-go => k8s.io/client-go v0.0.0-20230225010603-b46677097d03 + k8s.io/api => k8s.io/api v0.0.0-20230228090259-b5b22ca1babf + k8s.io/apimachinery => k8s.io/apimachinery v0.0.0-20230227225516-80f59387d3d1 + k8s.io/client-go => k8s.io/client-go v0.0.0-20230228090623-8f4ee7119f1d k8s.io/component-base => k8s.io/component-base v0.0.0-20230215215219-ae9be4dda9da - k8s.io/kms => k8s.io/kms v0.0.0-20230227050942-c7df77c16432 + k8s.io/kms => k8s.io/kms v0.0.0-20230228010948-9674935696a9 ) diff --git a/go.sum b/go.sum index 98c941b04..7f40f86db 100644 --- a/go.sum +++ b/go.sum @@ -995,18 +995,18 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.0.0-20230224170233-ec40acc5b8d7 h1:QRn9B/c3nFBOr/y1ZvkxSj+8csklqfM0eKhJhQ7ujCo= -k8s.io/api v0.0.0-20230224170233-ec40acc5b8d7/go.mod h1:ZgBZcyAg9mrSMLoN3CT3jXA80Nglj1iAeLPjz64hQZ8= -k8s.io/apimachinery v0.0.0-20230223090012-28259f54ab7d h1:/diE2y6H2T5l0s265p3l0Dfi4S9vAH3mx0azm51dyEM= -k8s.io/apimachinery v0.0.0-20230223090012-28259f54ab7d/go.mod h1:8B/+OdWlScxVvirboh1J5IZSHQrCreQ7fi/5UQntvX0= -k8s.io/client-go v0.0.0-20230225010603-b46677097d03 h1:1e2qRaOenUEC2vO9pIlzDizWrrX/da6cmYwzjOlEB2w= -k8s.io/client-go v0.0.0-20230225010603-b46677097d03/go.mod h1:HRsm6qmqZE2rC0JWXUXAp5Z4usMnZMEcUdRZAYP5ghQ= +k8s.io/api v0.0.0-20230228090259-b5b22ca1babf h1:nOM4wjFnU0nlgQ5xSvS24ayMbBOFw1N/jyEj4ni0ugA= +k8s.io/api v0.0.0-20230228090259-b5b22ca1babf/go.mod h1:XAyCRdxxjlGJLzvSsIhA8Ccnsryd6Xh0CgmB3ah3AmQ= +k8s.io/apimachinery v0.0.0-20230227225516-80f59387d3d1 h1:Any9/HFr7VOfgDnp+b98WhCql/Tup2fuQD4QYMMSt60= +k8s.io/apimachinery v0.0.0-20230227225516-80f59387d3d1/go.mod h1:8B/+OdWlScxVvirboh1J5IZSHQrCreQ7fi/5UQntvX0= +k8s.io/client-go v0.0.0-20230228090623-8f4ee7119f1d h1:AJ80TdJqiuvAWNAL4OnY8tD6Vpx1i4QRGLlLAZWjJ9w= +k8s.io/client-go v0.0.0-20230228090623-8f4ee7119f1d/go.mod h1:WELbQXwndVIDiY4HhgmXdqz1/YjP6sjiGSaMCDvXGEI= k8s.io/component-base v0.0.0-20230215215219-ae9be4dda9da h1:tgXu2y67YqUXP4txgy1vMTvOOqpT/kzIxmrtE0SvR8M= k8s.io/component-base v0.0.0-20230215215219-ae9be4dda9da/go.mod h1:GgrhCRrPLmN9lWoh+m52a6iHKG3zx8KJyclgqPgbFDQ= k8s.io/klog/v2 v2.80.1 h1:atnLQ121W371wYYFawwYx1aEY2eUfs4l3J72wtgAwV4= k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kms v0.0.0-20230227050942-c7df77c16432 h1:Pf2mrrdm8KKvSWuR0DW8bAV1OV/gWoNG9mk5/iqM1gQ= -k8s.io/kms v0.0.0-20230227050942-c7df77c16432/go.mod h1:95vU4VQJ4pv6xPzVy3RNBKX1O3wZzAh/w0333JsN9yI= +k8s.io/kms v0.0.0-20230228010948-9674935696a9 h1:DS2YWJWTqYfW0CKFs8I4JNJmgNazmK1YkswIVXjEB0Y= +k8s.io/kms v0.0.0-20230228010948-9674935696a9/go.mod h1:Tovm+0xkxOXzcRMnxTAcOeGkR6kcjfHsz0aB+ET/xuw= k8s.io/kube-openapi v0.0.0-20230123231816-1cb3ae25d79a h1:s6zvHjyDQX1NtVT88pvw2tddqhqY0Bz0Gbnn+yctsFU= k8s.io/kube-openapi v0.0.0-20230123231816-1cb3ae25d79a/go.mod h1:/BYxry62FuDzmI+i9B+X2pqfySRmSOW2ARmj5Zbqhj0= k8s.io/utils v0.0.0-20230209194617-a36077c30491 h1:r0BAOLElQnnFhE/ApUsg3iHdVYYPBjNSSOMowRZxxsY= 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}, }