...
1
16
17
18
19 package qos
20
21 import (
22 "k8s.io/apimachinery/pkg/api/resource"
23 "k8s.io/apimachinery/pkg/util/sets"
24 "k8s.io/kubernetes/pkg/apis/core"
25 )
26
27 var supportedQoSComputeResources = sets.NewString(string(core.ResourceCPU), string(core.ResourceMemory))
28
29 func isSupportedQoSComputeResource(name core.ResourceName) bool {
30 return supportedQoSComputeResources.Has(string(name))
31 }
32
33
34
35 func GetPodQOS(pod *core.Pod) core.PodQOSClass {
36 if pod.Status.QOSClass != "" {
37 return pod.Status.QOSClass
38 }
39 return ComputePodQOS(pod)
40 }
41
42
43
44
45
46
47
48 func ComputePodQOS(pod *core.Pod) core.PodQOSClass {
49 requests := core.ResourceList{}
50 limits := core.ResourceList{}
51 zeroQuantity := resource.MustParse("0")
52 isGuaranteed := true
53
54 allContainers := []core.Container{}
55 allContainers = append(allContainers, pod.Spec.Containers...)
56 allContainers = append(allContainers, pod.Spec.InitContainers...)
57 for _, container := range allContainers {
58
59 for name, quantity := range container.Resources.Requests {
60 if !isSupportedQoSComputeResource(name) {
61 continue
62 }
63 if quantity.Cmp(zeroQuantity) == 1 {
64 delta := quantity.DeepCopy()
65 if _, exists := requests[name]; !exists {
66 requests[name] = delta
67 } else {
68 delta.Add(requests[name])
69 requests[name] = delta
70 }
71 }
72 }
73
74 qosLimitsFound := sets.NewString()
75 for name, quantity := range container.Resources.Limits {
76 if !isSupportedQoSComputeResource(name) {
77 continue
78 }
79 if quantity.Cmp(zeroQuantity) == 1 {
80 qosLimitsFound.Insert(string(name))
81 delta := quantity.DeepCopy()
82 if _, exists := limits[name]; !exists {
83 limits[name] = delta
84 } else {
85 delta.Add(limits[name])
86 limits[name] = delta
87 }
88 }
89 }
90
91 if !qosLimitsFound.HasAll(string(core.ResourceMemory), string(core.ResourceCPU)) {
92 isGuaranteed = false
93 }
94 }
95 if len(requests) == 0 && len(limits) == 0 {
96 return core.PodQOSBestEffort
97 }
98
99 if isGuaranteed {
100 for name, req := range requests {
101 if lim, exists := limits[name]; !exists || lim.Cmp(req) != 0 {
102 isGuaranteed = false
103 break
104 }
105 }
106 }
107 if isGuaranteed &&
108 len(requests) == len(limits) {
109 return core.PodQOSGuaranteed
110 }
111 return core.PodQOSBurstable
112 }
113
View as plain text