diff --git a/pkg/scheduler/framework/plugins/noderesources/balanced_allocation_test.go b/pkg/scheduler/framework/plugins/noderesources/balanced_allocation_test.go index 5c1b545b080..557bd26de5e 100644 --- a/pkg/scheduler/framework/plugins/noderesources/balanced_allocation_test.go +++ b/pkg/scheduler/framework/plugins/noderesources/balanced_allocation_test.go @@ -149,7 +149,7 @@ func TestNodeResourcesBalancedAllocation(t *testing.T) { // Memory Fraction: 0 / 10000 = 0% // Node2 Score: (1-0) * MaxNodeScore = MaxNodeScore pod: &v1.Pod{Spec: noResources}, - nodes: []*v1.Node{makeNode("machine1", 4000, 10000), makeNode("machine2", 4000, 10000)}, + nodes: []*v1.Node{makeNode("machine1", 4000, 10000, nil), makeNode("machine2", 4000, 10000, nil)}, expectedList: []framework.NodeScore{{Name: "machine1", Score: framework.MaxNodeScore}, {Name: "machine2", Score: framework.MaxNodeScore}}, name: "nothing scheduled, nothing requested", args: config.NodeResourcesBalancedAllocationArgs{Resources: defaultResourceBalancedAllocationSet}, @@ -166,7 +166,7 @@ func TestNodeResourcesBalancedAllocation(t *testing.T) { // Node2 std: 0 // Node2 Score: (1-0) * MaxNodeScore = MaxNodeScore pod: &v1.Pod{Spec: cpuAndMemory}, - nodes: []*v1.Node{makeNode("machine1", 4000, 10000), makeNode("machine2", 6000, 10000)}, + nodes: []*v1.Node{makeNode("machine1", 4000, 10000, nil), makeNode("machine2", 6000, 10000, nil)}, expectedList: []framework.NodeScore{{Name: "machine1", Score: 87}, {Name: "machine2", Score: framework.MaxNodeScore}}, name: "nothing scheduled, resources requested, differently sized machines", args: config.NodeResourcesBalancedAllocationArgs{Resources: defaultResourceBalancedAllocationSet}, @@ -183,7 +183,7 @@ func TestNodeResourcesBalancedAllocation(t *testing.T) { // Node2 std: 0 // Node2 Score: (1-0) * MaxNodeScore = MaxNodeScore pod: &v1.Pod{Spec: noResources}, - nodes: []*v1.Node{makeNode("machine1", 4000, 10000), makeNode("machine2", 4000, 10000)}, + nodes: []*v1.Node{makeNode("machine1", 4000, 10000, nil), makeNode("machine2", 4000, 10000, nil)}, expectedList: []framework.NodeScore{{Name: "machine1", Score: framework.MaxNodeScore}, {Name: "machine2", Score: framework.MaxNodeScore}}, name: "no resources requested, pods without container scheduled", pods: []*v1.Pod{ @@ -206,7 +206,7 @@ func TestNodeResourcesBalancedAllocation(t *testing.T) { // Node2 std: (0 - 0) / 2 = 0 // Node2 Score: (1 - 0)*MaxNodeScore = 100 pod: &v1.Pod{Spec: nonZeroContainer}, - nodes: []*v1.Node{makeNode("machine1", 250, 1000*1024*1024), makeNode("machine2", 250, 1000*1024*1024)}, + nodes: []*v1.Node{makeNode("machine1", 250, 1000*1024*1024, nil), makeNode("machine2", 250, 1000*1024*1024, nil)}, expectedList: []framework.NodeScore{{Name: "machine1", Score: 100}, {Name: "machine2", Score: 100}}, name: "no resources requested, pods with container scheduled", pods: []*v1.Pod{ @@ -227,7 +227,7 @@ func TestNodeResourcesBalancedAllocation(t *testing.T) { // Node2 std: (0.6 - 0.25) / 2 = 0.175 // Node2 Score: (1 - 0.175)*MaxNodeScore = 82 pod: &v1.Pod{Spec: noResources}, - nodes: []*v1.Node{makeNode("machine1", 10000, 20000), makeNode("machine2", 10000, 20000)}, + nodes: []*v1.Node{makeNode("machine1", 10000, 20000, nil), makeNode("machine2", 10000, 20000, nil)}, expectedList: []framework.NodeScore{{Name: "machine1", Score: 70}, {Name: "machine2", Score: 82}}, name: "no resources requested, pods scheduled with resources", pods: []*v1.Pod{ @@ -250,7 +250,7 @@ func TestNodeResourcesBalancedAllocation(t *testing.T) { // Node2 std: (0.6 - 0.5) / 2 = 0.05 // Node2 Score: (1 - 0.05)*MaxNodeScore = 95 pod: &v1.Pod{Spec: cpuAndMemory}, - nodes: []*v1.Node{makeNode("machine1", 10000, 20000), makeNode("machine2", 10000, 20000)}, + nodes: []*v1.Node{makeNode("machine1", 10000, 20000, nil), makeNode("machine2", 10000, 20000, nil)}, expectedList: []framework.NodeScore{{Name: "machine1", Score: 82}, {Name: "machine2", Score: 95}}, name: "resources requested, pods scheduled with resources", pods: []*v1.Pod{ @@ -271,7 +271,7 @@ func TestNodeResourcesBalancedAllocation(t *testing.T) { // Node2 std: (0.6 - 0.2) / 2 = 0.2 // Node2 Score: (1 - 0.2)*MaxNodeScore = 80 pod: &v1.Pod{Spec: cpuAndMemory}, - nodes: []*v1.Node{makeNode("machine1", 10000, 20000), makeNode("machine2", 10000, 50000)}, + nodes: []*v1.Node{makeNode("machine1", 10000, 20000, nil), makeNode("machine2", 10000, 50000, nil)}, expectedList: []framework.NodeScore{{Name: "machine1", Score: 82}, {Name: "machine2", Score: 80}}, name: "resources requested, pods scheduled with resources, differently sized machines", pods: []*v1.Pod{ @@ -293,7 +293,7 @@ func TestNodeResourcesBalancedAllocation(t *testing.T) { // Node2 std: (1 - 0.5) / 2 = 0.25 // Node2 Score: (1 - 0.25)*MaxNodeScore = 75 pod: &v1.Pod{Spec: cpuOnly}, - nodes: []*v1.Node{makeNode("machine1", 6000, 10000), makeNode("machine2", 6000, 10000)}, + nodes: []*v1.Node{makeNode("machine1", 6000, 10000, nil), makeNode("machine2", 6000, 10000, nil)}, expectedList: []framework.NodeScore{{Name: "machine1", Score: 50}, {Name: "machine2", Score: 75}}, name: "requested resources at node capacity", pods: []*v1.Pod{ @@ -304,7 +304,7 @@ func TestNodeResourcesBalancedAllocation(t *testing.T) { }, { pod: &v1.Pod{Spec: noResources}, - nodes: []*v1.Node{makeNode("machine1", 0, 0), makeNode("machine2", 0, 0)}, + nodes: []*v1.Node{makeNode("machine1", 0, 0, nil), makeNode("machine2", 0, 0, nil)}, expectedList: []framework.NodeScore{{Name: "machine1", Score: 100}, {Name: "machine2", Score: 100}}, name: "zero node resources, pods scheduled with resources", pods: []*v1.Pod{ @@ -340,7 +340,7 @@ func TestNodeResourcesBalancedAllocation(t *testing.T) { }, }, }, - nodes: []*v1.Node{makeNodeWithExtendedResource("machine1", 3500, 40000, scalarResource), makeNodeWithExtendedResource("machine2", 3500, 40000, scalarResource)}, + nodes: []*v1.Node{makeNode("machine1", 3500, 40000, scalarResource), makeNode("machine2", 3500, 40000, scalarResource)}, expectedList: []framework.NodeScore{{Name: "machine1", Score: 70}, {Name: "machine2", Score: 65}}, name: "include scalar resource on a node for balanced resource allocation", pods: []*v1.Pod{ @@ -358,7 +358,7 @@ func TestNodeResourcesBalancedAllocation(t *testing.T) { // Node2: std = 0, score = 100 { pod: &v1.Pod{Spec: v1.PodSpec{Containers: []v1.Container{{}}}}, - nodes: []*v1.Node{makeNodeWithExtendedResource("machine1", 3500, 40000, scalarResource), makeNode("machine2", 3500, 40000)}, + nodes: []*v1.Node{makeNode("machine1", 3500, 40000, scalarResource), makeNode("machine2", 3500, 40000, nil)}, expectedList: []framework.NodeScore{{Name: "machine1", Score: 100}, {Name: "machine2", Score: 100}}, name: "node without the scalar resource results to a higher score", pods: []*v1.Pod{ diff --git a/pkg/scheduler/framework/plugins/noderesources/least_allocated.go b/pkg/scheduler/framework/plugins/noderesources/least_allocated.go index 4c80b4cf890..1abf97bc678 100644 --- a/pkg/scheduler/framework/plugins/noderesources/least_allocated.go +++ b/pkg/scheduler/framework/plugins/noderesources/least_allocated.go @@ -21,11 +21,11 @@ import ( ) // leastResourceScorer favors nodes with fewer requested resources. -// It calculates the percentage of memory and CPU requested by pods scheduled on the node, and +// It calculates the percentage of memory, CPU and other resources requested by pods scheduled on the node, and // prioritizes based on the minimum of the average of the fraction of requested to capacity. // // Details: -// (cpu((capacity-sum(requested))*MaxNodeScore/capacity) + memory((capacity-sum(requested))*MaxNodeScore/capacity))/weightSum +// (cpu((capacity-requested)*MaxNodeScore*cpuWeight/capacity) + memory((capacity-requested)*MaxNodeScore*memoryWeight/capacity) + ...)/weightSum func leastResourceScorer(resToWeightMap resourceToWeightMap) func(resourceToValueMap, resourceToValueMap) int64 { return func(requested, allocable resourceToValueMap) int64 { var nodeScore, weightSum int64 diff --git a/pkg/scheduler/framework/plugins/noderesources/requested_to_capacity_ratio_test.go b/pkg/scheduler/framework/plugins/noderesources/requested_to_capacity_ratio_test.go index 99e7cbecfd9..bb3733560b4 100644 --- a/pkg/scheduler/framework/plugins/noderesources/requested_to_capacity_ratio_test.go +++ b/pkg/scheduler/framework/plugins/noderesources/requested_to_capacity_ratio_test.go @@ -255,7 +255,7 @@ func TestResourceBinPackingSingleExtended(t *testing.T) { { // Node1 Score = Node2 Score = 0 as the incoming Pod doesn't request extended resource. pod: st.MakePod().Obj(), - nodes: []*v1.Node{makeNodeWithExtendedResource("machine1", 4000, 10000*1024*1024, extendedResource2), makeNodeWithExtendedResource("machine2", 4000, 10000*1024*1024, extendedResource1)}, + nodes: []*v1.Node{makeNode("machine1", 4000, 10000*1024*1024, extendedResource2), makeNode("machine2", 4000, 10000*1024*1024, extendedResource1)}, expectedScores: []framework.NodeScore{{Name: "machine1", Score: 0}, {Name: "machine2", Score: 0}}, name: "nothing scheduled, nothing requested", }, @@ -272,7 +272,7 @@ func TestResourceBinPackingSingleExtended(t *testing.T) { // = 2/4 * maxUtilization = 50 = rawScoringFunction(50) // Node2 Score: 5 pod: &v1.Pod{Spec: extendedResourcePod1}, - nodes: []*v1.Node{makeNodeWithExtendedResource("machine1", 4000, 10000*1024*1024, extendedResource2), makeNodeWithExtendedResource("machine2", 4000, 10000*1024*1024, extendedResource1)}, + nodes: []*v1.Node{makeNode("machine1", 4000, 10000*1024*1024, extendedResource2), makeNode("machine2", 4000, 10000*1024*1024, extendedResource1)}, expectedScores: []framework.NodeScore{{Name: "machine1", Score: 2}, {Name: "machine2", Score: 5}}, name: "resources requested, pods scheduled with less resources", pods: []*v1.Pod{ @@ -292,7 +292,7 @@ func TestResourceBinPackingSingleExtended(t *testing.T) { // = 4/4 * maxUtilization = maxUtilization = rawScoringFunction(maxUtilization) // Node2 Score: 10 pod: &v1.Pod{Spec: extendedResourcePod1}, - nodes: []*v1.Node{makeNodeWithExtendedResource("machine1", 4000, 10000*1024*1024, extendedResource2), makeNodeWithExtendedResource("machine2", 4000, 10000*1024*1024, extendedResource1)}, + nodes: []*v1.Node{makeNode("machine1", 4000, 10000*1024*1024, extendedResource2), makeNode("machine2", 4000, 10000*1024*1024, extendedResource1)}, expectedScores: []framework.NodeScore{{Name: "machine1", Score: 2}, {Name: "machine2", Score: 10}}, name: "resources requested, pods scheduled with resources, on node with existing pod running ", pods: []*v1.Pod{ @@ -312,7 +312,7 @@ func TestResourceBinPackingSingleExtended(t *testing.T) { // = 4/4 * maxUtilization = maxUtilization = rawScoringFunction(maxUtilization) // Node2 Score: 10 pod: &v1.Pod{Spec: extendedResourcePod2}, - nodes: []*v1.Node{makeNodeWithExtendedResource("machine1", 4000, 10000*1024*1024, extendedResource2), makeNodeWithExtendedResource("machine2", 4000, 10000*1024*1024, extendedResource1)}, + nodes: []*v1.Node{makeNode("machine1", 4000, 10000*1024*1024, extendedResource2), makeNode("machine2", 4000, 10000*1024*1024, extendedResource1)}, expectedScores: []framework.NodeScore{{Name: "machine1", Score: 5}, {Name: "machine2", Score: 10}}, name: "resources requested, pods scheduled with more resources", pods: []*v1.Pod{ @@ -436,7 +436,7 @@ func TestResourceBinPackingMultipleExtended(t *testing.T) { // Node2 Score: (0 * 3) + (0 * 5) / 8 = 0 pod: st.MakePod().Obj(), - nodes: []*v1.Node{makeNodeWithExtendedResource("machine1", 4000, 10000*1024*1024, extendedResources2), makeNodeWithExtendedResource("machine2", 4000, 10000*1024*1024, extendedResources1)}, + nodes: []*v1.Node{makeNode("machine1", 4000, 10000*1024*1024, extendedResources2), makeNode("machine2", 4000, 10000*1024*1024, extendedResources1)}, expectedScores: []framework.NodeScore{{Name: "machine1", Score: 0}, {Name: "machine2", Score: 0}}, name: "nothing scheduled, nothing requested", }, @@ -470,7 +470,7 @@ func TestResourceBinPackingMultipleExtended(t *testing.T) { // Node2 Score: (5 * 3) + (2 * 5) / 8 = 3 pod: &v1.Pod{Spec: extnededResourcePod1}, - nodes: []*v1.Node{makeNodeWithExtendedResource("machine1", 4000, 10000*1024*1024, extendedResources2), makeNodeWithExtendedResource("machine2", 4000, 10000*1024*1024, extendedResources1)}, + nodes: []*v1.Node{makeNode("machine1", 4000, 10000*1024*1024, extendedResources2), makeNode("machine2", 4000, 10000*1024*1024, extendedResources1)}, expectedScores: []framework.NodeScore{{Name: "machine1", Score: 4}, {Name: "machine2", Score: 3}}, name: "resources requested, pods scheduled with less resources", pods: []*v1.Pod{ @@ -506,7 +506,7 @@ func TestResourceBinPackingMultipleExtended(t *testing.T) { // Node2 Score: (10 * 3) + (5 * 5) / 8 = 7 pod: &v1.Pod{Spec: extnededResourcePod1}, - nodes: []*v1.Node{makeNodeWithExtendedResource("machine1", 4000, 10000*1024*1024, extendedResources2), makeNodeWithExtendedResource("machine2", 4000, 10000*1024*1024, extendedResources1)}, + nodes: []*v1.Node{makeNode("machine1", 4000, 10000*1024*1024, extendedResources2), makeNode("machine2", 4000, 10000*1024*1024, extendedResources1)}, expectedScores: []framework.NodeScore{{Name: "machine1", Score: 4}, {Name: "machine2", Score: 7}}, name: "resources requested, pods scheduled with resources, on node with existing pod running ", pods: []*v1.Pod{ @@ -557,7 +557,7 @@ func TestResourceBinPackingMultipleExtended(t *testing.T) { // Node2 Score: (10 * 3) + (2 * 5) / 8 = 5 pod: &v1.Pod{Spec: extnededResourcePod2}, - nodes: []*v1.Node{makeNodeWithExtendedResource("machine1", 4000, 10000*1024*1024, extendedResources2), makeNodeWithExtendedResource("machine2", 4000, 10000*1024*1024, extendedResources1)}, + nodes: []*v1.Node{makeNode("machine1", 4000, 10000*1024*1024, extendedResources2), makeNode("machine2", 4000, 10000*1024*1024, extendedResources1)}, expectedScores: []framework.NodeScore{{Name: "machine1", Score: 5}, {Name: "machine2", Score: 5}}, name: "resources requested, pods scheduled with more resources", pods: []*v1.Pod{ diff --git a/pkg/scheduler/framework/plugins/noderesources/test_util.go b/pkg/scheduler/framework/plugins/noderesources/test_util.go index 84058b108d7..521d3c218d1 100644 --- a/pkg/scheduler/framework/plugins/noderesources/test_util.go +++ b/pkg/scheduler/framework/plugins/noderesources/test_util.go @@ -28,23 +28,7 @@ var ( ignoreBadValueDetail = cmpopts.IgnoreFields(field.Error{}, "BadValue", "Detail") ) -func makeNode(node string, milliCPU, memory int64) *v1.Node { - return &v1.Node{ - ObjectMeta: metav1.ObjectMeta{Name: node}, - Status: v1.NodeStatus{ - Capacity: v1.ResourceList{ - v1.ResourceCPU: *resource.NewMilliQuantity(milliCPU, resource.DecimalSI), - v1.ResourceMemory: *resource.NewQuantity(memory, resource.BinarySI), - }, - Allocatable: v1.ResourceList{ - v1.ResourceCPU: *resource.NewMilliQuantity(milliCPU, resource.DecimalSI), - v1.ResourceMemory: *resource.NewQuantity(memory, resource.BinarySI), - }, - }, - } -} - -func makeNodeWithExtendedResource(node string, milliCPU, memory int64, extendedResource map[string]int64) *v1.Node { +func makeNode(node string, milliCPU, memory int64, extendedResource map[string]int64) *v1.Node { resourceList := make(map[v1.ResourceName]resource.Quantity) for res, quantity := range extendedResource { resourceList[v1.ResourceName(res)] = *resource.NewQuantity(quantity, resource.DecimalSI)