Skip to content

Commit 1f55c4d

Browse files
committed
node utilization: abstract pod utilization retriever
1 parent dc9bea3 commit 1f55c4d

File tree

3 files changed

+33
-11
lines changed

3 files changed

+33
-11
lines changed

pkg/descheduler/node/node.go

+21-10
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,12 @@ func fitsRequest(nodeIndexer podutil.GetPodsAssignedToNodeFunc, pod *v1.Pod, nod
218218
resourceNames = append(resourceNames, name)
219219
}
220220

221-
availableResources, err := nodeAvailableResources(nodeIndexer, node, resourceNames)
221+
availableResources, err := nodeAvailableResources(nodeIndexer, node, resourceNames,
222+
func(pod *v1.Pod) (v1.ResourceList, error) {
223+
req, _ := utils.PodRequestsAndLimits(pod)
224+
return req, nil
225+
},
226+
)
222227
if err != nil {
223228
return false, err
224229
}
@@ -239,12 +244,15 @@ func fitsRequest(nodeIndexer podutil.GetPodsAssignedToNodeFunc, pod *v1.Pod, nod
239244
}
240245

241246
// nodeAvailableResources returns resources mapped to the quanitity available on the node.
242-
func nodeAvailableResources(nodeIndexer podutil.GetPodsAssignedToNodeFunc, node *v1.Node, resourceNames []v1.ResourceName) (map[v1.ResourceName]*resource.Quantity, error) {
247+
func nodeAvailableResources(nodeIndexer podutil.GetPodsAssignedToNodeFunc, node *v1.Node, resourceNames []v1.ResourceName, podUtilization podutil.PodUtilizationFnc) (map[v1.ResourceName]*resource.Quantity, error) {
243248
podsOnNode, err := podutil.ListPodsOnANode(node.Name, nodeIndexer, nil)
244249
if err != nil {
245250
return nil, err
246251
}
247-
nodeUtilization := NodeUtilization(podsOnNode, resourceNames)
252+
nodeUtilization, err := NodeUtilization(podsOnNode, resourceNames, podUtilization)
253+
if err != nil {
254+
return nil, err
255+
}
248256
remainingResources := map[v1.ResourceName]*resource.Quantity{
249257
v1.ResourceCPU: resource.NewMilliQuantity(node.Status.Allocatable.Cpu().MilliValue()-nodeUtilization[v1.ResourceCPU].MilliValue(), resource.DecimalSI),
250258
v1.ResourceMemory: resource.NewQuantity(node.Status.Allocatable.Memory().Value()-nodeUtilization[v1.ResourceMemory].Value(), resource.BinarySI),
@@ -265,31 +273,34 @@ func nodeAvailableResources(nodeIndexer podutil.GetPodsAssignedToNodeFunc, node
265273
}
266274

267275
// NodeUtilization returns the resources requested by the given pods. Only resources supplied in the resourceNames parameter are calculated.
268-
func NodeUtilization(pods []*v1.Pod, resourceNames []v1.ResourceName) map[v1.ResourceName]*resource.Quantity {
269-
totalReqs := map[v1.ResourceName]*resource.Quantity{
276+
func NodeUtilization(pods []*v1.Pod, resourceNames []v1.ResourceName, podUtilization podutil.PodUtilizationFnc) (map[v1.ResourceName]*resource.Quantity, error) {
277+
totalUtilization := map[v1.ResourceName]*resource.Quantity{
270278
v1.ResourceCPU: resource.NewMilliQuantity(0, resource.DecimalSI),
271279
v1.ResourceMemory: resource.NewQuantity(0, resource.BinarySI),
272280
v1.ResourcePods: resource.NewQuantity(int64(len(pods)), resource.DecimalSI),
273281
}
274282
for _, name := range resourceNames {
275283
if !IsBasicResource(name) {
276-
totalReqs[name] = resource.NewQuantity(0, resource.DecimalSI)
284+
totalUtilization[name] = resource.NewQuantity(0, resource.DecimalSI)
277285
}
278286
}
279287

280288
for _, pod := range pods {
281-
req, _ := utils.PodRequestsAndLimits(pod)
289+
podUtil, err := podUtilization(pod)
290+
if err != nil {
291+
return nil, err
292+
}
282293
for _, name := range resourceNames {
283-
quantity, ok := req[name]
294+
quantity, ok := podUtil[name]
284295
if ok && name != v1.ResourcePods {
285296
// As Quantity.Add says: Add adds the provided y quantity to the current value. If the current value is zero,
286297
// the format of the quantity will be updated to the format of y.
287-
totalReqs[name].Add(quantity)
298+
totalUtilization[name].Add(quantity)
288299
}
289300
}
290301
}
291302

292-
return totalReqs
303+
return totalUtilization, nil
293304
}
294305

295306
// IsBasicResource checks if resource is basic native.

pkg/descheduler/pod/pods.go

+3
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ type FilterFunc func(*v1.Pod) bool
3939
// as input and returns the pods that assigned to the node.
4040
type GetPodsAssignedToNodeFunc func(string, FilterFunc) ([]*v1.Pod, error)
4141

42+
// PodUtilizationFnc is a function for getting pod's utilization. E.g. requested resources of utilization from metrics.
43+
type PodUtilizationFnc func(pod *v1.Pod) (v1.ResourceList, error)
44+
4245
// WrapFilterFuncs wraps a set of FilterFunc in one.
4346
func WrapFilterFuncs(filters ...FilterFunc) FilterFunc {
4447
return func(pod *v1.Pod) bool {

pkg/framework/plugins/nodeutilization/nodeutilization.go

+9-1
Original file line numberDiff line numberDiff line change
@@ -116,9 +116,17 @@ func (s *usageSnapshot) capture(nodes []*v1.Node) error {
116116
continue
117117
}
118118

119+
nodeUsage, err := nodeutil.NodeUtilization(pods, s.resourceNames, func(pod *v1.Pod) (v1.ResourceList, error) {
120+
req, _ := utils.PodRequestsAndLimits(pod)
121+
return req, nil
122+
})
123+
if err != nil {
124+
return err
125+
}
126+
119127
// store the snapshot of pods from the same (or the closest) node utilization computation
120128
s._pods[node.Name] = pods
121-
s._nodeUtilization[node.Name] = nodeutil.NodeUtilization(pods, s.resourceNames)
129+
s._nodeUtilization[node.Name] = nodeUsage
122130
}
123131

124132
return nil

0 commit comments

Comments
 (0)