From df48ee49d895908725825cb55695bf9ddfee9839 Mon Sep 17 00:00:00 2001 From: Geon-Ju Kim Date: Sat, 6 Mar 2021 07:58:56 +0900 Subject: [PATCH] Count pod overhead as an entity's resource usage --- pkg/quota/v1/evaluator/core/pods.go | 4 ++ pkg/quota/v1/evaluator/core/pods_test.go | 64 +++++++++++++++++++++++- 2 files changed, 66 insertions(+), 2 deletions(-) diff --git a/pkg/quota/v1/evaluator/core/pods.go b/pkg/quota/v1/evaluator/core/pods.go index ed44323e27e..6051d24eb85 100644 --- a/pkg/quota/v1/evaluator/core/pods.go +++ b/pkg/quota/v1/evaluator/core/pods.go @@ -354,6 +354,10 @@ func PodUsageFunc(obj runtime.Object, clock clock.Clock) (corev1.ResourceList, e limits = quota.Max(limits, pod.Spec.InitContainers[i].Resources.Limits) } + if feature.DefaultFeatureGate.Enabled(features.PodOverhead) { + requests = quota.Add(requests, pod.Spec.Overhead) + limits = quota.Add(limits, pod.Spec.Overhead) + } result = quota.Add(result, podComputeUsageHelper(requests, limits)) return result, nil } diff --git a/pkg/quota/v1/evaluator/core/pods_test.go b/pkg/quota/v1/evaluator/core/pods_test.go index cd41719ed50..556b7b349f6 100644 --- a/pkg/quota/v1/evaluator/core/pods_test.go +++ b/pkg/quota/v1/evaluator/core/pods_test.go @@ -95,8 +95,9 @@ func TestPodEvaluatorUsage(t *testing.T) { deletionTimestampNotPastGracePeriod := metav1.NewTime(fakeClock.Now()) testCases := map[string]struct { - pod *api.Pod - usage corev1.ResourceList + pod *api.Pod + usage corev1.ResourceList + podOverheadEnabled bool }{ "init container CPU": { pod: &api.Pod{ @@ -438,9 +439,68 @@ func TestPodEvaluatorUsage(t *testing.T) { generic.ObjectCountQuotaResourceNameFor(schema.GroupResource{Resource: "pods"}): resource.MustParse("1"), }, }, + "count pod overhead as usage": { + pod: &api.Pod{ + Spec: api.PodSpec{ + Overhead: api.ResourceList{ + api.ResourceCPU: resource.MustParse("1"), + }, + Containers: []api.Container{ + { + Resources: api.ResourceRequirements{ + Requests: api.ResourceList{ + api.ResourceCPU: resource.MustParse("1"), + }, + Limits: api.ResourceList{ + api.ResourceCPU: resource.MustParse("2"), + }, + }, + }, + }, + }, + }, + usage: corev1.ResourceList{ + corev1.ResourceRequestsCPU: resource.MustParse("2"), + corev1.ResourceLimitsCPU: resource.MustParse("3"), + corev1.ResourcePods: resource.MustParse("1"), + corev1.ResourceCPU: resource.MustParse("2"), + generic.ObjectCountQuotaResourceNameFor(schema.GroupResource{Resource: "pods"}): resource.MustParse("1"), + }, + podOverheadEnabled: true, + }, + "do not count pod overhead as usage with pod overhead disabled": { + pod: &api.Pod{ + Spec: api.PodSpec{ + Overhead: api.ResourceList{ + api.ResourceCPU: resource.MustParse("1"), + }, + Containers: []api.Container{ + { + Resources: api.ResourceRequirements{ + Requests: api.ResourceList{ + api.ResourceCPU: resource.MustParse("1"), + }, + Limits: api.ResourceList{ + api.ResourceCPU: resource.MustParse("2"), + }, + }, + }, + }, + }, + }, + usage: corev1.ResourceList{ + corev1.ResourceRequestsCPU: resource.MustParse("1"), + corev1.ResourceLimitsCPU: resource.MustParse("2"), + corev1.ResourcePods: resource.MustParse("1"), + corev1.ResourceCPU: resource.MustParse("1"), + generic.ObjectCountQuotaResourceNameFor(schema.GroupResource{Resource: "pods"}): resource.MustParse("1"), + }, + podOverheadEnabled: false, + }, } for testName, testCase := range testCases { t.Run(testName, func(t *testing.T) { + defer featuregatetesting.SetFeatureGateDuringTest(t, feature.DefaultFeatureGate, features.PodOverhead, testCase.podOverheadEnabled)() actual, err := evaluator.Usage(testCase.pod) if err != nil { t.Error(err)