123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- /*
- Copyright 2015 The Kubernetes Authors.
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- */
- package qos
- import (
- corev1 "k8s.io/api/core/v1"
- "k8s.io/apimachinery/pkg/api/resource"
- "k8s.io/apimachinery/pkg/util/sets"
- )
- var supportedQoSComputeResources = sets.NewString(string(corev1.ResourceCPU), string(corev1.ResourceMemory))
- func isSupportedQoSComputeResource(name corev1.ResourceName) bool {
- return supportedQoSComputeResources.Has(string(name))
- }
- // GetPodQOS returns the QoS class of a pod.
- // A pod is besteffort if none of its containers have specified any requests or limits.
- // A pod is guaranteed only when requests and limits are specified for all the containers and they are equal.
- // A pod is burstable if limits and requests do not match across all containers.
- func GetPodQOS(pod *corev1.Pod) corev1.PodQOSClass {
- requests := corev1.ResourceList{}
- limits := corev1.ResourceList{}
- zeroQuantity := resource.MustParse("0")
- isGuaranteed := true
- for _, container := range pod.Spec.Containers {
- // process requests
- for name, quantity := range container.Resources.Requests {
- if !isSupportedQoSComputeResource(name) {
- continue
- }
- if quantity.Cmp(zeroQuantity) == 1 {
- delta := quantity.Copy()
- if _, exists := requests[name]; !exists {
- requests[name] = *delta
- } else {
- delta.Add(requests[name])
- requests[name] = *delta
- }
- }
- }
- // process limits
- qosLimitsFound := sets.NewString()
- for name, quantity := range container.Resources.Limits {
- if !isSupportedQoSComputeResource(name) {
- continue
- }
- if quantity.Cmp(zeroQuantity) == 1 {
- qosLimitsFound.Insert(string(name))
- delta := quantity.Copy()
- if _, exists := limits[name]; !exists {
- limits[name] = *delta
- } else {
- delta.Add(limits[name])
- limits[name] = *delta
- }
- }
- }
- if !qosLimitsFound.HasAll(string(corev1.ResourceMemory), string(corev1.ResourceCPU)) {
- isGuaranteed = false
- }
- }
- if len(requests) == 0 && len(limits) == 0 {
- return corev1.PodQOSBestEffort
- }
- // Check is requests match limits for all resources.
- if isGuaranteed {
- for name, req := range requests {
- if lim, exists := limits[name]; !exists || lim.Cmp(req) != 0 {
- isGuaranteed = false
- break
- }
- }
- }
- if isGuaranteed &&
- len(requests) == len(limits) {
- return corev1.PodQOSGuaranteed
- }
- return corev1.PodQOSBurstable
- }
|