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
4f0bd412
Commit
4f0bd412
authored
Apr 11, 2018
by
Harry Zhang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Disable pod preemption by config
parent
dfd6f581
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
90 additions
and
8 deletions
+90
-8
server.go
cmd/kube-scheduler/app/server.go
+6
-0
types.go
pkg/apis/componentconfig/types.go
+3
-0
types.go
pkg/apis/componentconfig/v1alpha1/types.go
+3
-0
zz_generated.conversion.go
pkg/apis/componentconfig/v1alpha1/zz_generated.conversion.go
+2
-0
compatibility_test.go
...cheduler/algorithmprovider/defaults/compatibility_test.go
+1
-0
extender_test.go
pkg/scheduler/core/extender_test.go
+12
-1
generic_scheduler.go
pkg/scheduler/core/generic_scheduler.go
+5
-1
generic_scheduler_test.go
pkg/scheduler/core/generic_scheduler_test.go
+24
-2
factory.go
pkg/scheduler/factory/factory.go
+19
-1
factory_test.go
pkg/scheduler/factory/factory_test.go
+5
-1
scheduler.go
pkg/scheduler/scheduler.go
+6
-2
scheduler_test.go
pkg/scheduler/scheduler_test.go
+2
-0
util.go
test/integration/scheduler/util.go
+1
-0
util.go
test/integration/util/util.go
+1
-0
No files found.
cmd/kube-scheduler/app/server.go
View file @
4f0bd412
...
...
@@ -381,6 +381,8 @@ type SchedulerServer struct {
HealthzServer
*
http
.
Server
// MetricsServer is optional.
MetricsServer
*
http
.
Server
// Disable pod preemption or not.
DisablePreemption
bool
}
// NewSchedulerServer creates a runnable SchedulerServer from configuration.
...
...
@@ -445,6 +447,7 @@ func NewSchedulerServer(config *componentconfig.KubeSchedulerConfiguration, mast
LeaderElection
:
leaderElectionConfig
,
HealthzServer
:
healthzServer
,
MetricsServer
:
metricsServer
,
DisablePreemption
:
config
.
DisablePreemption
,
},
nil
}
...
...
@@ -659,6 +662,7 @@ func (s *SchedulerServer) SchedulerConfig() (*scheduler.Config, error) {
storageClassInformer
,
s
.
HardPodAffinitySymmetricWeight
,
utilfeature
.
DefaultFeatureGate
.
Enabled
(
features
.
EnableEquivalenceClassCache
),
s
.
DisablePreemption
,
)
source
:=
s
.
AlgorithmSource
...
...
@@ -716,5 +720,7 @@ func (s *SchedulerServer) SchedulerConfig() (*scheduler.Config, error) {
}
// Additional tweaks to the config produced by the configurator.
config
.
Recorder
=
s
.
Recorder
config
.
DisablePreemption
=
s
.
DisablePreemption
return
config
,
nil
}
pkg/apis/componentconfig/types.go
View file @
4f0bd412
...
...
@@ -111,6 +111,9 @@ type KubeSchedulerConfiguration struct {
// Indicate the "all topologies" set for empty topologyKey when it's used for PreferredDuringScheduling pod anti-affinity.
// DEPRECATED: This is no longer used.
FailureDomains
string
// DisablePreemption disables the pod preemption feature.
DisablePreemption
bool
}
// KubeSchedulerLeaderElectionConfiguration expands LeaderElectionConfiguration
...
...
pkg/apis/componentconfig/v1alpha1/types.go
View file @
4f0bd412
...
...
@@ -106,6 +106,9 @@ type KubeSchedulerConfiguration struct {
// Indicate the "all topologies" set for empty topologyKey when it's used for PreferredDuringScheduling pod anti-affinity.
FailureDomains
string
`json:"failureDomains"`
// DisablePreemption disables the pod preemption feature.
DisablePreemption
bool
`json:"disablePreemption"`
}
// LeaderElectionConfiguration defines the configuration of leader election
...
...
pkg/apis/componentconfig/v1alpha1/zz_generated.conversion.go
View file @
4f0bd412
...
...
@@ -309,6 +309,7 @@ func autoConvert_v1alpha1_KubeSchedulerConfiguration_To_componentconfig_KubeSche
out
.
EnableProfiling
=
in
.
EnableProfiling
out
.
EnableContentionProfiling
=
in
.
EnableContentionProfiling
out
.
FailureDomains
=
in
.
FailureDomains
out
.
DisablePreemption
=
in
.
DisablePreemption
return
nil
}
...
...
@@ -334,6 +335,7 @@ func autoConvert_componentconfig_KubeSchedulerConfiguration_To_v1alpha1_KubeSche
out
.
EnableProfiling
=
in
.
EnableProfiling
out
.
EnableContentionProfiling
=
in
.
EnableContentionProfiling
out
.
FailureDomains
=
in
.
FailureDomains
out
.
DisablePreemption
=
in
.
DisablePreemption
return
nil
}
...
...
pkg/scheduler/algorithmprovider/defaults/compatibility_test.go
View file @
4f0bd412
...
...
@@ -579,6 +579,7 @@ func TestCompatibility_v1_Scheduler(t *testing.T) {
informerFactory
.
Storage
()
.
V1
()
.
StorageClasses
(),
v1
.
DefaultHardPodAffinitySymmetricWeight
,
enableEquivalenceCache
,
false
,
)
.
CreateFromConfig
(
policy
);
err
!=
nil
{
t
.
Errorf
(
"%s: Error constructing: %v"
,
v
,
err
)
continue
...
...
pkg/scheduler/core/extender_test.go
View file @
4f0bd412
...
...
@@ -506,7 +506,18 @@ func TestGenericSchedulerWithExtenders(t *testing.T) {
}
queue
:=
NewSchedulingQueue
()
scheduler
:=
NewGenericScheduler
(
cache
,
nil
,
queue
,
test
.
predicates
,
algorithm
.
EmptyPredicateMetadataProducer
,
test
.
prioritizers
,
algorithm
.
EmptyPriorityMetadataProducer
,
extenders
,
nil
,
schedulertesting
.
FakePersistentVolumeClaimLister
{},
false
)
cache
,
nil
,
queue
,
test
.
predicates
,
algorithm
.
EmptyPredicateMetadataProducer
,
test
.
prioritizers
,
algorithm
.
EmptyPriorityMetadataProducer
,
extenders
,
nil
,
schedulertesting
.
FakePersistentVolumeClaimLister
{},
false
,
false
)
podIgnored
:=
&
v1
.
Pod
{}
machine
,
err
:=
scheduler
.
Schedule
(
podIgnored
,
schedulertesting
.
FakeNodeLister
(
makeNodeList
(
test
.
nodes
)))
if
test
.
expectsErr
{
...
...
pkg/scheduler/core/generic_scheduler.go
View file @
4f0bd412
...
...
@@ -98,6 +98,7 @@ type genericScheduler struct {
cachedNodeInfoMap
map
[
string
]
*
schedulercache
.
NodeInfo
volumeBinder
*
volumebinder
.
VolumeBinder
pvcLister
corelisters
.
PersistentVolumeClaimLister
disablePreemption
bool
}
// Schedule tries to schedule the given pod to one of the nodes in the node list.
...
...
@@ -1107,7 +1108,9 @@ func NewGenericScheduler(
extenders
[]
algorithm
.
SchedulerExtender
,
volumeBinder
*
volumebinder
.
VolumeBinder
,
pvcLister
corelisters
.
PersistentVolumeClaimLister
,
alwaysCheckAllPredicates
bool
)
algorithm
.
ScheduleAlgorithm
{
alwaysCheckAllPredicates
bool
,
disablePreemption
bool
,
)
algorithm
.
ScheduleAlgorithm
{
return
&
genericScheduler
{
cache
:
cache
,
equivalenceCache
:
eCache
,
...
...
@@ -1121,5 +1124,6 @@ func NewGenericScheduler(
volumeBinder
:
volumeBinder
,
pvcLister
:
pvcLister
,
alwaysCheckAllPredicates
:
alwaysCheckAllPredicates
,
disablePreemption
:
disablePreemption
,
}
}
pkg/scheduler/core/generic_scheduler_test.go
View file @
4f0bd412
...
...
@@ -409,7 +409,18 @@ func TestGenericScheduler(t *testing.T) {
pvcLister
:=
schedulertesting
.
FakePersistentVolumeClaimLister
(
pvcs
)
scheduler
:=
NewGenericScheduler
(
cache
,
nil
,
NewSchedulingQueue
(),
test
.
predicates
,
algorithm
.
EmptyPredicateMetadataProducer
,
test
.
prioritizers
,
algorithm
.
EmptyPriorityMetadataProducer
,
[]
algorithm
.
SchedulerExtender
{},
nil
,
pvcLister
,
test
.
alwaysCheckAllPredicates
)
cache
,
nil
,
NewSchedulingQueue
(),
test
.
predicates
,
algorithm
.
EmptyPredicateMetadataProducer
,
test
.
prioritizers
,
algorithm
.
EmptyPriorityMetadataProducer
,
[]
algorithm
.
SchedulerExtender
{},
nil
,
pvcLister
,
test
.
alwaysCheckAllPredicates
,
false
)
machine
,
err
:=
scheduler
.
Schedule
(
test
.
pod
,
schedulertesting
.
FakeNodeLister
(
makeNodeList
(
test
.
nodes
)))
if
!
reflect
.
DeepEqual
(
err
,
test
.
wErr
)
{
...
...
@@ -1323,7 +1334,18 @@ func TestPreempt(t *testing.T) {
extenders
=
append
(
extenders
,
extender
)
}
scheduler
:=
NewGenericScheduler
(
cache
,
nil
,
NewSchedulingQueue
(),
map
[
string
]
algorithm
.
FitPredicate
{
"matches"
:
algorithmpredicates
.
PodFitsResources
},
algorithm
.
EmptyPredicateMetadataProducer
,
[]
algorithm
.
PriorityConfig
{{
Function
:
numericPriority
,
Weight
:
1
}},
algorithm
.
EmptyPriorityMetadataProducer
,
extenders
,
nil
,
schedulertesting
.
FakePersistentVolumeClaimLister
{},
false
)
cache
,
nil
,
NewSchedulingQueue
(),
map
[
string
]
algorithm
.
FitPredicate
{
"matches"
:
algorithmpredicates
.
PodFitsResources
},
algorithm
.
EmptyPredicateMetadataProducer
,
[]
algorithm
.
PriorityConfig
{{
Function
:
numericPriority
,
Weight
:
1
}},
algorithm
.
EmptyPriorityMetadataProducer
,
extenders
,
nil
,
schedulertesting
.
FakePersistentVolumeClaimLister
{},
false
,
false
)
// Call Preempt and check the expected results.
node
,
victims
,
_
,
err
:=
scheduler
.
Preempt
(
test
.
pod
,
schedulertesting
.
FakeNodeLister
(
makeNodeList
(
nodeNames
)),
error
(
&
FitError
{
Pod
:
test
.
pod
,
FailedPredicates
:
failedPredMap
}))
if
err
!=
nil
{
...
...
pkg/scheduler/factory/factory.go
View file @
4f0bd412
...
...
@@ -133,6 +133,9 @@ type configFactory struct {
// always check all predicates even if the middle of one predicate fails.
alwaysCheckAllPredicates
bool
// Disable pod preemption or not.
disablePreemption
bool
}
// NewConfigFactory initializes the default implementation of a Configurator To encourage eventual privatization of the struct type, we only
...
...
@@ -152,6 +155,7 @@ func NewConfigFactory(
storageClassInformer
storageinformers
.
StorageClassInformer
,
hardPodAffinitySymmetricWeight
int32
,
enableEquivalenceClassCache
bool
,
disablePreemption
bool
,
)
scheduler
.
Configurator
{
stopEverything
:=
make
(
chan
struct
{})
schedulerCache
:=
schedulercache
.
New
(
30
*
time
.
Second
,
stopEverything
)
...
...
@@ -179,6 +183,7 @@ func NewConfigFactory(
schedulerName
:
schedulerName
,
hardPodAffinitySymmetricWeight
:
hardPodAffinitySymmetricWeight
,
enableEquivalenceClassCache
:
enableEquivalenceClassCache
,
disablePreemption
:
disablePreemption
,
}
c
.
scheduledPodsHasSynced
=
podInformer
.
Informer
()
.
HasSynced
...
...
@@ -1064,7 +1069,20 @@ func (c *configFactory) CreateFromKeys(predicateKeys, priorityKeys sets.String,
glog
.
Info
(
"Created equivalence class cache"
)
}
algo
:=
core
.
NewGenericScheduler
(
c
.
schedulerCache
,
c
.
equivalencePodCache
,
c
.
podQueue
,
predicateFuncs
,
predicateMetaProducer
,
priorityConfigs
,
priorityMetaProducer
,
extenders
,
c
.
volumeBinder
,
c
.
pVCLister
,
c
.
alwaysCheckAllPredicates
)
algo
:=
core
.
NewGenericScheduler
(
c
.
schedulerCache
,
c
.
equivalencePodCache
,
c
.
podQueue
,
predicateFuncs
,
predicateMetaProducer
,
priorityConfigs
,
priorityMetaProducer
,
extenders
,
c
.
volumeBinder
,
c
.
pVCLister
,
c
.
alwaysCheckAllPredicates
,
c
.
disablePreemption
,
)
podBackoff
:=
util
.
CreateDefaultPodBackoff
()
return
&
scheduler
.
Config
{
...
...
pkg/scheduler/factory/factory_test.go
View file @
4f0bd412
...
...
@@ -46,7 +46,10 @@ import (
"k8s.io/kubernetes/pkg/scheduler/util"
)
const
enableEquivalenceCache
=
true
const
(
enableEquivalenceCache
=
true
disablePodPreemption
=
false
)
func
TestCreate
(
t
*
testing
.
T
)
{
handler
:=
utiltesting
.
FakeHandler
{
...
...
@@ -533,6 +536,7 @@ func newConfigFactory(client *clientset.Clientset, hardPodAffinitySymmetricWeigh
informerFactory
.
Storage
()
.
V1
()
.
StorageClasses
(),
hardPodAffinitySymmetricWeight
,
enableEquivalenceCache
,
disablePodPreemption
,
)
}
...
...
pkg/scheduler/scheduler.go
View file @
4f0bd412
...
...
@@ -137,6 +137,9 @@ type Config struct {
// VolumeBinder handles PVC/PV binding for the pod.
VolumeBinder
*
volumebinder
.
VolumeBinder
// Disable pod preemption or not.
DisablePreemption
bool
}
// NewFromConfigurator returns a new scheduler that is created entirely by the Configurator. Assumes Create() is implemented.
...
...
@@ -207,8 +210,9 @@ 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
.
PodPriorityEnabled
()
{
glog
.
V
(
3
)
.
Infof
(
"Pod priority feature is not enabled. No preemption is performed."
)
if
!
util
.
PodPriorityEnabled
()
||
sched
.
config
.
DisablePreemption
{
glog
.
V
(
3
)
.
Infof
(
"Pod priority feature is not enabled or preemption is disabled by scheduler configuration."
+
" No preemption is performed."
)
return
""
,
nil
}
preemptor
,
err
:=
sched
.
config
.
PodPreemptor
.
GetUpdatedPod
(
preemptor
)
...
...
pkg/scheduler/scheduler_test.go
View file @
4f0bd412
...
...
@@ -548,6 +548,7 @@ func setupTestScheduler(queuedPodStore *clientcache.FIFO, scache schedulercache.
[]
algorithm
.
SchedulerExtender
{},
nil
,
schedulertesting
.
FakePersistentVolumeClaimLister
{},
false
,
false
)
bindingChan
:=
make
(
chan
*
v1
.
Binding
,
1
)
errChan
:=
make
(
chan
error
,
1
)
...
...
@@ -596,6 +597,7 @@ func setupTestSchedulerLongBindingWithRetry(queuedPodStore *clientcache.FIFO, sc
[]
algorithm
.
SchedulerExtender
{},
nil
,
schedulertesting
.
FakePersistentVolumeClaimLister
{},
false
,
false
)
bindingChan
:=
make
(
chan
*
v1
.
Binding
,
2
)
configurator
:=
&
FakeConfigurator
{
...
...
test/integration/scheduler/util.go
View file @
4f0bd412
...
...
@@ -85,6 +85,7 @@ func createConfiguratorWithPodInformer(
informerFactory
.
Storage
()
.
V1
()
.
StorageClasses
(),
v1
.
DefaultHardPodAffinitySymmetricWeight
,
utilfeature
.
DefaultFeatureGate
.
Enabled
(
features
.
EnableEquivalenceClassCache
),
false
,
)
}
...
...
test/integration/util/util.go
View file @
4f0bd412
...
...
@@ -112,5 +112,6 @@ func createSchedulerConfigurator(
informerFactory
.
Storage
()
.
V1
()
.
StorageClasses
(),
v1
.
DefaultHardPodAffinitySymmetricWeight
,
utilfeature
.
DefaultFeatureGate
.
Enabled
(
features
.
EnableEquivalenceClassCache
),
false
,
)
}
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