1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- /*
- Copyright 2017 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.
- */
- // NOTE: DO NOT use those helper functions through client-go, the
- // package path will be changed in the future.
- package qos
- import (
- "k8s.io/apimachinery/pkg/api/resource"
- "k8s.io/apimachinery/pkg/util/sets"
- "k8s.io/kubernetes/pkg/apis/core"
- )
- var supportedQoSComputeResources = sets.NewString(string(core.ResourceCPU), string(core.ResourceMemory))
- func isSupportedQoSComputeResource(name core.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 *core.Pod) core.PodQOSClass {
- requests := core.ResourceList{}
- limits := core.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(core.ResourceMemory), string(core.ResourceCPU)) {
- isGuaranteed = false
- }
- }
- if len(requests) == 0 && len(limits) == 0 {
- return core.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 core.PodQOSGuaranteed
- }
- return core.PodQOSBurstable
- }
|