From bcfa60d955e0b283028dca15cbf58416b294c227 Mon Sep 17 00:00:00 2001 From: Seth Jennings Date: Fri, 17 May 2019 09:58:56 -0500 Subject: [PATCH] kubelet: include init containers when determining pod QoS --- pkg/apis/core/helper/qos/qos.go | 5 ++++- pkg/apis/core/v1/helper/qos/qos.go | 7 +++++-- pkg/apis/core/v1/helper/qos/qos_test.go | 24 +++++++++++++++++++++++- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/pkg/apis/core/helper/qos/qos.go b/pkg/apis/core/helper/qos/qos.go index fad6fb24074..6f14ae0cd7b 100644 --- a/pkg/apis/core/helper/qos/qos.go +++ b/pkg/apis/core/helper/qos/qos.go @@ -39,7 +39,10 @@ func GetPodQOS(pod *core.Pod) core.PodQOSClass { limits := core.ResourceList{} zeroQuantity := resource.MustParse("0") isGuaranteed := true - for _, container := range pod.Spec.Containers { + allContainers := []core.Container{} + allContainers = append(allContainers, pod.Spec.Containers...) + allContainers = append(allContainers, pod.Spec.InitContainers...) + for _, container := range allContainers { // process requests for name, quantity := range container.Resources.Requests { if !isSupportedQoSComputeResource(name) { diff --git a/pkg/apis/core/v1/helper/qos/qos.go b/pkg/apis/core/v1/helper/qos/qos.go index 426f054efa6..22346e7d3bd 100644 --- a/pkg/apis/core/v1/helper/qos/qos.go +++ b/pkg/apis/core/v1/helper/qos/qos.go @@ -17,7 +17,7 @@ limitations under the License. package qos import ( - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/kubernetes/pkg/apis/core" @@ -41,7 +41,10 @@ func GetPodQOS(pod *v1.Pod) v1.PodQOSClass { limits := v1.ResourceList{} zeroQuantity := resource.MustParse("0") isGuaranteed := true - for _, container := range pod.Spec.Containers { + allContainers := []v1.Container{} + allContainers = append(allContainers, pod.Spec.Containers...) + allContainers = append(allContainers, pod.Spec.InitContainers...) + for _, container := range allContainers { // process requests for name, quantity := range container.Resources.Requests { if !isSupportedQoSComputeResource(name) { diff --git a/pkg/apis/core/v1/helper/qos/qos_test.go b/pkg/apis/core/v1/helper/qos/qos_test.go index 7e9b71fef90..6dd45f61438 100644 --- a/pkg/apis/core/v1/helper/qos/qos_test.go +++ b/pkg/apis/core/v1/helper/qos/qos_test.go @@ -19,7 +19,7 @@ package qos import ( "testing" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/kubernetes/pkg/apis/core" @@ -116,6 +116,16 @@ func TestGetPodQOS(t *testing.T) { }), expected: v1.PodQOSBestEffort, }, + { + pod: newPodWithInitContainers("init-container", + []v1.Container{ + newContainer("best-effort", getResourceList("", ""), getResourceList("", "")), + }, + []v1.Container{ + newContainer("burstable", getResourceList("10m", "100Mi"), getResourceList("100m", "200Mi")), + }), + expected: v1.PodQOSBurstable, + }, } for id, testCase := range testCases { if actual := GetPodQOS(testCase.pod); testCase.expected != actual { @@ -172,3 +182,15 @@ func newPod(name string, containers []v1.Container) *v1.Pod { }, } } + +func newPodWithInitContainers(name string, containers []v1.Container, initContainers []v1.Container) *v1.Pod { + return &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + Spec: v1.PodSpec{ + Containers: containers, + InitContainers: initContainers, + }, + } +}