From 13d6dcf16a4b03a9b12bf18df6f5d116557ac8b8 Mon Sep 17 00:00:00 2001 From: Fansong Zeng Date: Sun, 7 Apr 2024 19:18:35 +0800 Subject: [PATCH] slo-controller: refactor codes for reading (#1973) Signed-off-by: Fansong Zeng Signed-off-by: george --- docs/images/node-resource-model.png | Bin 0 -> 224029 bytes .../plugins/batchresource/plugin.go | 25 +++- .../plugins/batchresource/plugin_test.go | 112 +++++++++--------- .../plugins/batchresource/util.go | 44 +++---- .../plugins/batchresource/util_test.go | 2 +- .../noderesource/resource_calculator_test.go | 31 +++-- 6 files changed, 119 insertions(+), 95 deletions(-) create mode 100644 docs/images/node-resource-model.png diff --git a/docs/images/node-resource-model.png b/docs/images/node-resource-model.png new file mode 100644 index 0000000000000000000000000000000000000000..8b7dcb56dda43529defc694a07baa17b48815af4 GIT binary patch literal 224029 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%0DY1h)E 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 literal 0 HcmV?d00001 diff --git a/pkg/slo-controller/noderesource/plugins/batchresource/plugin.go b/pkg/slo-controller/noderesource/plugins/batchresource/plugin.go index 68db3167a..9f68b86e0 100644 --- a/pkg/slo-controller/noderesource/plugins/batchresource/plugin.go +++ b/pkg/slo-controller/noderesource/plugins/batchresource/plugin.go @@ -211,6 +211,18 @@ func (p *Plugin) calculate(strategy *configuration.ColocationStrategy, node *cor }, nil } +// In order to support the colocation requirements of different enterprise environments, a configurable colocation strategy is provided. +// The resource view from the node perspective is as follows: +// +// https://github.com/koordinator-sh/koordinator/blob/main/docs/images/node-resource-model.png +// +// Typical colocation scenario: +// 1. default policy, and the CPU and memory that can be collocated are automatically calculated based on the load level of the node. +// 2. default policy on CPU, and the Memory is configured not to be overcommitted. This can reduce the probability of batch pods +// being killed due to high memory water levels (reduce the kill rate) +// +// In each scenario, users can also adjust the resource water level configuration according to your own needs and control the deployment +// density of batch pods. func (p *Plugin) calculateOnNode(strategy *configuration.ColocationStrategy, node *corev1.Node, podList *corev1.PodList, resourceMetrics *framework.ResourceMetrics) (corev1.ResourceList, string, string) { // compute the requests and usages according to the pods' priority classes. @@ -293,7 +305,7 @@ func (p *Plugin) calculateOnNode(strategy *configuration.ColocationStrategy, nod "cpu", podsDanglingUsed.Cpu().String(), "memory", podsDanglingUsed.Memory().String()) nodeCapacity := getNodeCapacity(node) - nodeReservation := getNodeReservation(strategy, nodeCapacity) + nodeSafetyMargin := getNodeSafetyMargin(strategy, nodeCapacity) systemUsed := getResourceListForCPUAndMemory(nodeMetric.Status.NodeMetric.SystemUsage.ResourceList) // resource usage of host applications with prod priority will be count as host system usage since they consumes the @@ -303,9 +315,10 @@ func (p *Plugin) calculateOnNode(strategy *configuration.ColocationStrategy, nod // System.Reserved = Node.Anno.Reserved, Node.Kubelet.Reserved) nodeAnnoReserved := util.GetNodeReservationFromAnnotation(node.Annotations) nodeKubeletReserved := util.GetNodeReservationFromKubelet(node) - systemReserved := quotav1.Max(nodeKubeletReserved, nodeAnnoReserved) + // FIXME: resource reservation taking max is rather confusing. + nodeReserved := quotav1.Max(nodeKubeletReserved, nodeAnnoReserved) - batchAllocatable, cpuMsg, memMsg := calculateBatchResourceByPolicy(strategy, nodeCapacity, nodeReservation, systemReserved, + batchAllocatable, cpuMsg, memMsg := calculateBatchResourceByPolicy(strategy, nodeCapacity, nodeSafetyMargin, nodeReserved, systemUsed, podsHPRequest, podsHPUsed, podsHPMaxUsedReq) metrics.RecordNodeExtendedResourceAllocatableInternal(node, string(extension.BatchCPU), metrics.UnitInteger, float64(batchAllocatable.Cpu().MilliValue())/1000) metrics.RecordNodeExtendedResourceAllocatableInternal(node, string(extension.BatchMemory), metrics.UnitByte, float64(batchAllocatable.Memory().Value())) @@ -366,7 +379,7 @@ func (p *Plugin) calculateOnNUMALevel(strategy *configuration.ColocationStrategy systemUsed = quotav1.Add(systemUsed, hostAppHPUsed) nodeAnnoReserved := util.GetNodeReservationFromAnnotation(node.Annotations) nodeKubeletReserved := util.GetNodeReservationFromKubelet(node) - systemReserved := quotav1.Max(nodeKubeletReserved, nodeAnnoReserved) + nodeReserved := quotav1.Max(nodeKubeletReserved, nodeAnnoReserved) for i, zone := range nrt.Zones { zoneIdxMap[i] = zone.Name @@ -380,9 +393,9 @@ func (p *Plugin) calculateOnNUMALevel(strategy *configuration.ColocationStrategy nodeZoneAllocatable[i][corev1.ResourceName(resourceInfo.Name)] = resourceInfo.Allocatable.DeepCopy() } } - nodeZoneReserve[i] = getNodeReservation(strategy, nodeZoneAllocatable[i]) + nodeZoneReserve[i] = getNodeSafetyMargin(strategy, nodeZoneAllocatable[i]) systemZoneUsed[i] = divideResourceList(systemUsed, float64(zoneNum)) - systemZoneReserved[i] = divideResourceList(systemReserved, float64(zoneNum)) + systemZoneReserved[i] = divideResourceList(nodeReserved, float64(zoneNum)) } podMetricMap := make(map[string]*slov1alpha1.PodMetricInfo) podMetricUnknownMap := make(map[string]*slov1alpha1.PodMetricInfo) diff --git a/pkg/slo-controller/noderesource/plugins/batchresource/plugin_test.go b/pkg/slo-controller/noderesource/plugins/batchresource/plugin_test.go index c4782e74c..6746b6826 100644 --- a/pkg/slo-controller/noderesource/plugins/batchresource/plugin_test.go +++ b/pkg/slo-controller/noderesource/plugins/batchresource/plugin_test.go @@ -1694,12 +1694,12 @@ func TestPluginCalculate(t *testing.T) { { Name: extension.BatchCPU, Quantity: resource.NewQuantity(25000, resource.DecimalSI), - Message: "batchAllocatable[CPU(Milli-Core)]:25000 = nodeCapacity:100000 - nodeReservation:35000 - systemUsageOrReserved:7000 - podHPUsed:33000", + Message: "batchAllocatable[CPU(Milli-Core)]:25000 = nodeCapacity:100000 - nodeSafetyMargin:35000 - systemUsageOrNodeReserved:7000 - podHPUsed:33000", }, { Name: extension.BatchMemory, Quantity: resource.NewScaledQuantity(33, 9), - Message: "batchAllocatable[Mem(GB)]:33 = nodeCapacity:120 - nodeReservation:42 - systemUsage:12 - podHPUsed:33", + Message: "batchAllocatable[Mem(GB)]:33 = nodeCapacity:120 - nodeSafetyMargin:42 - systemUsage:12 - podHPUsed:33", }, }, wantErr: false, @@ -1729,12 +1729,12 @@ func TestPluginCalculate(t *testing.T) { { Name: extension.BatchCPU, Quantity: resource.NewQuantity(25000, resource.DecimalSI), - Message: "batchAllocatable[CPU(Milli-Core)]:25000 = nodeCapacity:100000 - nodeReservation:35000 - systemUsageOrReserved:7000 - podHPUsed:33000", + Message: "batchAllocatable[CPU(Milli-Core)]:25000 = nodeCapacity:100000 - nodeSafetyMargin:35000 - systemUsageOrNodeReserved:7000 - podHPUsed:33000", }, { Name: extension.BatchMemory, Quantity: resource.NewScaledQuantity(33, 9), - Message: "batchAllocatable[Mem(GB)]:33 = nodeCapacity:120 - nodeReservation:42 - systemUsage:12 - podHPUsed:33", + Message: "batchAllocatable[Mem(GB)]:33 = nodeCapacity:120 - nodeSafetyMargin:42 - systemUsage:12 - podHPUsed:33", }, }, wantErr: false, @@ -1766,12 +1766,12 @@ func TestPluginCalculate(t *testing.T) { { Name: extension.BatchCPU, Quantity: resource.NewQuantity(25000, resource.DecimalSI), - Message: "batchAllocatable[CPU(Milli-Core)]:25000 = nodeCapacity:100000 - nodeReservation:35000 - systemUsageOrReserved:7000 - podHPUsed:33000", + Message: "batchAllocatable[CPU(Milli-Core)]:25000 = nodeCapacity:100000 - nodeSafetyMargin:35000 - systemUsageOrNodeReserved:7000 - podHPUsed:33000", }, { Name: extension.BatchMemory, Quantity: resource.NewScaledQuantity(33, 9), - Message: "batchAllocatable[Mem(GB)]:33 = nodeCapacity:120 - nodeReservation:42 - systemUsage:12 - podHPUsed:33", + Message: "batchAllocatable[Mem(GB)]:33 = nodeCapacity:120 - nodeSafetyMargin:42 - systemUsage:12 - podHPUsed:33", }, }, wantErr: false, @@ -1803,12 +1803,12 @@ func TestPluginCalculate(t *testing.T) { { Name: extension.BatchCPU, Quantity: resource.NewQuantity(12000, resource.DecimalSI), - Message: "batchAllocatable[CPU(Milli-Core)]:12000 = nodeCapacity:100000 - nodeReservation:35000 - systemUsageOrReserved:20000 - podHPUsed:33000", + Message: "batchAllocatable[CPU(Milli-Core)]:12000 = nodeCapacity:100000 - nodeSafetyMargin:35000 - systemUsageOrNodeReserved:20000 - podHPUsed:33000", }, { Name: extension.BatchMemory, Quantity: resource.NewScaledQuantity(33, 9), - Message: "batchAllocatable[Mem(GB)]:33 = nodeCapacity:120 - nodeReservation:42 - systemUsage:12 - podHPUsed:33", + Message: "batchAllocatable[Mem(GB)]:33 = nodeCapacity:120 - nodeSafetyMargin:42 - systemUsage:12 - podHPUsed:33", }, }, wantErr: false, @@ -1840,12 +1840,12 @@ func TestPluginCalculate(t *testing.T) { { Name: extension.BatchCPU, Quantity: resource.NewQuantity(12000, resource.DecimalSI), - Message: "batchAllocatable[CPU(Milli-Core)]:12000 = nodeCapacity:100000 - nodeReservation:35000 - systemUsageOrReserved:20000 - podHPUsed:33000", + Message: "batchAllocatable[CPU(Milli-Core)]:12000 = nodeCapacity:100000 - nodeSafetyMargin:35000 - systemUsageOrNodeReserved:20000 - podHPUsed:33000", }, { Name: extension.BatchMemory, Quantity: resource.NewScaledQuantity(33, 9), - Message: "batchAllocatable[Mem(GB)]:33 = nodeCapacity:120 - nodeReservation:42 - systemUsage:12 - podHPUsed:33", + Message: "batchAllocatable[Mem(GB)]:33 = nodeCapacity:120 - nodeSafetyMargin:42 - systemUsage:12 - podHPUsed:33", }, }, wantErr: false, @@ -1878,12 +1878,12 @@ func TestPluginCalculate(t *testing.T) { { Name: extension.BatchCPU, Quantity: resource.NewQuantity(22000, resource.DecimalSI), - Message: "batchAllocatable[CPU(Milli-Core)]:22000 = nodeCapacity:100000 - nodeReservation:35000 - systemUsageOrReserved:10000 - podHPUsed:33000", + Message: "batchAllocatable[CPU(Milli-Core)]:22000 = nodeCapacity:100000 - nodeSafetyMargin:35000 - systemUsageOrNodeReserved:10000 - podHPUsed:33000", }, { Name: extension.BatchMemory, Quantity: resource.NewScaledQuantity(33, 9), - Message: "batchAllocatable[Mem(GB)]:33 = nodeCapacity:120 - nodeReservation:42 - systemUsage:12 - podHPUsed:33", + Message: "batchAllocatable[Mem(GB)]:33 = nodeCapacity:120 - nodeSafetyMargin:42 - systemUsage:12 - podHPUsed:33", }, }, wantErr: false, @@ -1915,12 +1915,12 @@ func TestPluginCalculate(t *testing.T) { { Name: extension.BatchCPU, Quantity: resource.NewQuantity(25000, resource.DecimalSI), - Message: "batchAllocatable[CPU(Milli-Core)]:25000 = nodeCapacity:100000 - nodeReservation:35000 - systemUsageOrReserved:7000 - podHPUsed:33000", + Message: "batchAllocatable[CPU(Milli-Core)]:25000 = nodeCapacity:100000 - nodeSafetyMargin:35000 - systemUsageOrNodeReserved:7000 - podHPUsed:33000", }, { Name: extension.BatchMemory, Quantity: resource.NewScaledQuantity(25, 9), - Message: "batchAllocatable[Mem(GB)]:25 = nodeCapacity:120 - nodeReservation:42 - systemUsage:20 - podHPUsed:33", + Message: "batchAllocatable[Mem(GB)]:25 = nodeCapacity:120 - nodeSafetyMargin:42 - systemUsage:20 - podHPUsed:33", }, }, wantErr: false, @@ -1952,12 +1952,12 @@ func TestPluginCalculate(t *testing.T) { { Name: extension.BatchCPU, Quantity: resource.NewQuantity(25000, resource.DecimalSI), - Message: "batchAllocatable[CPU(Milli-Core)]:25000 = nodeCapacity:100000 - nodeReservation:35000 - systemUsageOrReserved:7000 - podHPUsed:33000", + Message: "batchAllocatable[CPU(Milli-Core)]:25000 = nodeCapacity:100000 - nodeSafetyMargin:35000 - systemUsageOrNodeReserved:7000 - podHPUsed:33000", }, { Name: extension.BatchMemory, Quantity: resource.NewScaledQuantity(33, 9), - Message: "batchAllocatable[Mem(GB)]:33 = nodeCapacity:120 - nodeReservation:42 - systemUsage:12 - podHPUsed:33", + Message: "batchAllocatable[Mem(GB)]:33 = nodeCapacity:120 - nodeSafetyMargin:42 - systemUsage:12 - podHPUsed:33", }, }, wantErr: false, @@ -1992,12 +1992,12 @@ func TestPluginCalculate(t *testing.T) { { Name: extension.BatchCPU, Quantity: resource.NewQuantity(25000, resource.DecimalSI), - Message: "batchAllocatable[CPU(Milli-Core)]:25000 = nodeCapacity:100000 - nodeReservation:35000 - systemUsageOrReserved:7000 - podHPUsed:33000", + Message: "batchAllocatable[CPU(Milli-Core)]:25000 = nodeCapacity:100000 - nodeSafetyMargin:35000 - systemUsageOrNodeReserved:7000 - podHPUsed:33000", }, { Name: extension.BatchMemory, Quantity: resource.NewScaledQuantity(33, 9), - Message: "batchAllocatable[Mem(GB)]:33 = nodeCapacity:120 - nodeReservation:42 - systemUsage:12 - podHPUsed:33", + Message: "batchAllocatable[Mem(GB)]:33 = nodeCapacity:120 - nodeSafetyMargin:42 - systemUsage:12 - podHPUsed:33", }, }, wantErr: false, @@ -2032,12 +2032,12 @@ func TestPluginCalculate(t *testing.T) { { Name: extension.BatchCPU, Quantity: resource.NewQuantity(22000, resource.DecimalSI), - Message: "batchAllocatable[CPU(Milli-Core)]:22000 = nodeCapacity:100000 - nodeReservation:35000 - systemUsageOrReserved:10000 - podHPUsed:33000", + Message: "batchAllocatable[CPU(Milli-Core)]:22000 = nodeCapacity:100000 - nodeSafetyMargin:35000 - systemUsageOrNodeReserved:10000 - podHPUsed:33000", }, { Name: extension.BatchMemory, Quantity: resource.NewScaledQuantity(25, 9), - Message: "batchAllocatable[Mem(GB)]:25 = nodeCapacity:120 - nodeReservation:42 - systemUsage:20 - podHPUsed:33", + Message: "batchAllocatable[Mem(GB)]:25 = nodeCapacity:120 - nodeSafetyMargin:42 - systemUsage:20 - podHPUsed:33", }, }, wantErr: false, @@ -2072,12 +2072,12 @@ func TestPluginCalculate(t *testing.T) { { Name: extension.BatchCPU, Quantity: resource.NewQuantity(22000, resource.DecimalSI), - Message: "batchAllocatable[CPU(Milli-Core)]:22000 = nodeCapacity:100000 - nodeReservation:35000 - systemUsageOrReserved:10000 - podHPUsed:33000", + Message: "batchAllocatable[CPU(Milli-Core)]:22000 = nodeCapacity:100000 - nodeSafetyMargin:35000 - systemUsageOrNodeReserved:10000 - podHPUsed:33000", }, { Name: extension.BatchMemory, Quantity: resource.NewScaledQuantity(25, 9), - Message: "batchAllocatable[Mem(GB)]:25 = nodeCapacity:120 - nodeReservation:42 - systemUsage:20 - podHPUsed:33", + Message: "batchAllocatable[Mem(GB)]:25 = nodeCapacity:120 - nodeSafetyMargin:42 - systemUsage:20 - podHPUsed:33", }, }, wantErr: false, @@ -2112,12 +2112,12 @@ func TestPluginCalculate(t *testing.T) { { Name: extension.BatchCPU, Quantity: resource.NewQuantity(22000, resource.DecimalSI), - Message: "batchAllocatable[CPU(Milli-Core)]:22000 = nodeCapacity:100000 - nodeReservation:35000 - systemUsageOrReserved:10000 - podHPUsed:33000", + Message: "batchAllocatable[CPU(Milli-Core)]:22000 = nodeCapacity:100000 - nodeSafetyMargin:35000 - systemUsageOrNodeReserved:10000 - podHPUsed:33000", }, { Name: extension.BatchMemory, Quantity: resource.NewScaledQuantity(25, 9), - Message: "batchAllocatable[Mem(GB)]:25 = nodeCapacity:120 - nodeReservation:42 - systemUsage:20 - podHPUsed:33", + Message: "batchAllocatable[Mem(GB)]:25 = nodeCapacity:120 - nodeSafetyMargin:42 - systemUsage:20 - podHPUsed:33", }, }, wantErr: false, @@ -2148,12 +2148,12 @@ func TestPluginCalculate(t *testing.T) { { Name: extension.BatchCPU, Quantity: resource.NewQuantity(30000, resource.DecimalSI), - Message: "batchAllocatable[CPU(Milli-Core)]:30000 = nodeCapacity:100000 - nodeReservation:30000 - systemUsageOrReserved:7000 - podHPUsed:33000", + Message: "batchAllocatable[CPU(Milli-Core)]:30000 = nodeCapacity:100000 - nodeSafetyMargin:30000 - systemUsageOrNodeReserved:7000 - podHPUsed:33000", }, { Name: extension.BatchMemory, Quantity: resource.NewScaledQuantity(36, 9), - Message: "batchAllocatable[Mem(GB)]:36 = nodeCapacity:120 - nodeReservation:24 - systemReserved:0 - podHPRequest:60", + Message: "batchAllocatable[Mem(GB)]:36 = nodeCapacity:120 - nodeSafetyMargin:24 - nodeReserved:0 - podHPRequest:60", }, }, wantErr: false, @@ -2189,12 +2189,12 @@ func TestPluginCalculate(t *testing.T) { { Name: extension.BatchCPU, Quantity: resource.NewQuantity(30000, resource.DecimalSI), - Message: "batchAllocatable[CPU(Milli-Core)]:30000 = nodeCapacity:100000 - nodeReservation:30000 - systemUsageOrReserved:7000 - podHPUsed:33000", + Message: "batchAllocatable[CPU(Milli-Core)]:30000 = nodeCapacity:100000 - nodeSafetyMargin:30000 - systemUsageOrNodeReserved:7000 - podHPUsed:33000", }, { Name: extension.BatchMemory, Quantity: resource.NewScaledQuantity(31, 9), - Message: "batchAllocatable[Mem(GB)]:31 = nodeCapacity:120 - nodeReservation:24 - systemReserved:5 - podHPRequest:60", + Message: "batchAllocatable[Mem(GB)]:31 = nodeCapacity:120 - nodeSafetyMargin:24 - nodeReserved:5 - podHPRequest:60", }, }, wantErr: false, @@ -2230,12 +2230,12 @@ func TestPluginCalculate(t *testing.T) { { Name: extension.BatchCPU, Quantity: resource.NewQuantity(27000, resource.DecimalSI), - Message: "batchAllocatable[CPU(Milli-Core)]:27000 = nodeCapacity:100000 - nodeReservation:30000 - systemUsageOrReserved:10000 - podHPUsed:33000", + Message: "batchAllocatable[CPU(Milli-Core)]:27000 = nodeCapacity:100000 - nodeSafetyMargin:30000 - systemUsageOrNodeReserved:10000 - podHPUsed:33000", }, { Name: extension.BatchMemory, Quantity: resource.NewScaledQuantity(16, 9), - Message: "batchAllocatable[Mem(GB)]:16 = nodeCapacity:120 - nodeReservation:24 - systemReserved:20 - podHPRequest:60", + Message: "batchAllocatable[Mem(GB)]:16 = nodeCapacity:120 - nodeSafetyMargin:24 - nodeReserved:20 - podHPRequest:60", }, }, wantErr: false, @@ -2271,12 +2271,12 @@ func TestPluginCalculate(t *testing.T) { { Name: extension.BatchCPU, Quantity: resource.NewQuantity(30000, resource.DecimalSI), - Message: "batchAllocatable[CPU(Milli-Core)]:30000 = nodeCapacity:100000 - nodeReservation:30000 - systemUsageOrReserved:7000 - podHPUsed:33000", + Message: "batchAllocatable[CPU(Milli-Core)]:30000 = nodeCapacity:100000 - nodeSafetyMargin:30000 - systemUsageOrNodeReserved:7000 - podHPUsed:33000", }, { Name: extension.BatchMemory, Quantity: resource.NewScaledQuantity(26, 9), - Message: "batchAllocatable[Mem(GB)]:26 = nodeCapacity:120 - nodeReservation:24 - systemReserved:10 - podHPRequest:60", + Message: "batchAllocatable[Mem(GB)]:26 = nodeCapacity:120 - nodeSafetyMargin:24 - nodeReserved:10 - podHPRequest:60", }, }, wantErr: false, @@ -2435,12 +2435,12 @@ func TestPluginCalculate(t *testing.T) { { Name: extension.BatchCPU, Quantity: resource.NewQuantity(25000, resource.DecimalSI), - Message: "batchAllocatable[CPU(Milli-Core)]:25000 = nodeCapacity:100000 - nodeReservation:35000 - systemUsageOrReserved:7000 - podHPUsed:33000", + Message: "batchAllocatable[CPU(Milli-Core)]:25000 = nodeCapacity:100000 - nodeSafetyMargin:35000 - systemUsageOrNodeReserved:7000 - podHPUsed:33000", }, { Name: extension.BatchMemory, Quantity: resource.NewScaledQuantity(33, 9), - Message: "batchAllocatable[Mem(GB)]:33 = nodeCapacity:120 - nodeReservation:42 - systemUsage:12 - podHPUsed:33", + Message: "batchAllocatable[Mem(GB)]:33 = nodeCapacity:120 - nodeSafetyMargin:42 - systemUsage:12 - podHPUsed:33", }, }, wantErr: false, @@ -2534,12 +2534,12 @@ func TestPluginCalculate(t *testing.T) { { Name: extension.BatchCPU, Quantity: resource.NewQuantity(35000, resource.DecimalSI), - Message: "batchAllocatable[CPU(Milli-Core)]:35000 = nodeCapacity:100000 - nodeReservation:35000 - systemUsageOrReserved:5000 - podHPUsed:25000", + Message: "batchAllocatable[CPU(Milli-Core)]:35000 = nodeCapacity:100000 - nodeSafetyMargin:35000 - systemUsageOrNodeReserved:5000 - podHPUsed:25000", }, { Name: extension.BatchMemory, Quantity: resource.NewScaledQuantity(43, 9), - Message: "batchAllocatable[Mem(GB)]:43 = nodeCapacity:120 - nodeReservation:42 - systemUsage:10 - podHPUsed:25", + Message: "batchAllocatable[Mem(GB)]:43 = nodeCapacity:120 - nodeSafetyMargin:42 - systemUsage:10 - podHPUsed:25", }, }, wantErr: false, @@ -2698,12 +2698,12 @@ func TestPluginCalculate(t *testing.T) { { Name: extension.BatchCPU, Quantity: resource.NewQuantity(20000, resource.DecimalSI), - Message: "batchAllocatable[CPU(Milli-Core)]:20000 = nodeCapacity:100000 - nodeReservation:35000 - systemUsageOrReserved:7000 - podHPUsed:38000", + Message: "batchAllocatable[CPU(Milli-Core)]:20000 = nodeCapacity:100000 - nodeSafetyMargin:35000 - systemUsageOrNodeReserved:7000 - podHPUsed:38000", }, { Name: extension.BatchMemory, Quantity: resource.NewScaledQuantity(33, 9), - Message: "batchAllocatable[Mem(GB)]:33 = nodeCapacity:120 - nodeReservation:42 - systemUsage:12 - podHPUsed:33", + Message: "batchAllocatable[Mem(GB)]:33 = nodeCapacity:120 - nodeSafetyMargin:42 - systemUsage:12 - podHPUsed:33", }, }, wantErr: false, @@ -2890,7 +2890,7 @@ func TestPluginCalculate(t *testing.T) { { Name: extension.BatchCPU, Quantity: resource.NewQuantity(25000, resource.DecimalSI), - Message: "batchAllocatable[CPU(Milli-Core)]:25000 = nodeCapacity:100000 - nodeReservation:35000 - systemUsageOrReserved:7000 - podHPUsed:33000", + Message: "batchAllocatable[CPU(Milli-Core)]:25000 = nodeCapacity:100000 - nodeSafetyMargin:35000 - systemUsageOrNodeReserved:7000 - podHPUsed:33000", ZoneQuantity: map[string]resource.Quantity{ util.GenNodeZoneName(0): *resource.NewQuantity(25000, resource.DecimalSI), }, @@ -2898,7 +2898,7 @@ func TestPluginCalculate(t *testing.T) { { Name: extension.BatchMemory, Quantity: resource.NewScaledQuantity(33, 9), - Message: "batchAllocatable[Mem(GB)]:33 = nodeCapacity:120 - nodeReservation:42 - systemUsage:12 - podHPUsed:33", + Message: "batchAllocatable[Mem(GB)]:33 = nodeCapacity:120 - nodeSafetyMargin:42 - systemUsage:12 - podHPUsed:33", ZoneQuantity: map[string]resource.Quantity{ util.GenNodeZoneName(0): *resource.NewScaledQuantity(33, 9), }, @@ -3115,7 +3115,7 @@ func TestPluginCalculate(t *testing.T) { { Name: extension.BatchCPU, Quantity: resource.NewQuantity(25000, resource.DecimalSI), - Message: "batchAllocatable[CPU(Milli-Core)]:25000 = nodeCapacity:100000 - nodeReservation:35000 - systemUsageOrReserved:7000 - podHPUsed:33000", + Message: "batchAllocatable[CPU(Milli-Core)]:25000 = nodeCapacity:100000 - nodeSafetyMargin:35000 - systemUsageOrNodeReserved:7000 - podHPUsed:33000", ZoneQuantity: map[string]resource.Quantity{ util.GenNodeZoneName(0): *resource.NewQuantity(10000, resource.DecimalSI), // 50 - 17.5 - 3.5 - (14 + 5) util.GenNodeZoneName(1): *resource.NewQuantity(15000, resource.DecimalSI), // 50 - 17.5 - 3.5 - 14 @@ -3124,7 +3124,7 @@ func TestPluginCalculate(t *testing.T) { { Name: extension.BatchMemory, Quantity: resource.NewScaledQuantity(33, 9), - Message: "batchAllocatable[Mem(GB)]:33 = nodeCapacity:120 - nodeReservation:42 - systemUsage:12 - podHPUsed:33", + Message: "batchAllocatable[Mem(GB)]:33 = nodeCapacity:120 - nodeSafetyMargin:42 - systemUsage:12 - podHPUsed:33", ZoneQuantity: map[string]resource.Quantity{ util.GenNodeZoneName(0): *resource.NewScaledQuantity(15300, 6), // 62 - 21.7(62*0.35) - 6 - (14 + 5) util.GenNodeZoneName(1): *resource.NewScaledQuantity(17700, 6), // 58 - 20.3(58*0.35) - 6 - 14 @@ -3345,7 +3345,7 @@ func TestPluginCalculate(t *testing.T) { { Name: extension.BatchCPU, Quantity: resource.NewQuantity(20000, resource.DecimalSI), - Message: "batchAllocatable[CPU(Milli-Core)]:20000 = nodeCapacity:100000 - nodeReservation:35000 - systemUsageOrReserved:7000 - podHPUsed:38000", + Message: "batchAllocatable[CPU(Milli-Core)]:20000 = nodeCapacity:100000 - nodeSafetyMargin:35000 - systemUsageOrNodeReserved:7000 - podHPUsed:38000", ZoneQuantity: map[string]resource.Quantity{ util.GenNodeZoneName(0): *resource.NewQuantity(5000, resource.DecimalSI), // 50 - 17.5 - 3.5 - (14 + 10) util.GenNodeZoneName(1): *resource.NewQuantity(15000, resource.DecimalSI), // 50 - 17.5 - 3.5 - 14 @@ -3354,7 +3354,7 @@ func TestPluginCalculate(t *testing.T) { { Name: extension.BatchMemory, Quantity: resource.NewScaledQuantity(18, 9), - Message: "batchAllocatable[Mem(GB)]:18 = nodeCapacity:120 - nodeReservation:42 - systemReserved:0 - podHPRequest:60", + Message: "batchAllocatable[Mem(GB)]:18 = nodeCapacity:120 - nodeSafetyMargin:42 - nodeReserved:0 - podHPRequest:60", ZoneQuantity: map[string]resource.Quantity{ util.GenNodeZoneName(0): *resource.NewScaledQuantity(5300, 6), // 62 - 21.7(62*0.35) - (25 + 10) util.GenNodeZoneName(1): *resource.NewScaledQuantity(12700, 6), // 58 - 20.3(58*0.35) - 25 @@ -3575,7 +3575,7 @@ func TestPluginCalculate(t *testing.T) { { Name: extension.BatchCPU, Quantity: resource.NewQuantity(18000, resource.DecimalSI), - Message: "batchAllocatable[CPU(Milli-Core)]:18000 = nodeCapacity:100000 - nodeReservation:35000 - systemUsageOrReserved:7000 - podHPUsed:40000", + Message: "batchAllocatable[CPU(Milli-Core)]:18000 = nodeCapacity:100000 - nodeSafetyMargin:35000 - systemUsageOrNodeReserved:7000 - podHPUsed:40000", ZoneQuantity: map[string]resource.Quantity{ util.GenNodeZoneName(0): *resource.NewQuantity(4000, resource.DecimalSI), // 50 - 17.5 - 3.5 - (14 + 10 + 1) util.GenNodeZoneName(1): *resource.NewQuantity(14000, resource.DecimalSI), // 50 - 17.5 - 3.5 - (14 + 1) @@ -3584,7 +3584,7 @@ func TestPluginCalculate(t *testing.T) { { Name: extension.BatchMemory, Quantity: resource.NewScaledQuantity(18, 9), - Message: "batchAllocatable[Mem(GB)]:18 = nodeCapacity:120 - nodeReservation:42 - systemReserved:0 - podHPRequest:60", + Message: "batchAllocatable[Mem(GB)]:18 = nodeCapacity:120 - nodeSafetyMargin:42 - nodeReserved:0 - podHPRequest:60", ZoneQuantity: map[string]resource.Quantity{ util.GenNodeZoneName(0): *resource.NewScaledQuantity(5300, 6), // 62 - 21.7(62*0.35) - (25 + 10) util.GenNodeZoneName(1): *resource.NewScaledQuantity(12700, 6), // 58 - 20.3(58*0.35) - 25 @@ -3621,12 +3621,12 @@ func TestPluginCalculate(t *testing.T) { { Name: extension.BatchCPU, Quantity: resource.NewQuantity(21000, resource.DecimalSI), - Message: "batchAllocatable[CPU(Milli-Core)]:21000 = nodeCapacity:100000 - nodeReservation:30000 - systemUsageOrReserved:7000 - podHPMaxUsedRequest:42000", + Message: "batchAllocatable[CPU(Milli-Core)]:21000 = nodeCapacity:100000 - nodeSafetyMargin:30000 - systemUsageOrNodeReserved:7000 - podHPMaxUsedRequest:42000", }, { Name: extension.BatchMemory, Quantity: resource.NewScaledQuantity(36, 9), - Message: "batchAllocatable[Mem(GB)]:36 = nodeCapacity:120 - nodeReservation:24 - systemReserved:0 - podHPRequest:60", + Message: "batchAllocatable[Mem(GB)]:36 = nodeCapacity:120 - nodeSafetyMargin:24 - nodeReserved:0 - podHPRequest:60", }, }, wantErr: false, @@ -3659,12 +3659,12 @@ func TestPluginCalculate(t *testing.T) { { Name: extension.BatchCPU, Quantity: resource.NewQuantity(101000, resource.DecimalSI), - Message: "batchAllocatable[CPU(Milli-Core)]:101000 = nodeCapacity:100000 - nodeReservation:-50000 - systemUsageOrReserved:7000 - podHPMaxUsedRequest:42000", + Message: "batchAllocatable[CPU(Milli-Core)]:101000 = nodeCapacity:100000 - nodeSafetyMargin:-50000 - systemUsageOrNodeReserved:7000 - podHPMaxUsedRequest:42000", }, { Name: extension.BatchMemory, Quantity: resource.NewScaledQuantity(84, 9), - Message: "batchAllocatable[Mem(GB)]:84 = nodeCapacity:120 - nodeReservation:-24 - systemReserved:0 - podHPRequest:60", + Message: "batchAllocatable[Mem(GB)]:84 = nodeCapacity:120 - nodeSafetyMargin:-24 - nodeReserved:0 - podHPRequest:60", }, }, wantErr: false, @@ -3720,12 +3720,12 @@ func TestPluginCalculate(t *testing.T) { { Name: extension.BatchCPU, Quantity: resource.NewQuantity(25000, resource.DecimalSI), - Message: "batchAllocatable[CPU(Milli-Core)]:25000 = nodeCapacity:100000 - nodeReservation:35000 - systemUsageOrReserved:7000 - podHPUsed:33000", + Message: "batchAllocatable[CPU(Milli-Core)]:25000 = nodeCapacity:100000 - nodeSafetyMargin:35000 - systemUsageOrNodeReserved:7000 - podHPUsed:33000", }, { Name: extension.BatchMemory, Quantity: resource.NewScaledQuantity(33, 9), - Message: "batchAllocatable[Mem(GB)]:33 = nodeCapacity:120 - nodeReservation:42 - systemUsage:12 - podHPUsed:33", + Message: "batchAllocatable[Mem(GB)]:33 = nodeCapacity:120 - nodeSafetyMargin:42 - systemUsage:12 - podHPUsed:33", }, }, wantErr: false, @@ -3781,12 +3781,12 @@ func TestPluginCalculate(t *testing.T) { { Name: extension.BatchCPU, Quantity: resource.NewQuantity(28000, resource.DecimalSI), - Message: "batchAllocatable[CPU(Milli-Core)]:28000 = nodeCapacity:100000 - nodeReservation:35000 - systemUsageOrReserved:4000 - podHPUsed:33000", + Message: "batchAllocatable[CPU(Milli-Core)]:28000 = nodeCapacity:100000 - nodeSafetyMargin:35000 - systemUsageOrNodeReserved:4000 - podHPUsed:33000", }, { Name: extension.BatchMemory, Quantity: resource.NewScaledQuantity(39, 9), - Message: "batchAllocatable[Mem(GB)]:39 = nodeCapacity:120 - nodeReservation:42 - systemUsage:6 - podHPUsed:33", + Message: "batchAllocatable[Mem(GB)]:39 = nodeCapacity:120 - nodeSafetyMargin:42 - systemUsage:6 - podHPUsed:33", }, }, wantErr: false, @@ -4005,7 +4005,7 @@ func TestPluginCalculate(t *testing.T) { { Name: extension.BatchCPU, Quantity: resource.NewQuantity(14000, resource.DecimalSI), - Message: "batchAllocatable[CPU(Milli-Core)]:14000 = nodeCapacity:100000 - nodeReservation:35000 - systemUsageOrReserved:7000 - podHPUsed:44000", + Message: "batchAllocatable[CPU(Milli-Core)]:14000 = nodeCapacity:100000 - nodeSafetyMargin:35000 - systemUsageOrNodeReserved:7000 - podHPUsed:44000", ZoneQuantity: map[string]resource.Quantity{ util.GenNodeZoneName(0): *resource.NewQuantity(2000, resource.DecimalSI), // 50 - 17.5 - 3.5 - (14 + 10 + 1 + 2) util.GenNodeZoneName(1): *resource.NewQuantity(12000, resource.DecimalSI), // 50 - 17.5 - 3.5 - (14 + 1 + 2) @@ -4014,7 +4014,7 @@ func TestPluginCalculate(t *testing.T) { { Name: extension.BatchMemory, Quantity: resource.NewScaledQuantity(18, 9), - Message: "batchAllocatable[Mem(GB)]:18 = nodeCapacity:120 - nodeReservation:42 - systemReserved:0 - podHPRequest:60", + Message: "batchAllocatable[Mem(GB)]:18 = nodeCapacity:120 - nodeSafetyMargin:42 - nodeReserved:0 - podHPRequest:60", ZoneQuantity: map[string]resource.Quantity{ util.GenNodeZoneName(0): *resource.NewScaledQuantity(5300, 6), // 62 - 21.7(62*0.35) - (25 + 10) util.GenNodeZoneName(1): *resource.NewScaledQuantity(12700, 6), // 58 - 20.3(58*0.35) - 25 diff --git a/pkg/slo-controller/noderesource/plugins/batchresource/util.go b/pkg/slo-controller/noderesource/plugins/batchresource/util.go index b7d5d5df2..9411f63c9 100644 --- a/pkg/slo-controller/noderesource/plugins/batchresource/util.go +++ b/pkg/slo-controller/noderesource/plugins/batchresource/util.go @@ -35,22 +35,22 @@ import ( "github.com/koordinator-sh/koordinator/pkg/util" ) -func calculateBatchResourceByPolicy(strategy *configuration.ColocationStrategy, nodeCapacity, nodeReserved, systemReserved, +func calculateBatchResourceByPolicy(strategy *configuration.ColocationStrategy, nodeCapacity, nodeSafetyMargin, nodeReserved, systemUsed, podHPReq, podHPUsed, podHPMaxUsedReq corev1.ResourceList) (corev1.ResourceList, string, string) { - // Node(Batch).Alloc[usage] := Node.Total - Node.Reserved - System.Used - sum(Pod(Prod/Mid).Used) + // Node(Batch).Alloc[usage] := Node.Total - Node.SafetyMargin - System.Used - sum(Pod(Prod/Mid).Used) // System.Used = max(Node.Used - Pod(All).Used, Node.Anno.Reserved, Node.Kubelet.Reserved) - systemUsed = quotav1.Max(systemUsed, systemReserved) + systemUsed = quotav1.Max(systemUsed, nodeReserved) batchAllocatableByUsage := quotav1.Max(quotav1.Subtract(quotav1.Subtract(quotav1.Subtract( - nodeCapacity, nodeReserved), systemUsed), podHPUsed), util.NewZeroResourceList()) + nodeCapacity, nodeSafetyMargin), systemUsed), podHPUsed), util.NewZeroResourceList()) - // Node(Batch).Alloc[request] := Node.Total - Node.Reserved - System.Reserved - sum(Pod(Prod/Mid).Request) + // Node(Batch).Alloc[request] := Node.Total - Node.SafetyMargin - System.Reserved - sum(Pod(Prod/Mid).Request) // System.Reserved = max(Node.Anno.Reserved, Node.Kubelet.Reserved) batchAllocatableByRequest := quotav1.Max(quotav1.Subtract(quotav1.Subtract(quotav1.Subtract( - nodeCapacity, nodeReserved), systemReserved), podHPReq), util.NewZeroResourceList()) + nodeCapacity, nodeSafetyMargin), nodeReserved), podHPReq), util.NewZeroResourceList()) - // Node(Batch).Alloc[maxUsageRequest] := Node.Total - Node.Reserved - System.Used - sum(max(Pod(Prod/Mid).Request, Pod(Prod/Mid).Used)) + // Node(Batch).Alloc[maxUsageRequest] := Node.Total - Node.SafetyMargin - System.Used - sum(max(Pod(Prod/Mid).Request, Pod(Prod/Mid).Used)) batchAllocatableByMaxUsageRequest := quotav1.Max(quotav1.Subtract(quotav1.Subtract(quotav1.Subtract( - nodeCapacity, nodeReserved), systemUsed), podHPMaxUsedReq), util.NewZeroResourceList()) + nodeCapacity, nodeSafetyMargin), systemUsed), podHPMaxUsedReq), util.NewZeroResourceList()) batchAllocatable := batchAllocatableByUsage @@ -58,12 +58,12 @@ func calculateBatchResourceByPolicy(strategy *configuration.ColocationStrategy, // batch cpu support policy "usage" and "maxUsageRequest" if strategy != nil && strategy.CPUCalculatePolicy != nil && *strategy.CPUCalculatePolicy == configuration.CalculateByPodMaxUsageRequest { batchAllocatable[corev1.ResourceCPU] = *batchAllocatableByMaxUsageRequest.Cpu() - cpuMsg = fmt.Sprintf("batchAllocatable[CPU(Milli-Core)]:%v = nodeCapacity:%v - nodeReservation:%v - systemUsageOrReserved:%v - podHPMaxUsedRequest:%v", - batchAllocatable.Cpu().MilliValue(), nodeCapacity.Cpu().MilliValue(), nodeReserved.Cpu().MilliValue(), + cpuMsg = fmt.Sprintf("batchAllocatable[CPU(Milli-Core)]:%v = nodeCapacity:%v - nodeSafetyMargin:%v - systemUsageOrNodeReserved:%v - podHPMaxUsedRequest:%v", + batchAllocatable.Cpu().MilliValue(), nodeCapacity.Cpu().MilliValue(), nodeSafetyMargin.Cpu().MilliValue(), systemUsed.Cpu().MilliValue(), podHPMaxUsedReq.Cpu().MilliValue()) } else { // use CalculatePolicy "usage" by default - cpuMsg = fmt.Sprintf("batchAllocatable[CPU(Milli-Core)]:%v = nodeCapacity:%v - nodeReservation:%v - systemUsageOrReserved:%v - podHPUsed:%v", - batchAllocatable.Cpu().MilliValue(), nodeCapacity.Cpu().MilliValue(), nodeReserved.Cpu().MilliValue(), + cpuMsg = fmt.Sprintf("batchAllocatable[CPU(Milli-Core)]:%v = nodeCapacity:%v - nodeSafetyMargin:%v - systemUsageOrNodeReserved:%v - podHPUsed:%v", + batchAllocatable.Cpu().MilliValue(), nodeCapacity.Cpu().MilliValue(), nodeSafetyMargin.Cpu().MilliValue(), systemUsed.Cpu().MilliValue(), podHPUsed.Cpu().MilliValue()) } @@ -71,20 +71,20 @@ func calculateBatchResourceByPolicy(strategy *configuration.ColocationStrategy, // batch memory support policy "usage", "request" and "maxUsageRequest" if strategy != nil && strategy.MemoryCalculatePolicy != nil && *strategy.MemoryCalculatePolicy == configuration.CalculateByPodRequest { batchAllocatable[corev1.ResourceMemory] = *batchAllocatableByRequest.Memory() - memMsg = fmt.Sprintf("batchAllocatable[Mem(GB)]:%v = nodeCapacity:%v - nodeReservation:%v - systemReserved:%v - podHPRequest:%v", + memMsg = fmt.Sprintf("batchAllocatable[Mem(GB)]:%v = nodeCapacity:%v - nodeSafetyMargin:%v - nodeReserved:%v - podHPRequest:%v", batchAllocatable.Memory().ScaledValue(resource.Giga), nodeCapacity.Memory().ScaledValue(resource.Giga), - nodeReserved.Memory().ScaledValue(resource.Giga), systemReserved.Memory().ScaledValue(resource.Giga), + nodeSafetyMargin.Memory().ScaledValue(resource.Giga), nodeReserved.Memory().ScaledValue(resource.Giga), podHPReq.Memory().ScaledValue(resource.Giga)) } else if strategy != nil && strategy.MemoryCalculatePolicy != nil && *strategy.MemoryCalculatePolicy == configuration.CalculateByPodMaxUsageRequest { batchAllocatable[corev1.ResourceMemory] = *batchAllocatableByMaxUsageRequest.Memory() - memMsg = fmt.Sprintf("batchAllocatable[Mem(GB)]:%v = nodeCapacity:%v - nodeReservation:%v - systemUsage:%v - podHPMaxUsedRequest:%v", + memMsg = fmt.Sprintf("batchAllocatable[Mem(GB)]:%v = nodeCapacity:%v - nodeSafetyMargin:%v - systemUsage:%v - podHPMaxUsedRequest:%v", batchAllocatable.Memory().ScaledValue(resource.Giga), nodeCapacity.Memory().ScaledValue(resource.Giga), - nodeReserved.Memory().ScaledValue(resource.Giga), systemUsed.Memory().ScaledValue(resource.Giga), + nodeSafetyMargin.Memory().ScaledValue(resource.Giga), systemUsed.Memory().ScaledValue(resource.Giga), podHPMaxUsedReq.Memory().ScaledValue(resource.Giga)) } else { // use CalculatePolicy "usage" by default - memMsg = fmt.Sprintf("batchAllocatable[Mem(GB)]:%v = nodeCapacity:%v - nodeReservation:%v - systemUsage:%v - podHPUsed:%v", + memMsg = fmt.Sprintf("batchAllocatable[Mem(GB)]:%v = nodeCapacity:%v - nodeSafetyMargin:%v - systemUsage:%v - podHPUsed:%v", batchAllocatable.Memory().ScaledValue(resource.Giga), nodeCapacity.Memory().ScaledValue(resource.Giga), - nodeReserved.Memory().ScaledValue(resource.Giga), systemUsed.Memory().ScaledValue(resource.Giga), + nodeSafetyMargin.Memory().ScaledValue(resource.Giga), systemUsed.Memory().ScaledValue(resource.Giga), podHPUsed.Memory().ScaledValue(resource.Giga)) } return batchAllocatable, cpuMsg, memMsg @@ -201,10 +201,10 @@ func getNodeCapacity(node *corev1.Node) corev1.ResourceList { return getResourceListForCPUAndMemory(node.Status.Capacity) } -// getNodeReservation gets node-level safe-guarding reservation with the node's allocatable -func getNodeReservation(strategy *configuration.ColocationStrategy, nodeAllocatable corev1.ResourceList) corev1.ResourceList { - cpuReserveQuant := util.MultiplyMilliQuant(nodeAllocatable[corev1.ResourceCPU], getReserveRatio(*strategy.CPUReclaimThresholdPercent)) - memReserveQuant := util.MultiplyQuant(nodeAllocatable[corev1.ResourceMemory], getReserveRatio(*strategy.MemoryReclaimThresholdPercent)) +// getNodeSafetyMargin gets node-level safe-guarding reservation with the node's allocatable +func getNodeSafetyMargin(strategy *configuration.ColocationStrategy, nodeCapacity corev1.ResourceList) corev1.ResourceList { + cpuReserveQuant := util.MultiplyMilliQuant(nodeCapacity[corev1.ResourceCPU], getReserveRatio(*strategy.CPUReclaimThresholdPercent)) + memReserveQuant := util.MultiplyQuant(nodeCapacity[corev1.ResourceMemory], getReserveRatio(*strategy.MemoryReclaimThresholdPercent)) return corev1.ResourceList{ corev1.ResourceCPU: cpuReserveQuant, diff --git a/pkg/slo-controller/noderesource/plugins/batchresource/util_test.go b/pkg/slo-controller/noderesource/plugins/batchresource/util_test.go index 9e0a86356..285f4df4d 100644 --- a/pkg/slo-controller/noderesource/plugins/batchresource/util_test.go +++ b/pkg/slo-controller/noderesource/plugins/batchresource/util_test.go @@ -121,7 +121,7 @@ func Test_getNodeReservation(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got := getNodeReservation(tt.args.strategy, tt.args.nodeAllocatable) + got := getNodeSafetyMargin(tt.args.strategy, tt.args.nodeAllocatable) testingCorrectResourceList(t, &tt.want, &got) }) } diff --git a/pkg/slo-controller/noderesource/resource_calculator_test.go b/pkg/slo-controller/noderesource/resource_calculator_test.go index 2154aa5ec..2fffb9a51 100644 --- a/pkg/slo-controller/noderesource/resource_calculator_test.go +++ b/pkg/slo-controller/noderesource/resource_calculator_test.go @@ -29,12 +29,15 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/clock" + clientgoscheme "k8s.io/client-go/kubernetes/scheme" "k8s.io/utils/pointer" + "sigs.k8s.io/controller-runtime/pkg/builder" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/fake" "github.com/koordinator-sh/koordinator/apis/configuration" "github.com/koordinator-sh/koordinator/apis/extension" + schedulingv1alpha1 "github.com/koordinator-sh/koordinator/apis/scheduling/v1alpha1" slov1alpha1 "github.com/koordinator-sh/koordinator/apis/slo/v1alpha1" "github.com/koordinator-sh/koordinator/pkg/slo-controller/noderesource/framework" "github.com/koordinator-sh/koordinator/pkg/slo-controller/noderesource/plugins/batchresource" @@ -176,12 +179,12 @@ func Test_calculateNodeResource(t *testing.T) { { Name: extension.BatchCPU, Quantity: resource.NewQuantity(0, resource.DecimalSI), - Message: "batchAllocatable[CPU(Milli-Core)]:0 = nodeCapacity:20000 - nodeReservation:7000 - systemUsageOrReserved:0 - podHPUsed:20000", + Message: "batchAllocatable[CPU(Milli-Core)]:0 = nodeCapacity:20000 - nodeSafetyMargin:7000 - systemUsageOrNodeReserved:0 - podHPUsed:20000", }, { Name: extension.BatchMemory, Quantity: resource.NewScaledQuantity(6, 9), - Message: "batchAllocatable[Mem(GB)]:6 = nodeCapacity:40 - nodeReservation:14 - systemUsage:0 - podHPUsed:20", + Message: "batchAllocatable[Mem(GB)]:6 = nodeCapacity:40 - nodeSafetyMargin:14 - systemUsage:0 - podHPUsed:20", }, { Name: extension.MidCPU, @@ -383,12 +386,12 @@ func Test_calculateNodeResource(t *testing.T) { { Name: extension.BatchCPU, Quantity: resource.NewQuantity(25000, resource.DecimalSI), - Message: "batchAllocatable[CPU(Milli-Core)]:25000 = nodeCapacity:100000 - nodeReservation:35000 - systemUsageOrReserved:7000 - podHPUsed:33000", + Message: "batchAllocatable[CPU(Milli-Core)]:25000 = nodeCapacity:100000 - nodeSafetyMargin:35000 - systemUsageOrNodeReserved:7000 - podHPUsed:33000", }, { Name: extension.BatchMemory, Quantity: resource.NewScaledQuantity(33, 9), - Message: "batchAllocatable[Mem(GB)]:33 = nodeCapacity:120 - nodeReservation:42 - systemUsage:12 - podHPUsed:33", + Message: "batchAllocatable[Mem(GB)]:33 = nodeCapacity:120 - nodeSafetyMargin:42 - systemUsage:12 - podHPUsed:33", }, { Name: extension.MidCPU, @@ -593,12 +596,12 @@ func Test_calculateNodeResource(t *testing.T) { { Name: extension.BatchCPU, Quantity: resource.NewQuantity(30000, resource.DecimalSI), - Message: "batchAllocatable[CPU(Milli-Core)]:30000 = nodeCapacity:100000 - nodeReservation:30000 - systemUsageOrReserved:7000 - podHPUsed:33000", + Message: "batchAllocatable[CPU(Milli-Core)]:30000 = nodeCapacity:100000 - nodeSafetyMargin:30000 - systemUsageOrNodeReserved:7000 - podHPUsed:33000", }, { Name: extension.BatchMemory, Quantity: resource.NewScaledQuantity(39, 9), - Message: "batchAllocatable[Mem(GB)]:39 = nodeCapacity:120 - nodeReservation:36 - systemUsage:12 - podHPUsed:33", + Message: "batchAllocatable[Mem(GB)]:39 = nodeCapacity:120 - nodeSafetyMargin:36 - systemUsage:12 - podHPUsed:33", }, { Name: extension.MidCPU, @@ -803,12 +806,12 @@ func Test_calculateNodeResource(t *testing.T) { { Name: extension.BatchCPU, Quantity: resource.NewQuantity(30000, resource.DecimalSI), - Message: "batchAllocatable[CPU(Milli-Core)]:30000 = nodeCapacity:100000 - nodeReservation:30000 - systemUsageOrReserved:7000 - podHPUsed:33000", + Message: "batchAllocatable[CPU(Milli-Core)]:30000 = nodeCapacity:100000 - nodeSafetyMargin:30000 - systemUsageOrNodeReserved:7000 - podHPUsed:33000", }, { Name: extension.BatchMemory, Quantity: resource.NewScaledQuantity(36, 9), - Message: "batchAllocatable[Mem(GB)]:36 = nodeCapacity:120 - nodeReservation:24 - systemReserved:0 - podHPRequest:60", + Message: "batchAllocatable[Mem(GB)]:36 = nodeCapacity:120 - nodeSafetyMargin:24 - nodeReserved:0 - podHPRequest:60", }, { Name: extension.MidCPU, @@ -1018,12 +1021,12 @@ func Test_calculateNodeResource(t *testing.T) { { Name: extension.BatchCPU, Quantity: resource.NewQuantity(25000, resource.DecimalSI), - Message: "batchAllocatable[CPU(Milli-Core)]:25000 = nodeCapacity:100000 - nodeReservation:35000 - systemUsageOrReserved:7000 - podHPUsed:33000", + Message: "batchAllocatable[CPU(Milli-Core)]:25000 = nodeCapacity:100000 - nodeSafetyMargin:35000 - systemUsageOrNodeReserved:7000 - podHPUsed:33000", }, { Name: extension.BatchMemory, Quantity: resource.NewScaledQuantity(33, 9), - Message: "batchAllocatable[Mem(GB)]:33 = nodeCapacity:120 - nodeReservation:42 - systemUsage:12 - podHPUsed:33", + Message: "batchAllocatable[Mem(GB)]:33 = nodeCapacity:120 - nodeSafetyMargin:42 - systemUsage:12 - podHPUsed:33", }, { Name: extension.MidCPU, @@ -1039,6 +1042,14 @@ func Test_calculateNodeResource(t *testing.T) { }, } + scheme := runtime.NewScheme() + clientgoscheme.AddToScheme(scheme) + slov1alpha1.AddToScheme(scheme) + schedulingv1alpha1.AddToScheme(scheme) + client := fake.NewClientBuilder().WithScheme(scheme).Build() + opt := framework.NewOption().WithClient(client).WithScheme(scheme).WithControllerBuilder(&builder.Builder{}) + framework.RunSetupExtenders(opt) + for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { memoryCalculateByReq := configuration.CalculateByPodRequest