Skip to content

Commit 99e88bd

Browse files
feat: refactoring thresholds and usage assessment
this commit refactors the thresholds and usage assessment for the node utilization plugins. both high and low plugins are affected by this change.
1 parent a4d6119 commit 99e88bd

File tree

7 files changed

+1115
-159
lines changed

7 files changed

+1115
-159
lines changed

go.mod

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ require (
3030
sigs.k8s.io/yaml v1.4.0
3131
)
3232

33+
require golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56
34+
3335
require (
3436
cel.dev/expr v0.18.0 // indirect
3537
github.com/BurntSushi/toml v0.3.1 // indirect
@@ -96,7 +98,6 @@ require (
9698
go.uber.org/multierr v1.11.0 // indirect
9799
go.uber.org/zap v1.27.0 // indirect
98100
golang.org/x/crypto v0.31.0 // indirect
99-
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
100101
golang.org/x/mod v0.21.0 // indirect
101102
golang.org/x/net v0.30.0 // indirect
102103
golang.org/x/oauth2 v0.23.0 // indirect

pkg/framework/plugins/nodeutilization/highnodeutilization.go

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
nodeutil "sigs.k8s.io/descheduler/pkg/descheduler/node"
2929

3030
podutil "sigs.k8s.io/descheduler/pkg/descheduler/pod"
31+
"sigs.k8s.io/descheduler/pkg/framework/plugins/nodeutilization/normalizer"
3132
frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types"
3233
)
3334

@@ -102,11 +103,17 @@ func (h *HighNodeUtilization) Balance(ctx context.Context, nodes []*v1.Node) *fr
102103
}
103104

104105
nodesMap, nodesUsageMap, podListMap := getNodeUsageSnapshot(nodes, h.usageClient)
105-
nodeThresholdsMap := getStaticNodeThresholds(nodes, h.args.Thresholds, h.targetThresholds)
106-
nodesUsageAsNodeThresholdsMap := nodeUsageToResourceThresholds(nodesUsageMap, nodesMap)
106+
107+
usage, thresholds := assessNodesUsagesAndStaticThresholds(
108+
nodesUsageMap,
109+
referencedResourceListForNodesCapacity(nodes),
110+
h.args.Thresholds,
111+
h.targetThresholds,
112+
)
113+
107114
nodeGroups := classifyNodeUsage(
108-
nodesUsageAsNodeThresholdsMap,
109-
nodeThresholdsMap,
115+
usage,
116+
thresholds,
110117
[]classifierFnc{
111118
// underutilized nodes
112119
func(nodeName string, usage, threshold api.ResourceThresholds) bool {
@@ -128,16 +135,21 @@ func (h *HighNodeUtilization) Balance(ctx context.Context, nodes []*v1.Node) *fr
128135
category := []string{"underutilized", "overutilized"}
129136
for i := range nodeGroups {
130137
for nodeName := range nodeGroups[i] {
131-
klog.InfoS("Node is "+category[i], "node", klog.KObj(nodesMap[nodeName]), "usage", nodesUsageMap[nodeName], "usagePercentage", resourceUsagePercentages(nodesUsageMap[nodeName], nodesMap[nodeName], true))
138+
klog.InfoS(
139+
fmt.Sprintf("Node is %s", category[i]),
140+
"node", klog.KObj(nodesMap[nodeName]),
141+
"usage", nodesUsageMap[nodeName],
142+
"usagePercentage", normalizer.Round(usage[nodeName]),
143+
)
132144
nodeInfos[i] = append(nodeInfos[i], NodeInfo{
133145
NodeUsage: NodeUsage{
134146
node: nodesMap[nodeName],
135147
usage: nodesUsageMap[nodeName], // get back the original node usage
136148
allPods: podListMap[nodeName],
137149
},
138150
thresholds: NodeThresholds{
139-
lowResourceThreshold: resourceThresholdsToNodeUsage(nodeThresholdsMap[nodeName][0], nodesMap[nodeName]),
140-
highResourceThreshold: resourceThresholdsToNodeUsage(nodeThresholdsMap[nodeName][1], nodesMap[nodeName]),
151+
lowResourceThreshold: resourceThresholdsToNodeUsage(thresholds[nodeName][0], nodesMap[nodeName]),
152+
highResourceThreshold: resourceThresholdsToNodeUsage(thresholds[nodeName][1], nodesMap[nodeName]),
141153
},
142154
})
143155
}

pkg/framework/plugins/nodeutilization/lownodeutilization.go

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
"sigs.k8s.io/descheduler/pkg/descheduler/evictions"
2929
nodeutil "sigs.k8s.io/descheduler/pkg/descheduler/node"
3030
podutil "sigs.k8s.io/descheduler/pkg/descheduler/pod"
31+
"sigs.k8s.io/descheduler/pkg/framework/plugins/nodeutilization/normalizer"
3132
frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types"
3233
)
3334

@@ -123,17 +124,28 @@ func (l *LowNodeUtilization) Balance(ctx context.Context, nodes []*v1.Node) *fra
123124
}
124125

125126
nodesMap, nodesUsageMap, podListMap := getNodeUsageSnapshot(nodes, l.usageClient)
126-
var nodeThresholdsMap map[string][]api.ResourceThresholds
127+
128+
var usage map[string]api.ResourceThresholds
129+
var thresholds map[string][]api.ResourceThresholds
127130
if l.args.UseDeviationThresholds {
128-
nodeThresholdsMap = getNodeThresholdsFromAverageNodeUsage(nodes, l.usageClient, l.args.Thresholds, l.args.TargetThresholds)
131+
usage, thresholds = assessNodesUsagesAndRelativeThresholds(
132+
nodesUsageMap,
133+
referencedResourceListForNodesCapacity(nodes),
134+
l.args.Thresholds,
135+
l.args.TargetThresholds,
136+
)
129137
} else {
130-
nodeThresholdsMap = getStaticNodeThresholds(nodes, l.args.Thresholds, l.args.TargetThresholds)
138+
usage, thresholds = assessNodesUsagesAndStaticThresholds(
139+
nodesUsageMap,
140+
referencedResourceListForNodesCapacity(nodes),
141+
l.args.Thresholds,
142+
l.args.TargetThresholds,
143+
)
131144
}
132-
nodesUsageAsNodeThresholdsMap := nodeUsageToResourceThresholds(nodesUsageMap, nodesMap)
133145

134146
nodeGroups := classifyNodeUsage(
135-
nodesUsageAsNodeThresholdsMap,
136-
nodeThresholdsMap,
147+
usage,
148+
thresholds,
137149
[]classifierFnc{
138150
// underutilization
139151
func(nodeName string, usage, threshold api.ResourceThresholds) bool {
@@ -156,7 +168,12 @@ func (l *LowNodeUtilization) Balance(ctx context.Context, nodes []*v1.Node) *fra
156168
listedNodes := map[string]struct{}{}
157169
for i := range nodeGroups {
158170
for nodeName := range nodeGroups[i] {
159-
klog.InfoS("Node is "+category[i], "node", klog.KObj(nodesMap[nodeName]), "usage", nodesUsageMap[nodeName], "usagePercentage", resourceUsagePercentages(nodesUsageMap[nodeName], nodesMap[nodeName], true))
171+
klog.InfoS(
172+
fmt.Sprintf("Node is %x", category[i]),
173+
"node", klog.KObj(nodesMap[nodeName]),
174+
"usage", nodesUsageMap[nodeName],
175+
"usagePercentage", normalizer.Round(usage[nodeName]),
176+
)
160177
listedNodes[nodeName] = struct{}{}
161178
nodeInfos[i] = append(nodeInfos[i], NodeInfo{
162179
NodeUsage: NodeUsage{
@@ -165,15 +182,20 @@ func (l *LowNodeUtilization) Balance(ctx context.Context, nodes []*v1.Node) *fra
165182
allPods: podListMap[nodeName],
166183
},
167184
thresholds: NodeThresholds{
168-
lowResourceThreshold: resourceThresholdsToNodeUsage(nodeThresholdsMap[nodeName][0], nodesMap[nodeName]),
169-
highResourceThreshold: resourceThresholdsToNodeUsage(nodeThresholdsMap[nodeName][1], nodesMap[nodeName]),
185+
lowResourceThreshold: resourceThresholdsToNodeUsage(thresholds[nodeName][0], nodesMap[nodeName]),
186+
highResourceThreshold: resourceThresholdsToNodeUsage(thresholds[nodeName][1], nodesMap[nodeName]),
170187
},
171188
})
172189
}
173190
}
174191
for nodeName := range nodesMap {
175192
if _, ok := listedNodes[nodeName]; !ok {
176-
klog.InfoS("Node is appropriately utilized", "node", klog.KObj(nodesMap[nodeName]), "usage", nodesUsageMap[nodeName], "usagePercentage", resourceUsagePercentages(nodesUsageMap[nodeName], nodesMap[nodeName], true))
193+
klog.InfoS(
194+
"Node is appropriately utilized",
195+
"node", klog.KObj(nodesMap[nodeName]),
196+
"usage", nodesUsageMap[nodeName],
197+
"usagePercentage", normalizer.Round(usage[nodeName]),
198+
)
177199
}
178200
}
179201

0 commit comments

Comments
 (0)