Skip to content

Commit b300fae

Browse files
authored
Merge pull request #1652 from ingvagabund/nodeutili-refactor
[nodeutilization]: produce node utilization of resources that are listed in the list of resources
2 parents 6ab73d6 + 04ebdbe commit b300fae

File tree

2 files changed

+27
-18
lines changed

2 files changed

+27
-18
lines changed

pkg/descheduler/node/node.go

+22-14
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ func IsNodeUnschedulable(node *v1.Node) bool {
214214
func fitsRequest(nodeIndexer podutil.GetPodsAssignedToNodeFunc, pod *v1.Pod, node *v1.Node) (bool, error) {
215215
// Get pod requests
216216
podRequests, _ := utils.PodRequestsAndLimits(pod)
217-
resourceNames := make([]v1.ResourceName, 0, len(podRequests))
217+
resourceNames := []v1.ResourceName{v1.ResourcePods}
218218
for name := range podRequests {
219219
resourceNames = append(resourceNames, name)
220220
}
@@ -237,7 +237,7 @@ func fitsRequest(nodeIndexer podutil.GetPodsAssignedToNodeFunc, pod *v1.Pod, nod
237237
}
238238
}
239239
// check pod num, at least one pod number is avaibalbe
240-
if availableResources[v1.ResourcePods].MilliValue() <= 0 {
240+
if quantity, ok := availableResources[v1.ResourcePods]; ok && quantity.MilliValue() <= 0 {
241241
return false, fmt.Errorf("insufficient %v", v1.ResourcePods)
242242
}
243243

@@ -254,13 +254,18 @@ func nodeAvailableResources(nodeIndexer podutil.GetPodsAssignedToNodeFunc, node
254254
if err != nil {
255255
return nil, err
256256
}
257-
remainingResources := api.ReferencedResourceList{
258-
v1.ResourceCPU: resource.NewMilliQuantity(node.Status.Allocatable.Cpu().MilliValue()-nodeUtilization[v1.ResourceCPU].MilliValue(), resource.DecimalSI),
259-
v1.ResourceMemory: resource.NewQuantity(node.Status.Allocatable.Memory().Value()-nodeUtilization[v1.ResourceMemory].Value(), resource.BinarySI),
260-
v1.ResourcePods: resource.NewQuantity(node.Status.Allocatable.Pods().Value()-nodeUtilization[v1.ResourcePods].Value(), resource.DecimalSI),
261-
}
257+
remainingResources := api.ReferencedResourceList{}
262258
for _, name := range resourceNames {
263-
if !IsBasicResource(name) {
259+
if IsBasicResource(name) {
260+
switch name {
261+
case v1.ResourceCPU:
262+
remainingResources[name] = resource.NewMilliQuantity(node.Status.Allocatable.Cpu().MilliValue()-nodeUtilization[v1.ResourceCPU].MilliValue(), resource.DecimalSI)
263+
case v1.ResourceMemory:
264+
remainingResources[name] = resource.NewQuantity(node.Status.Allocatable.Memory().Value()-nodeUtilization[v1.ResourceMemory].Value(), resource.BinarySI)
265+
case v1.ResourcePods:
266+
remainingResources[name] = resource.NewQuantity(node.Status.Allocatable.Pods().Value()-nodeUtilization[v1.ResourcePods].Value(), resource.DecimalSI)
267+
}
268+
} else {
264269
if _, exists := node.Status.Allocatable[name]; exists {
265270
allocatableResource := node.Status.Allocatable[name]
266271
remainingResources[name] = resource.NewQuantity(allocatableResource.Value()-nodeUtilization[name].Value(), resource.DecimalSI)
@@ -275,13 +280,16 @@ func nodeAvailableResources(nodeIndexer podutil.GetPodsAssignedToNodeFunc, node
275280

276281
// NodeUtilization returns the resources requested by the given pods. Only resources supplied in the resourceNames parameter are calculated.
277282
func NodeUtilization(pods []*v1.Pod, resourceNames []v1.ResourceName, podUtilization podutil.PodUtilizationFnc) (api.ReferencedResourceList, error) {
278-
totalUtilization := api.ReferencedResourceList{
279-
v1.ResourceCPU: resource.NewMilliQuantity(0, resource.DecimalSI),
280-
v1.ResourceMemory: resource.NewQuantity(0, resource.BinarySI),
281-
v1.ResourcePods: resource.NewQuantity(int64(len(pods)), resource.DecimalSI),
282-
}
283+
totalUtilization := api.ReferencedResourceList{}
283284
for _, name := range resourceNames {
284-
if !IsBasicResource(name) {
285+
switch name {
286+
case v1.ResourceCPU:
287+
totalUtilization[name] = resource.NewMilliQuantity(0, resource.DecimalSI)
288+
case v1.ResourceMemory:
289+
totalUtilization[name] = resource.NewQuantity(0, resource.BinarySI)
290+
case v1.ResourcePods:
291+
totalUtilization[name] = resource.NewQuantity(int64(len(pods)), resource.DecimalSI)
292+
default:
285293
totalUtilization[name] = resource.NewQuantity(0, resource.DecimalSI)
286294
}
287295
}

pkg/framework/plugins/nodeutilization/usageclients.go

+5-4
Original file line numberDiff line numberDiff line change
@@ -207,18 +207,19 @@ func (client *actualUsageClient) sync(ctx context.Context, nodes []*v1.Node) err
207207
return fmt.Errorf("error accessing %q node's pods: %v", node.Name, err)
208208
}
209209

210-
nodeUsage, ok := nodesUsage[node.Name]
210+
collectedNodeUsage, ok := nodesUsage[node.Name]
211211
if !ok {
212212
return fmt.Errorf("unable to find node %q in the collected metrics", node.Name)
213213
}
214-
nodeUsage[v1.ResourcePods] = resource.NewQuantity(int64(len(pods)), resource.DecimalSI)
214+
collectedNodeUsage[v1.ResourcePods] = resource.NewQuantity(int64(len(pods)), resource.DecimalSI)
215215

216+
nodeUsage := api.ReferencedResourceList{}
216217
for _, resourceName := range client.resourceNames {
217-
if _, exists := nodeUsage[resourceName]; !exists {
218+
if _, exists := collectedNodeUsage[resourceName]; !exists {
218219
return fmt.Errorf("unable to find %q resource for collected %q node metric", resourceName, node.Name)
219220
}
221+
nodeUsage[resourceName] = collectedNodeUsage[resourceName]
220222
}
221-
222223
// store the snapshot of pods from the same (or the closest) node utilization computation
223224
client._pods[node.Name] = pods
224225
client._nodeUtilization[node.Name] = nodeUsage

0 commit comments

Comments
 (0)