add ScalarResources into cluster
Signed-off-by: Garrybest <garrybest@foxmail.com>
This commit is contained in:
parent
c2ae00aed6
commit
24ca29017e
|
@ -10,7 +10,6 @@ import (
|
|||
corev1 "k8s.io/api/core/v1"
|
||||
"k8s.io/apimachinery/pkg/api/equality"
|
||||
"k8s.io/apimachinery/pkg/api/errors"
|
||||
"k8s.io/apimachinery/pkg/api/resource"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||
"k8s.io/apimachinery/pkg/labels"
|
||||
|
@ -497,38 +496,24 @@ func getClusterAllocatable(nodeList []*corev1.Node) (allocatable corev1.Resource
|
|||
}
|
||||
|
||||
func getAllocatingResource(podList []*corev1.Pod) corev1.ResourceList {
|
||||
var requestCPU, requestMem int64
|
||||
allocating := util.EmptyResource()
|
||||
for _, pod := range podList {
|
||||
if len(pod.Spec.NodeName) == 0 {
|
||||
podRes := util.CalculateRequestResource(pod)
|
||||
requestCPU += podRes.MilliCPU
|
||||
requestMem += podRes.Memory
|
||||
allocating.AddPodRequest(pod)
|
||||
}
|
||||
}
|
||||
|
||||
allocating := corev1.ResourceList{
|
||||
corev1.ResourceCPU: *resource.NewMilliQuantity(requestCPU, resource.DecimalSI),
|
||||
corev1.ResourceMemory: *resource.NewQuantity(requestMem, resource.BinarySI),
|
||||
}
|
||||
|
||||
return allocating
|
||||
return allocating.ResourceList()
|
||||
}
|
||||
|
||||
func getAllocatedResource(podList []*corev1.Pod) corev1.ResourceList {
|
||||
var requestCPU, requestMem int64
|
||||
allocated := util.EmptyResource()
|
||||
for _, pod := range podList {
|
||||
// When the phase of a pod is Succeeded or Failed, kube-scheduler would not consider its resource occupation.
|
||||
if len(pod.Spec.NodeName) != 0 && pod.Status.Phase != corev1.PodSucceeded && pod.Status.Phase != corev1.PodFailed {
|
||||
podRes := util.CalculateRequestResource(pod)
|
||||
requestCPU += podRes.MilliCPU
|
||||
requestMem += podRes.Memory
|
||||
allocated.AddPodRequest(pod)
|
||||
}
|
||||
}
|
||||
|
||||
allocated := corev1.ResourceList{
|
||||
corev1.ResourceCPU: *resource.NewMilliQuantity(requestCPU, resource.DecimalSI),
|
||||
corev1.ResourceMemory: *resource.NewQuantity(requestMem, resource.BinarySI),
|
||||
}
|
||||
|
||||
return allocated
|
||||
return allocated.ResourceList()
|
||||
}
|
||||
|
|
|
@ -1,11 +1,19 @@
|
|||
package util
|
||||
|
||||
import corev1 "k8s.io/api/core/v1"
|
||||
import (
|
||||
corev1 "k8s.io/api/core/v1"
|
||||
"k8s.io/apimachinery/pkg/api/resource"
|
||||
v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper"
|
||||
schedutil "k8s.io/kubernetes/pkg/scheduler/util"
|
||||
)
|
||||
|
||||
// Resource is a collection of compute resource.
|
||||
type Resource struct {
|
||||
MilliCPU int64
|
||||
Memory int64
|
||||
|
||||
// ScalarResources
|
||||
ScalarResources map[corev1.ResourceName]int64
|
||||
}
|
||||
|
||||
// EmptyResource creates a empty resource object and returns.
|
||||
|
@ -26,7 +34,9 @@ func (r *Resource) Add(rl corev1.ResourceList) {
|
|||
case corev1.ResourceMemory:
|
||||
r.Memory += rQuant.Value()
|
||||
default:
|
||||
continue
|
||||
if schedutil.IsScalarResourceName(rName) {
|
||||
r.AddScalar(rName, rQuant.Value())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -48,32 +58,55 @@ func (r *Resource) SetMaxResource(rl corev1.ResourceList) {
|
|||
r.Memory = mem
|
||||
}
|
||||
default:
|
||||
continue
|
||||
if schedutil.IsScalarResourceName(rName) {
|
||||
if value := rQuant.Value(); value > r.ScalarResources[rName] {
|
||||
r.SetScalar(rName, value)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// CalculateRequestResourceWithoutInitContainers returns Pod's resource request, it does not contain
|
||||
// init containers' resource request.
|
||||
func CalculateRequestResourceWithoutInitContainers(pod *corev1.Pod) *Resource {
|
||||
result := EmptyResource()
|
||||
for _, container := range pod.Spec.Containers {
|
||||
result.Add(container.Resources.Requests)
|
||||
}
|
||||
// AddScalar adds a resource by a scalar value of this resource.
|
||||
func (r *Resource) AddScalar(name corev1.ResourceName, quantity int64) {
|
||||
r.SetScalar(name, r.ScalarResources[name]+quantity)
|
||||
}
|
||||
|
||||
// SetScalar sets a resource by a scalar value of this resource.
|
||||
func (r *Resource) SetScalar(name corev1.ResourceName, quantity int64) {
|
||||
// Lazily allocate scalar resource map.
|
||||
if r.ScalarResources == nil {
|
||||
r.ScalarResources = map[corev1.ResourceName]int64{}
|
||||
}
|
||||
r.ScalarResources[name] = quantity
|
||||
}
|
||||
|
||||
// ResourceList returns a resource list of this resource.
|
||||
func (r *Resource) ResourceList() corev1.ResourceList {
|
||||
result := corev1.ResourceList{
|
||||
corev1.ResourceCPU: *resource.NewMilliQuantity(r.MilliCPU, resource.DecimalSI),
|
||||
corev1.ResourceMemory: *resource.NewQuantity(r.Memory, resource.BinarySI),
|
||||
}
|
||||
for rName, rQuant := range r.ScalarResources {
|
||||
if v1helper.IsHugePageResourceName(rName) {
|
||||
result[rName] = *resource.NewQuantity(rQuant, resource.BinarySI)
|
||||
} else {
|
||||
result[rName] = *resource.NewQuantity(rQuant, resource.DecimalSI)
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// CalculateRequestResource calculates the resource required for pod, that is the higher of:
|
||||
// AddPodRequest add the effective request resource of a pod to the origin resource.
|
||||
// The Pod's effective request is the higher of:
|
||||
// - the sum of all app containers(spec.Containers) request for a resource.
|
||||
// - the effective init containers(spec.InitContainers) request for a resource.
|
||||
// The effective init containers request is the highest request on all init containers.
|
||||
func CalculateRequestResource(pod *corev1.Pod) *Resource {
|
||||
result := CalculateRequestResourceWithoutInitContainers(pod)
|
||||
|
||||
for _, container := range pod.Spec.InitContainers {
|
||||
result.SetMaxResource(container.Resources.Requests)
|
||||
func (r *Resource) AddPodRequest(pod *corev1.Pod) {
|
||||
for _, container := range pod.Spec.Containers {
|
||||
r.Add(container.Resources.Requests)
|
||||
}
|
||||
for _, container := range pod.Spec.InitContainers {
|
||||
r.SetMaxResource(container.Resources.Requests)
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue