Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
bac056d5
Commit
bac056d5
authored
Dec 17, 2015
by
k8s-merge-robot
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #18493 from brendandburns/scheduler5
Auto commit by PR queue bot
parents
0b932384
0ee0e16b
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
74 additions
and
36 deletions
+74
-36
priorities.go
plugin/pkg/scheduler/algorithm/priorities/priorities.go
+5
-8
priorities_test.go
plugin/pkg/scheduler/algorithm/priorities/priorities_test.go
+17
-3
selector_spreading.go
.../pkg/scheduler/algorithm/priorities/selector_spreading.go
+2
-2
selector_spreading_test.go
...scheduler/algorithm/priorities/selector_spreading_test.go
+16
-3
types.go
plugin/pkg/scheduler/algorithm/types.go
+1
-1
extender_test.go
plugin/pkg/scheduler/extender_test.go
+1
-1
factory_test.go
plugin/pkg/scheduler/factory/factory_test.go
+2
-2
generic_scheduler.go
plugin/pkg/scheduler/generic_scheduler.go
+15
-11
generic_scheduler_test.go
plugin/pkg/scheduler/generic_scheduler_test.go
+15
-5
No files found.
plugin/pkg/scheduler/algorithm/priorities/priorities.go
View file @
bac056d5
...
@@ -24,7 +24,6 @@ import (
...
@@ -24,7 +24,6 @@ import (
"k8s.io/kubernetes/pkg/api/resource"
"k8s.io/kubernetes/pkg/api/resource"
"k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/plugin/pkg/scheduler/algorithm"
"k8s.io/kubernetes/plugin/pkg/scheduler/algorithm"
"k8s.io/kubernetes/plugin/pkg/scheduler/algorithm/predicates"
schedulerapi
"k8s.io/kubernetes/plugin/pkg/scheduler/api"
schedulerapi
"k8s.io/kubernetes/plugin/pkg/scheduler/api"
)
)
...
@@ -115,16 +114,15 @@ func calculateResourceOccupancy(pod *api.Pod, node api.Node, pods []*api.Pod) sc
...
@@ -115,16 +114,15 @@ func calculateResourceOccupancy(pod *api.Pod, node api.Node, pods []*api.Pod) sc
// It calculates the percentage of memory and CPU requested by pods scheduled on the node, and prioritizes
// It calculates the percentage of memory and CPU requested by pods scheduled on the node, and prioritizes
// based on the minimum of the average of the fraction of requested to capacity.
// based on the minimum of the average of the fraction of requested to capacity.
// Details: cpu((capacity - sum(requested)) * 10 / capacity) + memory((capacity - sum(requested)) * 10 / capacity) / 2
// Details: cpu((capacity - sum(requested)) * 10 / capacity) + memory((capacity - sum(requested)) * 10 / capacity) / 2
func
LeastRequestedPriority
(
pod
*
api
.
Pod
,
podLister
algorithm
.
PodLister
,
nodeLister
algorithm
.
NodeLister
)
(
schedulerapi
.
HostPriorityList
,
error
)
{
func
LeastRequestedPriority
(
pod
*
api
.
Pod
,
machinesToPods
map
[
string
][]
*
api
.
Pod
,
podLister
algorithm
.
PodLister
,
nodeLister
algorithm
.
NodeLister
)
(
schedulerapi
.
HostPriorityList
,
error
)
{
nodes
,
err
:=
nodeLister
.
List
()
nodes
,
err
:=
nodeLister
.
List
()
if
err
!=
nil
{
if
err
!=
nil
{
return
schedulerapi
.
HostPriorityList
{},
err
return
schedulerapi
.
HostPriorityList
{},
err
}
}
podsToMachines
,
err
:=
predicates
.
MapPodsToMachines
(
podLister
)
list
:=
schedulerapi
.
HostPriorityList
{}
list
:=
schedulerapi
.
HostPriorityList
{}
for
_
,
node
:=
range
nodes
.
Items
{
for
_
,
node
:=
range
nodes
.
Items
{
list
=
append
(
list
,
calculateResourceOccupancy
(
pod
,
node
,
podsToMachine
s
[
node
.
Name
]))
list
=
append
(
list
,
calculateResourceOccupancy
(
pod
,
node
,
machinesToPod
s
[
node
.
Name
]))
}
}
return
list
,
nil
return
list
,
nil
}
}
...
@@ -145,7 +143,7 @@ func NewNodeLabelPriority(label string, presence bool) algorithm.PriorityFunctio
...
@@ -145,7 +143,7 @@ func NewNodeLabelPriority(label string, presence bool) algorithm.PriorityFunctio
// CalculateNodeLabelPriority checks whether a particular label exists on a node or not, regardless of its value.
// CalculateNodeLabelPriority checks whether a particular label exists on a node or not, regardless of its value.
// If presence is true, prioritizes nodes that have the specified label, regardless of value.
// If presence is true, prioritizes nodes that have the specified label, regardless of value.
// If presence is false, prioritizes nodes that do not have the specified label.
// If presence is false, prioritizes nodes that do not have the specified label.
func
(
n
*
NodeLabelPrioritizer
)
CalculateNodeLabelPriority
(
pod
*
api
.
Pod
,
podLister
algorithm
.
PodLister
,
nodeLister
algorithm
.
NodeLister
)
(
schedulerapi
.
HostPriorityList
,
error
)
{
func
(
n
*
NodeLabelPrioritizer
)
CalculateNodeLabelPriority
(
pod
*
api
.
Pod
,
machinesToPods
map
[
string
][]
*
api
.
Pod
,
podLister
algorithm
.
PodLister
,
nodeLister
algorithm
.
NodeLister
)
(
schedulerapi
.
HostPriorityList
,
error
)
{
var
score
int
var
score
int
nodes
,
err
:=
nodeLister
.
List
()
nodes
,
err
:=
nodeLister
.
List
()
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -178,16 +176,15 @@ func (n *NodeLabelPrioritizer) CalculateNodeLabelPriority(pod *api.Pod, podListe
...
@@ -178,16 +176,15 @@ func (n *NodeLabelPrioritizer) CalculateNodeLabelPriority(pod *api.Pod, podListe
// close the two metrics are to each other.
// close the two metrics are to each other.
// Detail: score = 10 - abs(cpuFraction-memoryFraction)*10. The algorithm is partly inspired by:
// Detail: score = 10 - abs(cpuFraction-memoryFraction)*10. The algorithm is partly inspired by:
// "Wei Huang et al. An Energy Efficient Virtual Machine Placement Algorithm with Balanced Resource Utilization"
// "Wei Huang et al. An Energy Efficient Virtual Machine Placement Algorithm with Balanced Resource Utilization"
func
BalancedResourceAllocation
(
pod
*
api
.
Pod
,
podLister
algorithm
.
PodLister
,
nodeLister
algorithm
.
NodeLister
)
(
schedulerapi
.
HostPriorityList
,
error
)
{
func
BalancedResourceAllocation
(
pod
*
api
.
Pod
,
machinesToPods
map
[
string
][]
*
api
.
Pod
,
podLister
algorithm
.
PodLister
,
nodeLister
algorithm
.
NodeLister
)
(
schedulerapi
.
HostPriorityList
,
error
)
{
nodes
,
err
:=
nodeLister
.
List
()
nodes
,
err
:=
nodeLister
.
List
()
if
err
!=
nil
{
if
err
!=
nil
{
return
schedulerapi
.
HostPriorityList
{},
err
return
schedulerapi
.
HostPriorityList
{},
err
}
}
podsToMachines
,
err
:=
predicates
.
MapPodsToMachines
(
podLister
)
list
:=
schedulerapi
.
HostPriorityList
{}
list
:=
schedulerapi
.
HostPriorityList
{}
for
_
,
node
:=
range
nodes
.
Items
{
for
_
,
node
:=
range
nodes
.
Items
{
list
=
append
(
list
,
calculateBalancedResourceAllocation
(
pod
,
node
,
podsToMachine
s
[
node
.
Name
]))
list
=
append
(
list
,
calculateBalancedResourceAllocation
(
pod
,
node
,
machinesToPod
s
[
node
.
Name
]))
}
}
return
list
,
nil
return
list
,
nil
}
}
...
...
plugin/pkg/scheduler/algorithm/priorities/priorities_test.go
View file @
bac056d5
...
@@ -26,6 +26,7 @@ import (
...
@@ -26,6 +26,7 @@ import (
"k8s.io/kubernetes/pkg/api/resource"
"k8s.io/kubernetes/pkg/api/resource"
"k8s.io/kubernetes/plugin/pkg/scheduler"
"k8s.io/kubernetes/plugin/pkg/scheduler"
"k8s.io/kubernetes/plugin/pkg/scheduler/algorithm"
"k8s.io/kubernetes/plugin/pkg/scheduler/algorithm"
"k8s.io/kubernetes/plugin/pkg/scheduler/algorithm/predicates"
schedulerapi
"k8s.io/kubernetes/plugin/pkg/scheduler/api"
schedulerapi
"k8s.io/kubernetes/plugin/pkg/scheduler/api"
)
)
...
@@ -127,8 +128,13 @@ func TestZeroRequest(t *testing.T) {
...
@@ -127,8 +128,13 @@ func TestZeroRequest(t *testing.T) {
const
expectedPriority
int
=
25
const
expectedPriority
int
=
25
for
_
,
test
:=
range
tests
{
for
_
,
test
:=
range
tests
{
m2p
,
err
:=
predicates
.
MapPodsToMachines
(
algorithm
.
FakePodLister
(
test
.
pods
))
if
err
!=
nil
{
t
.
Errorf
(
"unexpected error: %v"
,
err
)
}
list
,
err
:=
scheduler
.
PrioritizeNodes
(
list
,
err
:=
scheduler
.
PrioritizeNodes
(
test
.
pod
,
test
.
pod
,
m2p
,
algorithm
.
FakePodLister
(
test
.
pods
),
algorithm
.
FakePodLister
(
test
.
pods
),
// This should match the configuration in defaultPriorities() in
// This should match the configuration in defaultPriorities() in
// plugin/pkg/scheduler/algorithmprovider/defaults/defaults.go if you want
// plugin/pkg/scheduler/algorithmprovider/defaults/defaults.go if you want
...
@@ -377,7 +383,11 @@ func TestLeastRequested(t *testing.T) {
...
@@ -377,7 +383,11 @@ func TestLeastRequested(t *testing.T) {
}
}
for
_
,
test
:=
range
tests
{
for
_
,
test
:=
range
tests
{
list
,
err
:=
LeastRequestedPriority
(
test
.
pod
,
algorithm
.
FakePodLister
(
test
.
pods
),
algorithm
.
FakeNodeLister
(
api
.
NodeList
{
Items
:
test
.
nodes
}))
m2p
,
err
:=
predicates
.
MapPodsToMachines
(
algorithm
.
FakePodLister
(
test
.
pods
))
if
err
!=
nil
{
t
.
Errorf
(
"unexpected error: %v"
,
err
)
}
list
,
err
:=
LeastRequestedPriority
(
test
.
pod
,
m2p
,
algorithm
.
FakePodLister
(
test
.
pods
),
algorithm
.
FakeNodeLister
(
api
.
NodeList
{
Items
:
test
.
nodes
}))
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Errorf
(
"unexpected error: %v"
,
err
)
t
.
Errorf
(
"unexpected error: %v"
,
err
)
}
}
...
@@ -471,7 +481,7 @@ func TestNewNodeLabelPriority(t *testing.T) {
...
@@ -471,7 +481,7 @@ func TestNewNodeLabelPriority(t *testing.T) {
label
:
test
.
label
,
label
:
test
.
label
,
presence
:
test
.
presence
,
presence
:
test
.
presence
,
}
}
list
,
err
:=
prioritizer
.
CalculateNodeLabelPriority
(
nil
,
nil
,
algorithm
.
FakeNodeLister
(
api
.
NodeList
{
Items
:
test
.
nodes
}))
list
,
err
:=
prioritizer
.
CalculateNodeLabelPriority
(
nil
,
map
[
string
][]
*
api
.
Pod
{},
nil
,
algorithm
.
FakeNodeLister
(
api
.
NodeList
{
Items
:
test
.
nodes
}))
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Errorf
(
"unexpected error: %v"
,
err
)
t
.
Errorf
(
"unexpected error: %v"
,
err
)
}
}
...
@@ -709,7 +719,11 @@ func TestBalancedResourceAllocation(t *testing.T) {
...
@@ -709,7 +719,11 @@ func TestBalancedResourceAllocation(t *testing.T) {
}
}
for
_
,
test
:=
range
tests
{
for
_
,
test
:=
range
tests
{
list
,
err
:=
BalancedResourceAllocation
(
test
.
pod
,
algorithm
.
FakePodLister
(
test
.
pods
),
algorithm
.
FakeNodeLister
(
api
.
NodeList
{
Items
:
test
.
nodes
}))
m2p
,
err
:=
predicates
.
MapPodsToMachines
(
algorithm
.
FakePodLister
(
test
.
pods
))
if
err
!=
nil
{
t
.
Errorf
(
"unexpected error: %v"
,
err
)
}
list
,
err
:=
BalancedResourceAllocation
(
test
.
pod
,
m2p
,
algorithm
.
FakePodLister
(
test
.
pods
),
algorithm
.
FakeNodeLister
(
api
.
NodeList
{
Items
:
test
.
nodes
}))
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Errorf
(
"unexpected error: %v"
,
err
)
t
.
Errorf
(
"unexpected error: %v"
,
err
)
}
}
...
...
plugin/pkg/scheduler/algorithm/priorities/selector_spreading.go
View file @
bac056d5
...
@@ -73,7 +73,7 @@ func getZoneKey(node *api.Node) string {
...
@@ -73,7 +73,7 @@ func getZoneKey(node *api.Node) string {
// i.e. it pushes the scheduler towards a node where there's the smallest number of
// i.e. it pushes the scheduler towards a node where there's the smallest number of
// pods which match the same service selectors or RC selectors as the pod being scheduled.
// pods which match the same service selectors or RC selectors as the pod being scheduled.
// Where zone information is included on the nodes, it favors nodes in zones with fewer existing matching pods.
// Where zone information is included on the nodes, it favors nodes in zones with fewer existing matching pods.
func
(
s
*
SelectorSpread
)
CalculateSpreadPriority
(
pod
*
api
.
Pod
,
podLister
algorithm
.
PodLister
,
nodeLister
algorithm
.
NodeLister
)
(
schedulerapi
.
HostPriorityList
,
error
)
{
func
(
s
*
SelectorSpread
)
CalculateSpreadPriority
(
pod
*
api
.
Pod
,
machinesToPods
map
[
string
][]
*
api
.
Pod
,
podLister
algorithm
.
PodLister
,
nodeLister
algorithm
.
NodeLister
)
(
schedulerapi
.
HostPriorityList
,
error
)
{
var
nsPods
[]
*
api
.
Pod
var
nsPods
[]
*
api
.
Pod
selectors
:=
make
([]
labels
.
Selector
,
0
)
selectors
:=
make
([]
labels
.
Selector
,
0
)
...
@@ -213,7 +213,7 @@ func NewServiceAntiAffinityPriority(serviceLister algorithm.ServiceLister, label
...
@@ -213,7 +213,7 @@ func NewServiceAntiAffinityPriority(serviceLister algorithm.ServiceLister, label
// CalculateAntiAffinityPriority spreads pods by minimizing the number of pods belonging to the same service
// CalculateAntiAffinityPriority spreads pods by minimizing the number of pods belonging to the same service
// on machines with the same value for a particular label.
// on machines with the same value for a particular label.
// The label to be considered is provided to the struct (ServiceAntiAffinity).
// The label to be considered is provided to the struct (ServiceAntiAffinity).
func
(
s
*
ServiceAntiAffinity
)
CalculateAntiAffinityPriority
(
pod
*
api
.
Pod
,
podLister
algorithm
.
PodLister
,
nodeLister
algorithm
.
NodeLister
)
(
schedulerapi
.
HostPriorityList
,
error
)
{
func
(
s
*
ServiceAntiAffinity
)
CalculateAntiAffinityPriority
(
pod
*
api
.
Pod
,
machinesToPods
map
[
string
][]
*
api
.
Pod
,
podLister
algorithm
.
PodLister
,
nodeLister
algorithm
.
NodeLister
)
(
schedulerapi
.
HostPriorityList
,
error
)
{
var
nsServicePods
[]
*
api
.
Pod
var
nsServicePods
[]
*
api
.
Pod
services
,
err
:=
s
.
serviceLister
.
GetPodServices
(
pod
)
services
,
err
:=
s
.
serviceLister
.
GetPodServices
(
pod
)
...
...
plugin/pkg/scheduler/algorithm/priorities/selector_spreading_test.go
View file @
bac056d5
...
@@ -24,6 +24,7 @@ import (
...
@@ -24,6 +24,7 @@ import (
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api"
wellknownlabels
"k8s.io/kubernetes/pkg/api/unversioned"
wellknownlabels
"k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/plugin/pkg/scheduler/algorithm"
"k8s.io/kubernetes/plugin/pkg/scheduler/algorithm"
"k8s.io/kubernetes/plugin/pkg/scheduler/algorithm/predicates"
schedulerapi
"k8s.io/kubernetes/plugin/pkg/scheduler/api"
schedulerapi
"k8s.io/kubernetes/plugin/pkg/scheduler/api"
)
)
...
@@ -218,8 +219,12 @@ func TestSelectorSpreadPriority(t *testing.T) {
...
@@ -218,8 +219,12 @@ func TestSelectorSpreadPriority(t *testing.T) {
}
}
for
_
,
test
:=
range
tests
{
for
_
,
test
:=
range
tests
{
m2p
,
err
:=
predicates
.
MapPodsToMachines
(
algorithm
.
FakePodLister
(
test
.
pods
))
if
err
!=
nil
{
t
.
Errorf
(
"unexpected error: %v"
,
err
)
}
selectorSpread
:=
SelectorSpread
{
serviceLister
:
algorithm
.
FakeServiceLister
(
test
.
services
),
controllerLister
:
algorithm
.
FakeControllerLister
(
test
.
rcs
)}
selectorSpread
:=
SelectorSpread
{
serviceLister
:
algorithm
.
FakeServiceLister
(
test
.
services
),
controllerLister
:
algorithm
.
FakeControllerLister
(
test
.
rcs
)}
list
,
err
:=
selectorSpread
.
CalculateSpreadPriority
(
test
.
pod
,
algorithm
.
FakePodLister
(
test
.
pods
),
algorithm
.
FakeNodeLister
(
makeNodeList
(
test
.
nodes
)))
list
,
err
:=
selectorSpread
.
CalculateSpreadPriority
(
test
.
pod
,
m2p
,
algorithm
.
FakePodLister
(
test
.
pods
),
algorithm
.
FakeNodeLister
(
makeNodeList
(
test
.
nodes
)))
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Errorf
(
"unexpected error: %v"
,
err
)
t
.
Errorf
(
"unexpected error: %v"
,
err
)
}
}
...
@@ -418,7 +423,11 @@ func TestZoneSelectorSpreadPriority(t *testing.T) {
...
@@ -418,7 +423,11 @@ func TestZoneSelectorSpreadPriority(t *testing.T) {
for
_
,
test
:=
range
tests
{
for
_
,
test
:=
range
tests
{
selectorSpread
:=
SelectorSpread
{
serviceLister
:
algorithm
.
FakeServiceLister
(
test
.
services
),
controllerLister
:
algorithm
.
FakeControllerLister
(
test
.
rcs
)}
selectorSpread
:=
SelectorSpread
{
serviceLister
:
algorithm
.
FakeServiceLister
(
test
.
services
),
controllerLister
:
algorithm
.
FakeControllerLister
(
test
.
rcs
)}
list
,
err
:=
selectorSpread
.
CalculateSpreadPriority
(
test
.
pod
,
algorithm
.
FakePodLister
(
test
.
pods
),
algorithm
.
FakeNodeLister
(
makeLabeledNodeList
(
labeledNodes
)))
m2p
,
err
:=
predicates
.
MapPodsToMachines
(
algorithm
.
FakePodLister
(
test
.
pods
))
if
err
!=
nil
{
t
.
Errorf
(
"unexpected error: %v"
,
err
)
}
list
,
err
:=
selectorSpread
.
CalculateSpreadPriority
(
test
.
pod
,
m2p
,
algorithm
.
FakePodLister
(
test
.
pods
),
algorithm
.
FakeNodeLister
(
makeLabeledNodeList
(
labeledNodes
)))
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Errorf
(
"unexpected error: %v"
,
err
)
t
.
Errorf
(
"unexpected error: %v"
,
err
)
}
}
...
@@ -588,8 +597,12 @@ func TestZoneSpreadPriority(t *testing.T) {
...
@@ -588,8 +597,12 @@ func TestZoneSpreadPriority(t *testing.T) {
}
}
for
_
,
test
:=
range
tests
{
for
_
,
test
:=
range
tests
{
m2p
,
err
:=
predicates
.
MapPodsToMachines
(
algorithm
.
FakePodLister
(
test
.
pods
))
if
err
!=
nil
{
t
.
Errorf
(
"unexpected error: %v"
,
err
)
}
zoneSpread
:=
ServiceAntiAffinity
{
serviceLister
:
algorithm
.
FakeServiceLister
(
test
.
services
),
label
:
"zone"
}
zoneSpread
:=
ServiceAntiAffinity
{
serviceLister
:
algorithm
.
FakeServiceLister
(
test
.
services
),
label
:
"zone"
}
list
,
err
:=
zoneSpread
.
CalculateAntiAffinityPriority
(
test
.
pod
,
algorithm
.
FakePodLister
(
test
.
pods
),
algorithm
.
FakeNodeLister
(
makeLabeledNodeList
(
test
.
nodes
)))
list
,
err
:=
zoneSpread
.
CalculateAntiAffinityPriority
(
test
.
pod
,
m2p
,
algorithm
.
FakePodLister
(
test
.
pods
),
algorithm
.
FakeNodeLister
(
makeLabeledNodeList
(
test
.
nodes
)))
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Errorf
(
"unexpected error: %v"
,
err
)
t
.
Errorf
(
"unexpected error: %v"
,
err
)
}
}
...
...
plugin/pkg/scheduler/algorithm/types.go
View file @
bac056d5
...
@@ -24,7 +24,7 @@ import (
...
@@ -24,7 +24,7 @@ import (
// FitPredicate is a function that indicates if a pod fits into an existing node.
// FitPredicate is a function that indicates if a pod fits into an existing node.
type
FitPredicate
func
(
pod
*
api
.
Pod
,
existingPods
[]
*
api
.
Pod
,
node
string
)
(
bool
,
error
)
type
FitPredicate
func
(
pod
*
api
.
Pod
,
existingPods
[]
*
api
.
Pod
,
node
string
)
(
bool
,
error
)
type
PriorityFunction
func
(
pod
*
api
.
Pod
,
podLister
PodLister
,
nodeLister
NodeLister
)
(
schedulerapi
.
HostPriorityList
,
error
)
type
PriorityFunction
func
(
pod
*
api
.
Pod
,
machineToPods
map
[
string
][]
*
api
.
Pod
,
podLister
PodLister
,
nodeLister
NodeLister
)
(
schedulerapi
.
HostPriorityList
,
error
)
type
PriorityConfig
struct
{
type
PriorityConfig
struct
{
Function
PriorityFunction
Function
PriorityFunction
...
...
plugin/pkg/scheduler/extender_test.go
View file @
bac056d5
...
@@ -88,7 +88,7 @@ func machine2PrioritizerExtender(pod *api.Pod, nodes *api.NodeList) (*schedulera
...
@@ -88,7 +88,7 @@ func machine2PrioritizerExtender(pod *api.Pod, nodes *api.NodeList) (*schedulera
return
&
result
,
nil
return
&
result
,
nil
}
}
func
machine2Prioritizer
(
_
*
api
.
Pod
,
podLister
algorithm
.
PodLister
,
nodeLister
algorithm
.
NodeLister
)
(
schedulerapi
.
HostPriorityList
,
error
)
{
func
machine2Prioritizer
(
_
*
api
.
Pod
,
machineToPods
map
[
string
][]
*
api
.
Pod
,
podLister
algorithm
.
PodLister
,
nodeLister
algorithm
.
NodeLister
)
(
schedulerapi
.
HostPriorityList
,
error
)
{
nodes
,
err
:=
nodeLister
.
List
()
nodes
,
err
:=
nodeLister
.
List
()
if
err
!=
nil
{
if
err
!=
nil
{
return
[]
schedulerapi
.
HostPriority
{},
err
return
[]
schedulerapi
.
HostPriority
{},
err
...
...
plugin/pkg/scheduler/factory/factory_test.go
View file @
bac056d5
...
@@ -124,11 +124,11 @@ func PredicateTwo(pod *api.Pod, existingPods []*api.Pod, node string) (bool, err
...
@@ -124,11 +124,11 @@ func PredicateTwo(pod *api.Pod, existingPods []*api.Pod, node string) (bool, err
return
true
,
nil
return
true
,
nil
}
}
func
PriorityOne
(
pod
*
api
.
Pod
,
podLister
algorithm
.
PodLister
,
nodeLister
algorithm
.
NodeLister
)
(
schedulerapi
.
HostPriorityList
,
error
)
{
func
PriorityOne
(
pod
*
api
.
Pod
,
m2p
map
[
string
][]
*
api
.
Pod
,
podLister
algorithm
.
PodLister
,
nodeLister
algorithm
.
NodeLister
)
(
schedulerapi
.
HostPriorityList
,
error
)
{
return
[]
schedulerapi
.
HostPriority
{},
nil
return
[]
schedulerapi
.
HostPriority
{},
nil
}
}
func
PriorityTwo
(
pod
*
api
.
Pod
,
podLister
algorithm
.
PodLister
,
nodeLister
algorithm
.
NodeLister
)
(
schedulerapi
.
HostPriorityList
,
error
)
{
func
PriorityTwo
(
pod
*
api
.
Pod
,
m2p
map
[
string
][]
*
api
.
Pod
,
podLister
algorithm
.
PodLister
,
nodeLister
algorithm
.
NodeLister
)
(
schedulerapi
.
HostPriorityList
,
error
)
{
return
[]
schedulerapi
.
HostPriority
{},
nil
return
[]
schedulerapi
.
HostPriority
{},
nil
}
}
...
...
plugin/pkg/scheduler/generic_scheduler.go
View file @
bac056d5
...
@@ -71,12 +71,19 @@ func (g *genericScheduler) Schedule(pod *api.Pod, nodeLister algorithm.NodeListe
...
@@ -71,12 +71,19 @@ func (g *genericScheduler) Schedule(pod *api.Pod, nodeLister algorithm.NodeListe
return
""
,
ErrNoNodesAvailable
return
""
,
ErrNoNodesAvailable
}
}
filteredNodes
,
failedPredicateMap
,
err
:=
findNodesThatFit
(
pod
,
g
.
pods
,
g
.
predicates
,
nodes
,
g
.
extenders
)
// TODO: we should compute this once and dynamically update it using Watch, not constantly re-compute.
// But at least we're now only doing it in one place
machinesToPods
,
err
:=
predicates
.
MapPodsToMachines
(
g
.
pods
)
if
err
!=
nil
{
if
err
!=
nil
{
return
""
,
err
return
""
,
err
}
}
priorityList
,
err
:=
PrioritizeNodes
(
pod
,
g
.
pods
,
g
.
prioritizers
,
algorithm
.
FakeNodeLister
(
filteredNodes
),
g
.
extenders
)
filteredNodes
,
failedPredicateMap
,
err
:=
findNodesThatFit
(
pod
,
machinesToPods
,
g
.
predicates
,
nodes
,
g
.
extenders
)
if
err
!=
nil
{
return
""
,
err
}
priorityList
,
err
:=
PrioritizeNodes
(
pod
,
machinesToPods
,
g
.
pods
,
g
.
prioritizers
,
algorithm
.
FakeNodeLister
(
filteredNodes
),
g
.
extenders
)
if
err
!=
nil
{
if
err
!=
nil
{
return
""
,
err
return
""
,
err
}
}
...
@@ -108,13 +115,10 @@ func (g *genericScheduler) selectHost(priorityList schedulerapi.HostPriorityList
...
@@ -108,13 +115,10 @@ func (g *genericScheduler) selectHost(priorityList schedulerapi.HostPriorityList
// Filters the nodes to find the ones that fit based on the given predicate functions
// Filters the nodes to find the ones that fit based on the given predicate functions
// Each node is passed through the predicate functions to determine if it is a fit
// Each node is passed through the predicate functions to determine if it is a fit
func
findNodesThatFit
(
pod
*
api
.
Pod
,
podLister
algorithm
.
PodLister
,
predicateFuncs
map
[
string
]
algorithm
.
FitPredicate
,
nodes
api
.
NodeList
,
extenders
[]
algorithm
.
SchedulerExtender
)
(
api
.
NodeList
,
FailedPredicateMap
,
error
)
{
func
findNodesThatFit
(
pod
*
api
.
Pod
,
machineToPods
map
[
string
][]
*
api
.
Pod
,
predicateFuncs
map
[
string
]
algorithm
.
FitPredicate
,
nodes
api
.
NodeList
,
extenders
[]
algorithm
.
SchedulerExtender
)
(
api
.
NodeList
,
FailedPredicateMap
,
error
)
{
filtered
:=
[]
api
.
Node
{}
filtered
:=
[]
api
.
Node
{}
machineToPods
,
err
:=
predicates
.
MapPodsToMachines
(
podLister
)
failedPredicateMap
:=
FailedPredicateMap
{}
failedPredicateMap
:=
FailedPredicateMap
{}
if
err
!=
nil
{
return
api
.
NodeList
{},
FailedPredicateMap
{},
err
}
for
_
,
node
:=
range
nodes
.
Items
{
for
_
,
node
:=
range
nodes
.
Items
{
fits
:=
true
fits
:=
true
for
name
,
predicate
:=
range
predicateFuncs
{
for
name
,
predicate
:=
range
predicateFuncs
{
...
@@ -161,13 +165,13 @@ func findNodesThatFit(pod *api.Pod, podLister algorithm.PodLister, predicateFunc
...
@@ -161,13 +165,13 @@ func findNodesThatFit(pod *api.Pod, podLister algorithm.PodLister, predicateFunc
// Each priority function can also have its own weight
// Each priority function can also have its own weight
// The node scores returned by the priority function are multiplied by the weights to get weighted scores
// The node scores returned by the priority function are multiplied by the weights to get weighted scores
// All scores are finally combined (added) to get the total weighted scores of all nodes
// All scores are finally combined (added) to get the total weighted scores of all nodes
func
PrioritizeNodes
(
pod
*
api
.
Pod
,
podLister
algorithm
.
PodLister
,
priorityConfigs
[]
algorithm
.
PriorityConfig
,
nodeLister
algorithm
.
NodeLister
,
extenders
[]
algorithm
.
SchedulerExtender
)
(
schedulerapi
.
HostPriorityList
,
error
)
{
func
PrioritizeNodes
(
pod
*
api
.
Pod
,
machinesToPods
map
[
string
][]
*
api
.
Pod
,
podLister
algorithm
.
PodLister
,
priorityConfigs
[]
algorithm
.
PriorityConfig
,
nodeLister
algorithm
.
NodeLister
,
extenders
[]
algorithm
.
SchedulerExtender
)
(
schedulerapi
.
HostPriorityList
,
error
)
{
result
:=
schedulerapi
.
HostPriorityList
{}
result
:=
schedulerapi
.
HostPriorityList
{}
// If no priority configs are provided, then the EqualPriority function is applied
// If no priority configs are provided, then the EqualPriority function is applied
// This is required to generate the priority list in the required format
// This is required to generate the priority list in the required format
if
len
(
priorityConfigs
)
==
0
&&
len
(
extenders
)
==
0
{
if
len
(
priorityConfigs
)
==
0
&&
len
(
extenders
)
==
0
{
return
EqualPriority
(
pod
,
podLister
,
nodeLister
)
return
EqualPriority
(
pod
,
machinesToPods
,
podLister
,
nodeLister
)
}
}
combinedScores
:=
map
[
string
]
int
{}
combinedScores
:=
map
[
string
]
int
{}
...
@@ -178,7 +182,7 @@ func PrioritizeNodes(pod *api.Pod, podLister algorithm.PodLister, priorityConfig
...
@@ -178,7 +182,7 @@ func PrioritizeNodes(pod *api.Pod, podLister algorithm.PodLister, priorityConfig
continue
continue
}
}
priorityFunc
:=
priorityConfig
.
Function
priorityFunc
:=
priorityConfig
.
Function
prioritizedList
,
err
:=
priorityFunc
(
pod
,
podLister
,
nodeLister
)
prioritizedList
,
err
:=
priorityFunc
(
pod
,
machinesToPods
,
podLister
,
nodeLister
)
if
err
!=
nil
{
if
err
!=
nil
{
return
schedulerapi
.
HostPriorityList
{},
err
return
schedulerapi
.
HostPriorityList
{},
err
}
}
...
@@ -224,7 +228,7 @@ func getBestHosts(list schedulerapi.HostPriorityList) []string {
...
@@ -224,7 +228,7 @@ func getBestHosts(list schedulerapi.HostPriorityList) []string {
}
}
// EqualPriority is a prioritizer function that gives an equal weight of one to all nodes
// EqualPriority is a prioritizer function that gives an equal weight of one to all nodes
func
EqualPriority
(
_
*
api
.
Pod
,
podLister
algorithm
.
PodLister
,
nodeLister
algorithm
.
NodeLister
)
(
schedulerapi
.
HostPriorityList
,
error
)
{
func
EqualPriority
(
_
*
api
.
Pod
,
machinesToPods
map
[
string
][]
*
api
.
Pod
,
podLister
algorithm
.
PodLister
,
nodeLister
algorithm
.
NodeLister
)
(
schedulerapi
.
HostPriorityList
,
error
)
{
nodes
,
err
:=
nodeLister
.
List
()
nodes
,
err
:=
nodeLister
.
List
()
if
err
!=
nil
{
if
err
!=
nil
{
glog
.
Errorf
(
"Failed to list nodes: %v"
,
err
)
glog
.
Errorf
(
"Failed to list nodes: %v"
,
err
)
...
...
plugin/pkg/scheduler/generic_scheduler_test.go
View file @
bac056d5
...
@@ -45,7 +45,7 @@ func hasNoPodsPredicate(pod *api.Pod, existingPods []*api.Pod, node string) (boo
...
@@ -45,7 +45,7 @@ func hasNoPodsPredicate(pod *api.Pod, existingPods []*api.Pod, node string) (boo
return
len
(
existingPods
)
==
0
,
nil
return
len
(
existingPods
)
==
0
,
nil
}
}
func
numericPriority
(
pod
*
api
.
Pod
,
podLister
algorithm
.
PodLister
,
nodeLister
algorithm
.
NodeLister
)
(
schedulerapi
.
HostPriorityList
,
error
)
{
func
numericPriority
(
pod
*
api
.
Pod
,
machineToPods
map
[
string
][]
*
api
.
Pod
,
podLister
algorithm
.
PodLister
,
nodeLister
algorithm
.
NodeLister
)
(
schedulerapi
.
HostPriorityList
,
error
)
{
nodes
,
err
:=
nodeLister
.
List
()
nodes
,
err
:=
nodeLister
.
List
()
result
:=
[]
schedulerapi
.
HostPriority
{}
result
:=
[]
schedulerapi
.
HostPriority
{}
...
@@ -65,11 +65,11 @@ func numericPriority(pod *api.Pod, podLister algorithm.PodLister, nodeLister alg
...
@@ -65,11 +65,11 @@ func numericPriority(pod *api.Pod, podLister algorithm.PodLister, nodeLister alg
return
result
,
nil
return
result
,
nil
}
}
func
reverseNumericPriority
(
pod
*
api
.
Pod
,
podLister
algorithm
.
PodLister
,
nodeLister
algorithm
.
NodeLister
)
(
schedulerapi
.
HostPriorityList
,
error
)
{
func
reverseNumericPriority
(
pod
*
api
.
Pod
,
machineToPods
map
[
string
][]
*
api
.
Pod
,
podLister
algorithm
.
PodLister
,
nodeLister
algorithm
.
NodeLister
)
(
schedulerapi
.
HostPriorityList
,
error
)
{
var
maxScore
float64
var
maxScore
float64
minScore
:=
math
.
MaxFloat64
minScore
:=
math
.
MaxFloat64
reverseResult
:=
[]
schedulerapi
.
HostPriority
{}
reverseResult
:=
[]
schedulerapi
.
HostPriority
{}
result
,
err
:=
numericPriority
(
pod
,
podLister
,
nodeLister
)
result
,
err
:=
numericPriority
(
pod
,
machineToPods
,
podLister
,
nodeLister
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
...
@@ -308,7 +308,12 @@ func TestGenericScheduler(t *testing.T) {
...
@@ -308,7 +308,12 @@ func TestGenericScheduler(t *testing.T) {
func
TestFindFitAllError
(
t
*
testing
.
T
)
{
func
TestFindFitAllError
(
t
*
testing
.
T
)
{
nodes
:=
[]
string
{
"3"
,
"2"
,
"1"
}
nodes
:=
[]
string
{
"3"
,
"2"
,
"1"
}
predicates
:=
map
[
string
]
algorithm
.
FitPredicate
{
"true"
:
truePredicate
,
"false"
:
falsePredicate
}
predicates
:=
map
[
string
]
algorithm
.
FitPredicate
{
"true"
:
truePredicate
,
"false"
:
falsePredicate
}
_
,
predicateMap
,
err
:=
findNodesThatFit
(
&
api
.
Pod
{},
algorithm
.
FakePodLister
([]
*
api
.
Pod
{}),
predicates
,
makeNodeList
(
nodes
),
nil
)
machineToPods
:=
map
[
string
][]
*
api
.
Pod
{
"3"
:
{},
"2"
:
{},
"1"
:
{},
}
_
,
predicateMap
,
err
:=
findNodesThatFit
(
&
api
.
Pod
{},
machineToPods
,
predicates
,
makeNodeList
(
nodes
),
nil
)
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Errorf
(
"unexpected error: %v"
,
err
)
t
.
Errorf
(
"unexpected error: %v"
,
err
)
...
@@ -333,7 +338,12 @@ func TestFindFitSomeError(t *testing.T) {
...
@@ -333,7 +338,12 @@ func TestFindFitSomeError(t *testing.T) {
nodes
:=
[]
string
{
"3"
,
"2"
,
"1"
}
nodes
:=
[]
string
{
"3"
,
"2"
,
"1"
}
predicates
:=
map
[
string
]
algorithm
.
FitPredicate
{
"true"
:
truePredicate
,
"match"
:
matchesPredicate
}
predicates
:=
map
[
string
]
algorithm
.
FitPredicate
{
"true"
:
truePredicate
,
"match"
:
matchesPredicate
}
pod
:=
&
api
.
Pod
{
ObjectMeta
:
api
.
ObjectMeta
{
Name
:
"1"
}}
pod
:=
&
api
.
Pod
{
ObjectMeta
:
api
.
ObjectMeta
{
Name
:
"1"
}}
_
,
predicateMap
,
err
:=
findNodesThatFit
(
pod
,
algorithm
.
FakePodLister
([]
*
api
.
Pod
{}),
predicates
,
makeNodeList
(
nodes
),
nil
)
machineToPods
:=
map
[
string
][]
*
api
.
Pod
{
"3"
:
{},
"2"
:
{},
"1"
:
{
pod
},
}
_
,
predicateMap
,
err
:=
findNodesThatFit
(
pod
,
machineToPods
,
predicates
,
makeNodeList
(
nodes
),
nil
)
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Errorf
(
"unexpected error: %v"
,
err
)
t
.
Errorf
(
"unexpected error: %v"
,
err
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment