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
7a7f9dcc
Commit
7a7f9dcc
authored
Mar 02, 2018
by
Harry Zhang
Committed by
Harry Zhang
Mar 07, 2018
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[PATCH] Use nodename as key
parent
ea5f0b1d
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
103 additions
and
57 deletions
+103
-57
types.go
pkg/scheduler/api/types.go
+2
-2
types.go
pkg/scheduler/api/v1/types.go
+2
-2
zz_generated.deepcopy.go
pkg/scheduler/api/v1/zz_generated.deepcopy.go
+10
-5
zz_generated.deepcopy.go
pkg/scheduler/api/zz_generated.deepcopy.go
+10
-5
extender.go
pkg/scheduler/core/extender.go
+20
-8
extender_test.go
pkg/scheduler/core/extender_test.go
+38
-33
factory_test.go
pkg/scheduler/factory/factory_test.go
+21
-2
No files found.
pkg/scheduler/api/types.go
View file @
7a7f9dcc
...
@@ -212,8 +212,8 @@ type ExtenderPreemptionArgs struct {
...
@@ -212,8 +212,8 @@ type ExtenderPreemptionArgs struct {
// Pod being scheduled
// Pod being scheduled
Pod
*
v1
.
Pod
Pod
*
v1
.
Pod
// Victims map generated by scheduler preemption phase
// Victims map generated by scheduler preemption phase
// Only set NodeNameToMetaVictims if ExtenderConfig.NodeCacheCapable == true. Otherwise, only set NodeToVictims.
// Only set NodeNameToMetaVictims if ExtenderConfig.NodeCacheCapable == true. Otherwise, only set Node
Name
ToVictims.
Node
ToVictims
map
[
*
v1
.
Node
]
*
Victims
Node
NameToVictims
map
[
string
]
*
Victims
NodeNameToMetaVictims
map
[
string
]
*
MetaVictims
NodeNameToMetaVictims
map
[
string
]
*
MetaVictims
}
}
...
...
pkg/scheduler/api/v1/types.go
View file @
7a7f9dcc
...
@@ -199,8 +199,8 @@ type ExtenderPreemptionArgs struct {
...
@@ -199,8 +199,8 @@ type ExtenderPreemptionArgs struct {
// Pod being scheduled
// Pod being scheduled
Pod
*
apiv1
.
Pod
`json:"pod"`
Pod
*
apiv1
.
Pod
`json:"pod"`
// Victims map generated by scheduler preemption phase
// Victims map generated by scheduler preemption phase
// Only set NodeNameToMetaVictims if ExtenderConfig.NodeCacheCapable == true. Otherwise, only set NodeToVictims.
// Only set NodeNameToMetaVictims if ExtenderConfig.NodeCacheCapable == true. Otherwise, only set Node
Name
ToVictims.
Node
ToVictims
map
[
*
apiv1
.
Node
]
*
Victims
`json:"nodeToVictims,omitempty"`
Node
NameToVictims
map
[
string
]
*
Victims
`json:"nodeToVictims,omitempty"`
NodeNameToMetaVictims
map
[
string
]
*
MetaVictims
`json:"nodeNameToMetaVictims,omitempty"`
NodeNameToMetaVictims
map
[
string
]
*
MetaVictims
`json:"nodeNameToMetaVictims,omitempty"`
}
}
...
...
pkg/scheduler/api/v1/zz_generated.deepcopy.go
View file @
7a7f9dcc
...
@@ -208,11 +208,16 @@ func (in *ExtenderPreemptionArgs) DeepCopyInto(out *ExtenderPreemptionArgs) {
...
@@ -208,11 +208,16 @@ func (in *ExtenderPreemptionArgs) DeepCopyInto(out *ExtenderPreemptionArgs) {
(
*
in
)
.
DeepCopyInto
(
*
out
)
(
*
in
)
.
DeepCopyInto
(
*
out
)
}
}
}
}
if
in
.
NodeToVictims
!=
nil
{
if
in
.
NodeNameToVictims
!=
nil
{
in
,
out
:=
&
in
.
NodeToVictims
,
&
out
.
NodeToVictims
in
,
out
:=
&
in
.
NodeNameToVictims
,
&
out
.
NodeNameToVictims
*
out
=
make
(
map
[
*
core_v1
.
Node
]
*
Victims
,
len
(
*
in
))
*
out
=
make
(
map
[
string
]
*
Victims
,
len
(
*
in
))
for
range
*
in
{
for
key
,
val
:=
range
*
in
{
// FIXME: Copying unassignable keys unsupported *core_v1.Node
if
val
==
nil
{
(
*
out
)[
key
]
=
nil
}
else
{
(
*
out
)[
key
]
=
new
(
Victims
)
val
.
DeepCopyInto
((
*
out
)[
key
])
}
}
}
}
}
if
in
.
NodeNameToMetaVictims
!=
nil
{
if
in
.
NodeNameToMetaVictims
!=
nil
{
...
...
pkg/scheduler/api/zz_generated.deepcopy.go
View file @
7a7f9dcc
...
@@ -208,11 +208,16 @@ func (in *ExtenderPreemptionArgs) DeepCopyInto(out *ExtenderPreemptionArgs) {
...
@@ -208,11 +208,16 @@ func (in *ExtenderPreemptionArgs) DeepCopyInto(out *ExtenderPreemptionArgs) {
(
*
in
)
.
DeepCopyInto
(
*
out
)
(
*
in
)
.
DeepCopyInto
(
*
out
)
}
}
}
}
if
in
.
NodeToVictims
!=
nil
{
if
in
.
NodeNameToVictims
!=
nil
{
in
,
out
:=
&
in
.
NodeToVictims
,
&
out
.
NodeToVictims
in
,
out
:=
&
in
.
NodeNameToVictims
,
&
out
.
NodeNameToVictims
*
out
=
make
(
map
[
*
v1
.
Node
]
*
Victims
,
len
(
*
in
))
*
out
=
make
(
map
[
string
]
*
Victims
,
len
(
*
in
))
for
range
*
in
{
for
key
,
val
:=
range
*
in
{
// FIXME: Copying unassignable keys unsupported *v1.Node
if
val
==
nil
{
(
*
out
)[
key
]
=
nil
}
else
{
(
*
out
)[
key
]
=
new
(
Victims
)
val
.
DeepCopyInto
((
*
out
)[
key
])
}
}
}
}
}
if
in
.
NodeNameToMetaVictims
!=
nil
{
if
in
.
NodeNameToMetaVictims
!=
nil
{
...
...
pkg/scheduler/core/extender.go
View file @
7a7f9dcc
...
@@ -128,15 +128,16 @@ func (h *HTTPExtender) ProcessPreemption(
...
@@ -128,15 +128,16 @@ func (h *HTTPExtender) ProcessPreemption(
if
h
.
nodeCacheCapable
{
if
h
.
nodeCacheCapable
{
// If extender has cached node info, pass NodeNameToMetaVictims in args.
// If extender has cached node info, pass NodeNameToMetaVictims in args.
nodeNameToVictims
:=
convertToNodeNameToMetaVictims
(
nodeToVictims
)
nodeNameTo
Meta
Victims
:=
convertToNodeNameToMetaVictims
(
nodeToVictims
)
args
=
&
schedulerapi
.
ExtenderPreemptionArgs
{
args
=
&
schedulerapi
.
ExtenderPreemptionArgs
{
Pod
:
pod
,
Pod
:
pod
,
NodeNameToMetaVictims
:
nodeNameToVictims
,
NodeNameToMetaVictims
:
nodeNameTo
Meta
Victims
,
}
}
}
else
{
}
else
{
nodeNameToVictims
:=
convertToNodeNameToVictims
(
nodeToVictims
)
args
=
&
schedulerapi
.
ExtenderPreemptionArgs
{
args
=
&
schedulerapi
.
ExtenderPreemptionArgs
{
Pod
:
pod
,
Pod
:
pod
,
Node
ToVictims
:
nod
eToVictims
,
Node
NameToVictims
:
nodeNam
eToVictims
,
}
}
}
}
...
@@ -151,10 +152,10 @@ func (h *HTTPExtender) ProcessPreemption(
...
@@ -151,10 +152,10 @@ func (h *HTTPExtender) ProcessPreemption(
return
nil
,
err
return
nil
,
err
}
}
return
nodeToVictims
,
nil
return
nodeToVictims
,
nil
}
}
// convertToNodeToVictims converts from meta types to struct type.
// convertToNodeToVictims converts "nodeNameToMetaVictims" from object identifiers,
// such as UIDs and names, to object pointers.
func
(
h
*
HTTPExtender
)
convertToNodeToVictims
(
func
(
h
*
HTTPExtender
)
convertToNodeToVictims
(
nodeNameToMetaVictims
map
[
string
]
*
schedulerapi
.
MetaVictims
,
nodeNameToMetaVictims
map
[
string
]
*
schedulerapi
.
MetaVictims
,
nodeNameToInfo
map
[
string
]
*
schedulercache
.
NodeInfo
,
nodeNameToInfo
map
[
string
]
*
schedulercache
.
NodeInfo
,
...
@@ -165,7 +166,7 @@ func (h *HTTPExtender) convertToNodeToVictims(
...
@@ -165,7 +166,7 @@ func (h *HTTPExtender) convertToNodeToVictims(
Pods
:
[]
*
v1
.
Pod
{},
Pods
:
[]
*
v1
.
Pod
{},
}
}
for
_
,
metaPod
:=
range
metaVictims
.
Pods
{
for
_
,
metaPod
:=
range
metaVictims
.
Pods
{
pod
,
err
:=
h
.
restorePodFromNodeInfo
(
metaPod
,
nodeName
,
nodeNameToInfo
)
pod
,
err
:=
h
.
convertPodUIDToPod
(
metaPod
,
nodeName
,
nodeNameToInfo
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
...
@@ -176,11 +177,11 @@ func (h *HTTPExtender) convertToNodeToVictims(
...
@@ -176,11 +177,11 @@ func (h *HTTPExtender) convertToNodeToVictims(
return
nodeToVictims
,
nil
return
nodeToVictims
,
nil
}
}
//
restorePodFromNodeInfo
returns v1.Pod object for given MetaPod and node name.
//
convertPodUIDToPod
returns v1.Pod object for given MetaPod and node name.
// The v1.Pod object is restored by nodeInfo.Pods().
// The v1.Pod object is restored by nodeInfo.Pods().
// It should return error if there's cache inconsistency between default scheduler and extender
// It should return error if there's cache inconsistency between default scheduler and extender
// so that this pod or node is missing from nodeNameToInfo.
// so that this pod or node is missing from nodeNameToInfo.
func
(
h
*
HTTPExtender
)
restorePodFromNodeInfo
(
func
(
h
*
HTTPExtender
)
convertPodUIDToPod
(
metaPod
*
schedulerapi
.
MetaPod
,
metaPod
*
schedulerapi
.
MetaPod
,
nodeName
string
,
nodeName
string
,
nodeNameToInfo
map
[
string
]
*
schedulercache
.
NodeInfo
)
(
*
v1
.
Pod
,
error
)
{
nodeNameToInfo
map
[
string
]
*
schedulercache
.
NodeInfo
)
(
*
v1
.
Pod
,
error
)
{
...
@@ -219,6 +220,17 @@ func convertToNodeNameToMetaVictims(
...
@@ -219,6 +220,17 @@ func convertToNodeNameToMetaVictims(
return
nodeNameToVictims
return
nodeNameToVictims
}
}
// convertToNodeNameToVictims converts from node type to node name as key.
func
convertToNodeNameToVictims
(
nodeToVictims
map
[
*
v1
.
Node
]
*
schedulerapi
.
Victims
,
)
map
[
string
]
*
schedulerapi
.
Victims
{
nodeNameToVictims
:=
map
[
string
]
*
schedulerapi
.
Victims
{}
for
node
,
victims
:=
range
nodeToVictims
{
nodeNameToVictims
[
node
.
GetName
()]
=
victims
}
return
nodeNameToVictims
}
// Filter based on extender implemented predicate functions. The filtered list is
// Filter based on extender implemented predicate functions. The filtered list is
// expected to be a subset of the supplied list. failedNodesMap optionally contains
// expected to be a subset of the supplied list. failedNodesMap optionally contains
// the list of failed nodes and failure reasons.
// the list of failed nodes and failure reasons.
...
...
pkg/scheduler/core/extender_test.go
View file @
7a7f9dcc
...
@@ -119,6 +119,42 @@ type FakeExtender struct {
...
@@ -119,6 +119,42 @@ type FakeExtender struct {
cachedPDBs
[]
*
policy
.
PodDisruptionBudget
cachedPDBs
[]
*
policy
.
PodDisruptionBudget
}
}
func
(
f
*
FakeExtender
)
SupportsPreemption
()
bool
{
// Assume preempt verb is always defined.
return
true
}
func
(
f
*
FakeExtender
)
ProcessPreemption
(
pod
*
v1
.
Pod
,
nodeToVictims
map
[
*
v1
.
Node
]
*
schedulerapi
.
Victims
,
nodeNameToInfo
map
[
string
]
*
schedulercache
.
NodeInfo
,
)
(
map
[
*
v1
.
Node
]
*
schedulerapi
.
Victims
,
error
)
{
nodeToVictimsCopy
:=
map
[
*
v1
.
Node
]
*
schedulerapi
.
Victims
{}
// We don't want to change the original nodeToVictims
for
k
,
v
:=
range
nodeToVictims
{
// In real world implementation, extender's user should have his own way to get node object
// by name if needed (e.g. query kube-apiserver etc).
//
// For test purpose, we just use node from parameters directly.
nodeToVictimsCopy
[
k
]
=
v
}
for
node
,
victims
:=
range
nodeToVictimsCopy
{
// Try to do preemption on extender side.
extenderVictimPods
,
extendernPDBViolations
,
fits
:=
f
.
selectVictimsOnNodeByExtender
(
pod
,
node
,
nodeNameToInfo
)
// If it's unfit after extender's preemption, this node is unresolvable by preemption overall,
// let's remove it from potential preemption nodes.
if
!
fits
{
delete
(
nodeToVictimsCopy
,
node
)
}
else
{
// Append new victims to original victims
nodeToVictimsCopy
[
node
]
.
Pods
=
append
(
victims
.
Pods
,
extenderVictimPods
...
)
nodeToVictimsCopy
[
node
]
.
NumPDBViolations
=
victims
.
NumPDBViolations
+
extendernPDBViolations
}
}
return
nodeToVictimsCopy
,
nil
}
// selectVictimsOnNodeByExtender checks the given nodes->pods map with predicates on extender's side.
// selectVictimsOnNodeByExtender checks the given nodes->pods map with predicates on extender's side.
// Returns:
// Returns:
// 1. More victim pods (if any) amended by preemption phase of extender.
// 1. More victim pods (if any) amended by preemption phase of extender.
...
@@ -127,6 +163,7 @@ type FakeExtender struct {
...
@@ -127,6 +163,7 @@ type FakeExtender struct {
func
(
f
*
FakeExtender
)
selectVictimsOnNodeByExtender
(
func
(
f
*
FakeExtender
)
selectVictimsOnNodeByExtender
(
pod
*
v1
.
Pod
,
pod
*
v1
.
Pod
,
node
*
v1
.
Node
,
node
*
v1
.
Node
,
nodeNameToInfo
map
[
string
]
*
schedulercache
.
NodeInfo
,
)
([]
*
v1
.
Pod
,
int
,
bool
)
{
)
([]
*
v1
.
Pod
,
int
,
bool
)
{
// TODO(harry): add more test in generic_scheduler_test.go to verify this logic.
// TODO(harry): add more test in generic_scheduler_test.go to verify this logic.
// If a extender support preemption but have no cached node info, let's run filter to make sure
// If a extender support preemption but have no cached node info, let's run filter to make sure
...
@@ -139,7 +176,7 @@ func (f *FakeExtender) selectVictimsOnNodeByExtender(
...
@@ -139,7 +176,7 @@ func (f *FakeExtender) selectVictimsOnNodeByExtender(
}
}
// Otherwise, as a extender support preemption and have cached node info, we will assume cachedNodeNameToInfo is available
// Otherwise, as a extender support preemption and have cached node info, we will assume cachedNodeNameToInfo is available
// and get cached node info by given node
N
ame.
// and get cached node info by given node
n
ame.
nodeInfoCopy
:=
f
.
cachedNodeNameToInfo
[
node
.
GetName
()]
.
Clone
()
nodeInfoCopy
:=
f
.
cachedNodeNameToInfo
[
node
.
GetName
()]
.
Clone
()
potentialVictims
:=
util
.
SortableList
{
CompFunc
:
util
.
HigherPriorityPod
}
potentialVictims
:=
util
.
SortableList
{
CompFunc
:
util
.
HigherPriorityPod
}
...
@@ -191,38 +228,6 @@ func (f *FakeExtender) selectVictimsOnNodeByExtender(
...
@@ -191,38 +228,6 @@ func (f *FakeExtender) selectVictimsOnNodeByExtender(
return
victims
,
numViolatingVictim
,
true
return
victims
,
numViolatingVictim
,
true
}
}
func
(
f
*
FakeExtender
)
SupportsPreemption
()
bool
{
// Assume preempt verb is always defined.
return
true
}
func
(
f
*
FakeExtender
)
ProcessPreemption
(
pod
*
v1
.
Pod
,
nodeToVictims
map
[
*
v1
.
Node
]
*
schedulerapi
.
Victims
,
nodeNameToInfo
map
[
string
]
*
schedulercache
.
NodeInfo
,
)
(
map
[
*
v1
.
Node
]
*
schedulerapi
.
Victims
,
error
)
{
nodeToVictimsCopy
:=
map
[
*
v1
.
Node
]
*
schedulerapi
.
Victims
{}
// We don't want to change the original nodeToVictims
for
k
,
v
:=
range
nodeToVictims
{
nodeToVictimsCopy
[
k
]
=
v
}
for
node
,
victims
:=
range
nodeToVictimsCopy
{
// Try to do preemption on extender side.
extenderVictimPods
,
extendernPDBViolations
,
fits
:=
f
.
selectVictimsOnNodeByExtender
(
pod
,
node
)
// If it's unfit after extender's preemption, this node is unresolvable by preemption overall,
// let's remove it from potential preemption nodes.
if
!
fits
{
delete
(
nodeToVictimsCopy
,
node
)
}
else
{
// Append new victims to original victims
nodeToVictimsCopy
[
node
]
.
Pods
=
append
(
victims
.
Pods
,
extenderVictimPods
...
)
nodeToVictimsCopy
[
node
]
.
NumPDBViolations
=
victims
.
NumPDBViolations
+
extendernPDBViolations
}
}
return
nodeToVictimsCopy
,
nil
}
// runPredicate run predicates of extender one by one for given pod and node.
// runPredicate run predicates of extender one by one for given pod and node.
// Returns: fits or not.
// Returns: fits or not.
func
(
f
*
FakeExtender
)
runPredicate
(
pod
*
v1
.
Pod
,
node
*
v1
.
Node
)
(
bool
,
error
)
{
func
(
f
*
FakeExtender
)
runPredicate
(
pod
*
v1
.
Pod
,
node
*
v1
.
Node
)
(
bool
,
error
)
{
...
...
pkg/scheduler/factory/factory_test.go
View file @
7a7f9dcc
...
@@ -541,11 +541,30 @@ type fakeExtender struct {
...
@@ -541,11 +541,30 @@ type fakeExtender struct {
interestedPodName
string
interestedPodName
string
}
}
func
(
f
*
fakeExtender
)
Filter
(
pod
*
v1
.
Pod
,
nodes
[]
*
v1
.
Node
,
nodeNameToInfo
map
[
string
]
*
schedulercache
.
NodeInfo
)
(
filteredNodes
[]
*
v1
.
Node
,
failedNodesMap
schedulerapi
.
FailedNodesMap
,
err
error
)
{
func
(
f
*
fakeExtender
)
ProcessPreemption
(
pod
*
v1
.
Pod
,
nodeToVictims
map
[
*
v1
.
Node
]
*
schedulerapi
.
Victims
,
nodeNameToInfo
map
[
string
]
*
schedulercache
.
NodeInfo
,
)
(
map
[
*
v1
.
Node
]
*
schedulerapi
.
Victims
,
error
)
{
return
nil
,
nil
}
func
(
f
*
fakeExtender
)
SupportsPreemption
()
bool
{
return
false
}
func
(
f
*
fakeExtender
)
Filter
(
pod
*
v1
.
Pod
,
nodes
[]
*
v1
.
Node
,
nodeNameToInfo
map
[
string
]
*
schedulercache
.
NodeInfo
,
)
(
filteredNodes
[]
*
v1
.
Node
,
failedNodesMap
schedulerapi
.
FailedNodesMap
,
err
error
)
{
return
nil
,
nil
,
nil
return
nil
,
nil
,
nil
}
}
func
(
f
*
fakeExtender
)
Prioritize
(
pod
*
v1
.
Pod
,
nodes
[]
*
v1
.
Node
)
(
hostPriorities
*
schedulerapi
.
HostPriorityList
,
weight
int
,
err
error
)
{
func
(
f
*
fakeExtender
)
Prioritize
(
pod
*
v1
.
Pod
,
nodes
[]
*
v1
.
Node
,
)
(
hostPriorities
*
schedulerapi
.
HostPriorityList
,
weight
int
,
err
error
)
{
return
nil
,
0
,
nil
return
nil
,
0
,
nil
}
}
...
...
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