Skip to content

Commit

Permalink
Count pod overhead as an entity's resource usage
Browse files Browse the repository at this point in the history
  • Loading branch information
gjkim42 committed Mar 10, 2021
1 parent f2fe40c commit d341752
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 2 deletions.
3 changes: 3 additions & 0 deletions pkg/quota/v1/evaluator/core/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ go_test(
embed = [":go_default_library"],
deps = [
"//pkg/apis/core:go_default_library",
"//pkg/features:go_default_library",
"//pkg/util/node:go_default_library",
"//staging/src/k8s.io/api/core/v1:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
Expand All @@ -54,6 +55,8 @@ go_test(
"//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library",
"//staging/src/k8s.io/apiserver/pkg/quota/v1:go_default_library",
"//staging/src/k8s.io/apiserver/pkg/quota/v1/generic:go_default_library",
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
"//staging/src/k8s.io/component-base/featuregate/testing:go_default_library",
],
)

Expand Down
6 changes: 6 additions & 0 deletions pkg/quota/v1/evaluator/core/pods.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,12 @@ import (
"k8s.io/apiserver/pkg/admission"
quota "k8s.io/apiserver/pkg/quota/v1"
"k8s.io/apiserver/pkg/quota/v1/generic"
"k8s.io/apiserver/pkg/util/feature"
api "k8s.io/kubernetes/pkg/apis/core"
k8s_api_v1 "k8s.io/kubernetes/pkg/apis/core/v1"
"k8s.io/kubernetes/pkg/apis/core/v1/helper"
"k8s.io/kubernetes/pkg/apis/core/v1/helper/qos"
"k8s.io/kubernetes/pkg/features"
)

// the name used for object count quota
Expand Down Expand Up @@ -351,6 +353,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
}
Expand Down
67 changes: 65 additions & 2 deletions pkg/quota/v1/evaluator/core/pods_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,10 @@ import (
"k8s.io/apimachinery/pkg/util/clock"
quota "k8s.io/apiserver/pkg/quota/v1"
"k8s.io/apiserver/pkg/quota/v1/generic"
"k8s.io/apiserver/pkg/util/feature"
featuregatetesting "k8s.io/component-base/featuregate/testing"
api "k8s.io/kubernetes/pkg/apis/core"
"k8s.io/kubernetes/pkg/features"
"k8s.io/kubernetes/pkg/util/node"
)

Expand Down Expand Up @@ -90,8 +93,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{
Expand Down Expand Up @@ -433,9 +437,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)
Expand Down

0 comments on commit d341752

Please sign in to comment.