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
daf8492b
Commit
daf8492b
authored
Oct 24, 2017
by
Bobby (Babak) Salamat
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added a new scheduling queue based on priority queue.
parent
ff0d72a3
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
32 additions
and
17 deletions
+32
-17
predicates.go
plugin/pkg/scheduler/algorithm/predicates/predicates.go
+6
-6
scheduling_queue.go
plugin/pkg/scheduler/core/scheduling_queue.go
+0
-0
scheduling_queue_test.go
plugin/pkg/scheduler/core/scheduling_queue_test.go
+0
-0
factory.go
plugin/pkg/scheduler/factory/factory.go
+18
-8
scheduler.go
plugin/pkg/scheduler/scheduler.go
+1
-3
utils.go
plugin/pkg/scheduler/util/utils.go
+7
-0
No files found.
plugin/pkg/scheduler/algorithm/predicates/predicates.go
View file @
daf8492b
...
...
@@ -1070,7 +1070,7 @@ func (c *PodAffinityChecker) anyPodMatchesPodAffinityTerm(pod *v1.Pod, allPods [
return
false
,
matchingPodExists
,
nil
}
func
g
etPodAffinityTerms
(
podAffinity
*
v1
.
PodAffinity
)
(
terms
[]
v1
.
PodAffinityTerm
)
{
func
G
etPodAffinityTerms
(
podAffinity
*
v1
.
PodAffinity
)
(
terms
[]
v1
.
PodAffinityTerm
)
{
if
podAffinity
!=
nil
{
if
len
(
podAffinity
.
RequiredDuringSchedulingIgnoredDuringExecution
)
!=
0
{
terms
=
podAffinity
.
RequiredDuringSchedulingIgnoredDuringExecution
...
...
@@ -1083,7 +1083,7 @@ func getPodAffinityTerms(podAffinity *v1.PodAffinity) (terms []v1.PodAffinityTer
return
terms
}
func
g
etPodAntiAffinityTerms
(
podAntiAffinity
*
v1
.
PodAntiAffinity
)
(
terms
[]
v1
.
PodAffinityTerm
)
{
func
G
etPodAntiAffinityTerms
(
podAntiAffinity
*
v1
.
PodAntiAffinity
)
(
terms
[]
v1
.
PodAffinityTerm
)
{
if
podAntiAffinity
!=
nil
{
if
len
(
podAntiAffinity
.
RequiredDuringSchedulingIgnoredDuringExecution
)
!=
0
{
terms
=
podAntiAffinity
.
RequiredDuringSchedulingIgnoredDuringExecution
...
...
@@ -1133,7 +1133,7 @@ func getMatchingAntiAffinityTerms(pod *v1.Pod, nodeInfoMap map[string]*scheduler
if
affinity
==
nil
{
continue
}
for
_
,
term
:=
range
g
etPodAntiAffinityTerms
(
affinity
.
PodAntiAffinity
)
{
for
_
,
term
:=
range
G
etPodAntiAffinityTerms
(
affinity
.
PodAntiAffinity
)
{
namespaces
:=
priorityutil
.
GetNamespacesFromPodAffinityTerm
(
existingPod
,
&
term
)
selector
,
err
:=
metav1
.
LabelSelectorAsSelector
(
term
.
LabelSelector
)
if
err
!=
nil
{
...
...
@@ -1160,7 +1160,7 @@ func getMatchingAntiAffinityTermsOfExistingPod(newPod *v1.Pod, existingPod *v1.P
var
result
[]
matchingPodAntiAffinityTerm
affinity
:=
existingPod
.
Spec
.
Affinity
if
affinity
!=
nil
&&
affinity
.
PodAntiAffinity
!=
nil
{
for
_
,
term
:=
range
g
etPodAntiAffinityTerms
(
affinity
.
PodAntiAffinity
)
{
for
_
,
term
:=
range
G
etPodAntiAffinityTerms
(
affinity
.
PodAntiAffinity
)
{
namespaces
:=
priorityutil
.
GetNamespacesFromPodAffinityTerm
(
existingPod
,
&
term
)
selector
,
err
:=
metav1
.
LabelSelectorAsSelector
(
term
.
LabelSelector
)
if
err
!=
nil
{
...
...
@@ -1257,7 +1257,7 @@ func (c *PodAffinityChecker) satisfiesPodsAffinityAntiAffinity(pod *v1.Pod, node
}
// Check all affinity terms.
for
_
,
term
:=
range
g
etPodAffinityTerms
(
affinity
.
PodAffinity
)
{
for
_
,
term
:=
range
G
etPodAffinityTerms
(
affinity
.
PodAffinity
)
{
termMatches
,
matchingPodExists
,
err
:=
c
.
anyPodMatchesPodAffinityTerm
(
pod
,
filteredPods
,
node
,
&
term
)
if
err
!=
nil
{
errMessage
:=
fmt
.
Sprintf
(
"Cannot schedule pod %+v onto node %v, because of PodAffinityTerm %v, err: %v"
,
podName
(
pod
),
node
.
Name
,
term
,
err
)
...
...
@@ -1290,7 +1290,7 @@ func (c *PodAffinityChecker) satisfiesPodsAffinityAntiAffinity(pod *v1.Pod, node
}
// Check all anti-affinity terms.
for
_
,
term
:=
range
g
etPodAntiAffinityTerms
(
affinity
.
PodAntiAffinity
)
{
for
_
,
term
:=
range
G
etPodAntiAffinityTerms
(
affinity
.
PodAntiAffinity
)
{
termMatches
,
_
,
err
:=
c
.
anyPodMatchesPodAffinityTerm
(
pod
,
filteredPods
,
node
,
&
term
)
if
err
!=
nil
||
termMatches
{
glog
.
V
(
10
)
.
Infof
(
"Cannot schedule pod %+v onto node %v, because of PodAntiAffinityTerm %v, err: %v"
,
...
...
plugin/pkg/scheduler/core/scheduling_queue.go
View file @
daf8492b
This diff is collapsed.
Click to expand it.
plugin/pkg/scheduler/core/scheduling_queue_test.go
0 → 100644
View file @
daf8492b
This diff is collapsed.
Click to expand it.
plugin/pkg/scheduler/factory/factory.go
View file @
daf8492b
...
...
@@ -142,11 +142,10 @@ func NewConfigFactory(
stopEverything
:=
make
(
chan
struct
{})
schedulerCache
:=
schedulercache
.
New
(
30
*
time
.
Second
,
stopEverything
)
schedulingQueue
:=
&
core
.
FIFO
{
FIFO
:
cache
.
NewFIFO
(
cache
.
MetaNamespaceKeyFunc
)}
c
:=
&
configFactory
{
client
:
client
,
podLister
:
schedulerCache
,
podQueue
:
schedulingQueue
,
podQueue
:
core
.
NewSchedulingQueue
()
,
pVLister
:
pvInformer
.
Lister
(),
pVCLister
:
pvcInformer
.
Lister
(),
serviceLister
:
serviceInformer
.
Lister
(),
...
...
@@ -195,20 +194,21 @@ func NewConfigFactory(
},
Handler
:
cache
.
ResourceEventHandlerFuncs
{
AddFunc
:
func
(
obj
interface
{})
{
if
err
:=
c
.
podQueue
.
Add
(
obj
);
err
!=
nil
{
if
err
:=
c
.
podQueue
.
Add
(
obj
.
(
*
v1
.
Pod
)
);
err
!=
nil
{
runtime
.
HandleError
(
fmt
.
Errorf
(
"unable to queue %T: %v"
,
obj
,
err
))
}
},
UpdateFunc
:
func
(
oldObj
,
newObj
interface
{})
{
if
c
.
skipPodUpdate
(
newObj
.
(
*
v1
.
Pod
))
{
pod
:=
newObj
.
(
*
v1
.
Pod
)
if
c
.
skipPodUpdate
(
pod
)
{
return
}
if
err
:=
c
.
podQueue
.
Update
(
newObj
);
err
!=
nil
{
if
err
:=
c
.
podQueue
.
Update
(
pod
);
err
!=
nil
{
runtime
.
HandleError
(
fmt
.
Errorf
(
"unable to update %T: %v"
,
newObj
,
err
))
}
},
DeleteFunc
:
func
(
obj
interface
{})
{
if
err
:=
c
.
podQueue
.
Delete
(
obj
);
err
!=
nil
{
if
err
:=
c
.
podQueue
.
Delete
(
obj
.
(
*
v1
.
Pod
)
);
err
!=
nil
{
runtime
.
HandleError
(
fmt
.
Errorf
(
"unable to dequeue %T: %v"
,
obj
,
err
))
}
},
...
...
@@ -377,6 +377,7 @@ func (c *configFactory) onPvcAdd(obj interface{}) {
}
c
.
invalidatePredicatesForPvc
(
pvc
)
}
c
.
podQueue
.
MoveAllToActiveQueue
()
}
func
(
c
*
configFactory
)
onPvcDelete
(
obj
interface
{})
{
...
...
@@ -398,6 +399,7 @@ func (c *configFactory) onPvcDelete(obj interface{}) {
}
c
.
invalidatePredicatesForPvc
(
pvc
)
}
c
.
podQueue
.
MoveAllToActiveQueue
()
}
func
(
c
*
configFactory
)
invalidatePredicatesForPvc
(
pvc
*
v1
.
PersistentVolumeClaim
)
{
...
...
@@ -410,6 +412,7 @@ func (c *configFactory) onServiceAdd(obj interface{}) {
if
c
.
enableEquivalenceClassCache
{
c
.
equivalencePodCache
.
InvalidateCachedPredicateItemOfAllNodes
(
serviceAffinitySet
)
}
c
.
podQueue
.
MoveAllToActiveQueue
()
}
func
(
c
*
configFactory
)
onServiceUpdate
(
oldObj
interface
{},
newObj
interface
{})
{
...
...
@@ -421,12 +424,14 @@ func (c *configFactory) onServiceUpdate(oldObj interface{}, newObj interface{})
c
.
equivalencePodCache
.
InvalidateCachedPredicateItemOfAllNodes
(
serviceAffinitySet
)
}
}
c
.
podQueue
.
MoveAllToActiveQueue
()
}
func
(
c
*
configFactory
)
onServiceDelete
(
obj
interface
{})
{
if
c
.
enableEquivalenceClassCache
{
c
.
equivalencePodCache
.
InvalidateCachedPredicateItemOfAllNodes
(
serviceAffinitySet
)
}
c
.
podQueue
.
MoveAllToActiveQueue
()
}
// GetNodeStore provides the cache to the nodes, mostly internal use, but may also be called by mock-tests.
...
...
@@ -462,6 +467,8 @@ func (c *configFactory) addPodToCache(obj interface{}) {
if
err
:=
c
.
schedulerCache
.
AddPod
(
pod
);
err
!=
nil
{
glog
.
Errorf
(
"scheduler cache AddPod failed: %v"
,
err
)
}
c
.
podQueue
.
AssignedPodAdded
(
pod
)
// NOTE: Updating equivalence cache of addPodToCache has been
// handled optimistically in InvalidateCachedPredicateItemForPodAdd.
}
...
...
@@ -483,6 +490,7 @@ func (c *configFactory) updatePodInCache(oldObj, newObj interface{}) {
}
c
.
invalidateCachedPredicatesOnUpdatePod
(
newPod
,
oldPod
)
c
.
podQueue
.
AssignedPodUpdated
(
newPod
)
}
func
(
c
*
configFactory
)
invalidateCachedPredicatesOnUpdatePod
(
newPod
*
v1
.
Pod
,
oldPod
*
v1
.
Pod
)
{
...
...
@@ -527,6 +535,7 @@ func (c *configFactory) deletePodFromCache(obj interface{}) {
}
c
.
invalidateCachedPredicatesOnDeletePod
(
pod
)
c
.
podQueue
.
MoveAllToActiveQueue
()
}
func
(
c
*
configFactory
)
invalidateCachedPredicatesOnDeletePod
(
pod
*
v1
.
Pod
)
{
...
...
@@ -561,6 +570,7 @@ func (c *configFactory) addNodeToCache(obj interface{}) {
glog
.
Errorf
(
"scheduler cache AddNode failed: %v"
,
err
)
}
c
.
podQueue
.
MoveAllToActiveQueue
()
// NOTE: add a new node does not affect existing predicates in equivalence cache
}
...
...
@@ -581,6 +591,7 @@ func (c *configFactory) updateNodeInCache(oldObj, newObj interface{}) {
}
c
.
invalidateCachedPredicatesOnNodeUpdate
(
newNode
,
oldNode
)
c
.
podQueue
.
MoveAllToActiveQueue
()
}
func
(
c
*
configFactory
)
invalidateCachedPredicatesOnNodeUpdate
(
newNode
*
v1
.
Node
,
oldNode
*
v1
.
Node
)
{
...
...
@@ -902,8 +913,7 @@ func (f *configFactory) getPluginArgs() (*PluginFactoryArgs, error) {
}
func
(
f
*
configFactory
)
getNextPod
()
*
v1
.
Pod
{
if
obj
,
err
:=
f
.
podQueue
.
Pop
();
err
==
nil
{
pod
:=
obj
.
(
*
v1
.
Pod
)
if
pod
,
err
:=
f
.
podQueue
.
Pop
();
err
==
nil
{
glog
.
V
(
4
)
.
Infof
(
"About to try and schedule pod %v"
,
pod
.
Name
)
return
pod
}
else
{
...
...
plugin/pkg/scheduler/scheduler.go
View file @
daf8492b
...
...
@@ -23,11 +23,9 @@ import (
metav1
"k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/sets"
"k8s.io/apimachinery/pkg/util/wait"
utilfeature
"k8s.io/apiserver/pkg/util/feature"
clientset
"k8s.io/client-go/kubernetes"
corelisters
"k8s.io/client-go/listers/core/v1"
"k8s.io/client-go/tools/record"
"k8s.io/kubernetes/pkg/features"
"k8s.io/kubernetes/plugin/pkg/scheduler/algorithm"
schedulerapi
"k8s.io/kubernetes/plugin/pkg/scheduler/api"
"k8s.io/kubernetes/plugin/pkg/scheduler/core"
...
...
@@ -196,7 +194,7 @@ func (sched *Scheduler) schedule(pod *v1.Pod) (string, error) {
// If it succeeds, it adds the name of the node where preemption has happened to the pod annotations.
// It returns the node name and an error if any.
func
(
sched
*
Scheduler
)
preempt
(
preemptor
*
v1
.
Pod
,
scheduleErr
error
)
(
string
,
error
)
{
if
!
util
feature
.
DefaultFeatureGate
.
Enabled
(
features
.
PodPriority
)
{
if
!
util
.
PodPriorityEnabled
(
)
{
glog
.
V
(
3
)
.
Infof
(
"Pod priority feature is not enabled. No preemption is performed."
)
return
""
,
nil
}
...
...
plugin/pkg/scheduler/util/utils.go
View file @
daf8492b
...
...
@@ -21,7 +21,9 @@ import (
"sort"
"k8s.io/api/core/v1"
"k8s.io/apiserver/pkg/util/feature"
"k8s.io/kubernetes/pkg/apis/scheduling"
"k8s.io/kubernetes/pkg/features"
)
const
DefaultBindAllHostIP
=
"0.0.0.0"
...
...
@@ -59,6 +61,11 @@ func GetUsedPorts(pods ...*v1.Pod) map[string]bool {
return
ports
}
// PodPriorityEnabled indicates whether pod priority feature is enabled.
func
PodPriorityEnabled
()
bool
{
return
feature
.
DefaultFeatureGate
.
Enabled
(
features
.
PodPriority
)
}
// GetPodFullName returns a name that uniquely identifies a pod.
func
GetPodFullName
(
pod
*
v1
.
Pod
)
string
{
// Use underscore as the delimiter because it is not allowed in pod name
...
...
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