diff --git a/pkg/scheduler/extender.go b/pkg/scheduler/extender.go index ce44e45e87f..aa7f83c7c89 100644 --- a/pkg/scheduler/extender.go +++ b/pkg/scheduler/extender.go @@ -383,6 +383,11 @@ func (h *HTTPExtender) IsBinder() bool { return h.bindVerb != "" } +// IsPrioritizer returns whether this extender is configured for the Prioritize method. +func (h *HTTPExtender) IsPrioritizer() bool { + return h.prioritizeVerb != "" +} + // Helper function to send messages to the extender func (h *HTTPExtender) send(action string, args interface{}, result interface{}) error { out, err := json.Marshal(args) diff --git a/pkg/scheduler/framework/extender.go b/pkg/scheduler/framework/extender.go index 6dd888891d4..9a7a104a17c 100644 --- a/pkg/scheduler/framework/extender.go +++ b/pkg/scheduler/framework/extender.go @@ -50,6 +50,9 @@ type Extender interface { // this pod is managed by this extender. IsInterested(pod *v1.Pod) bool + // IsPrioritizer returns whether this extender is configured for the Prioritize method. + IsPrioritizer() bool + // ProcessPreemption returns nodes with their victim pods processed by extender based on // given: // 1. Pod to schedule diff --git a/pkg/scheduler/schedule_one.go b/pkg/scheduler/schedule_one.go index 0aecd396c55..15ea7def6cd 100644 --- a/pkg/scheduler/schedule_one.go +++ b/pkg/scheduler/schedule_one.go @@ -544,6 +544,19 @@ func (sched *Scheduler) evaluateNominatedNode(ctx context.Context, pod *v1.Pod, return feasibleNodes, nil } +// hasScoring checks if scoring nodes is configured. +func (sched *Scheduler) hasScoring(fwk framework.Framework) bool { + if fwk.HasScorePlugins() { + return true + } + for _, extender := range sched.Extenders { + if extender.IsPrioritizer() { + return true + } + } + return false +} + // findNodesThatPassFilters finds the nodes that fit the filter plugins. func (sched *Scheduler) findNodesThatPassFilters( ctx context.Context, @@ -554,6 +567,9 @@ func (sched *Scheduler) findNodesThatPassFilters( nodes []*framework.NodeInfo) ([]*framework.NodeInfo, error) { numAllNodes := len(nodes) numNodesToFind := sched.numFeasibleNodesToFind(fwk.PercentageOfNodesToScore(), int32(numAllNodes)) + if !sched.hasScoring(fwk) { + numNodesToFind = 1 + } // Create feasible list with enough space to avoid growing it // and allow assigning. diff --git a/pkg/scheduler/schedule_one_test.go b/pkg/scheduler/schedule_one_test.go index 5efdde23da7..6e0291bc7a4 100644 --- a/pkg/scheduler/schedule_one_test.go +++ b/pkg/scheduler/schedule_one_test.go @@ -91,6 +91,7 @@ type fakeExtender struct { interestedPodName string ignorable bool gotBind bool + isPrioritizer bool } func (f *fakeExtender) Name() string { @@ -140,6 +141,10 @@ func (f *fakeExtender) IsInterested(pod *v1.Pod) bool { return pod != nil && pod.Name == f.interestedPodName } +func (f *fakeExtender) IsPrioritizer() bool { + return f.isPrioritizer +} + type falseMapPlugin struct{} func newFalseMapPlugin() frameworkruntime.PluginFactory { diff --git a/pkg/scheduler/testing/framework/fake_extender.go b/pkg/scheduler/testing/framework/fake_extender.go index 1a525368113..fa9479ff26a 100644 --- a/pkg/scheduler/testing/framework/fake_extender.go +++ b/pkg/scheduler/testing/framework/fake_extender.go @@ -380,6 +380,11 @@ func (f *FakeExtender) IsBinder() bool { return true } +// IsPrioritizer returns true if there are any prioritizers. +func (f *FakeExtender) IsPrioritizer() bool { + return len(f.Prioritizers) > 0 +} + // IsInterested returns a bool indicating whether this extender is interested in this Pod. func (f *FakeExtender) IsInterested(pod *v1.Pod) bool { return !f.UnInterested