Merge pull request #1225 from Garrybest/pr_resource

fix bug of resource computing
This commit is contained in:
karmada-bot 2022-01-11 08:59:53 +08:00 committed by GitHub
commit 596f214659
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 41 additions and 1 deletions

View File

@ -263,7 +263,7 @@ func GenerateNodeClaimByPodSpec(podSpec *corev1.PodSpec) *workv1alpha2.NodeClaim
// GenerateReplicaRequirements generates replica requirements for node and resources.
func GenerateReplicaRequirements(podTemplate *corev1.PodTemplateSpec) *workv1alpha2.ReplicaRequirements {
nodeClaim := GenerateNodeClaimByPodSpec(&podTemplate.Spec)
resourceRequest := util.EmptyResource().AddPodRequest(&podTemplate.Spec).ResourceList()
resourceRequest := util.EmptyResource().AddPodTemplateRequest(&podTemplate.Spec).ResourceList()
if nodeClaim != nil || resourceRequest != nil {
return &workv1alpha2.ReplicaRequirements{

View File

@ -253,6 +253,41 @@ func (r *Resource) LessEqual(rr *Resource) bool {
return true
}
// AddPodTemplateRequest add the effective request resource of a pod template to the origin resource.
// If pod container limits are specified, but requests are not, default requests to limits.
// The code logic is almost the same as kubernetes.
// https://github.com/kubernetes/kubernetes/blob/f7cdbe2c96cc12101226686df9e9819b4b007c5c/pkg/apis/core/v1/defaults.go#L147-L181
func (r *Resource) AddPodTemplateRequest(podSpec *corev1.PodSpec) *Resource {
// DeepCopy first because we may modify the Resources.Requests field.
podSpec = podSpec.DeepCopy()
for i := range podSpec.Containers {
// set requests to limits if requests are not specified, but limits are
if podSpec.Containers[i].Resources.Limits != nil {
if podSpec.Containers[i].Resources.Requests == nil {
podSpec.Containers[i].Resources.Requests = make(corev1.ResourceList)
}
for key, value := range podSpec.Containers[i].Resources.Limits {
if _, exists := podSpec.Containers[i].Resources.Requests[key]; !exists {
podSpec.Containers[i].Resources.Requests[key] = value.DeepCopy()
}
}
}
}
for i := range podSpec.InitContainers {
if podSpec.InitContainers[i].Resources.Limits != nil {
if podSpec.InitContainers[i].Resources.Requests == nil {
podSpec.InitContainers[i].Resources.Requests = make(corev1.ResourceList)
}
for key, value := range podSpec.InitContainers[i].Resources.Limits {
if _, exists := podSpec.InitContainers[i].Resources.Requests[key]; !exists {
podSpec.InitContainers[i].Resources.Requests[key] = value.DeepCopy()
}
}
}
}
return r.AddPodRequest(podSpec)
}
// 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.
@ -265,6 +300,11 @@ func (r *Resource) AddPodRequest(podSpec *corev1.PodSpec) *Resource {
for _, container := range podSpec.InitContainers {
r.SetMaxResource(container.Resources.Requests)
}
// If Overhead is being utilized, add to the total requests for the pod.
// We assume the EnablePodOverhead feature gate of member cluster is set (it is on by default since 1.18).
if podSpec.Overhead != nil {
r.Add(podSpec.Overhead)
}
return r
}