From d6b449b5c7d99632355cad553f19654aaa61009b Mon Sep 17 00:00:00 2001 From: zouyee Date: Tue, 21 Jan 2020 20:20:20 +0800 Subject: [PATCH] Move scheduler's SchedulerExtender interface to core/extenders.go Signed-off-by: Zou Nengren --- pkg/scheduler/BUILD | 2 - pkg/scheduler/algorithm/BUILD | 10 +-- .../algorithm/scheduler_interface.go | 71 ------------------- pkg/scheduler/core/BUILD | 2 - pkg/scheduler/core/extender.go | 53 +++++++++++++- pkg/scheduler/core/extender_test.go | 5 +- pkg/scheduler/core/generic_scheduler.go | 9 ++- pkg/scheduler/core/generic_scheduler_test.go | 9 ++- pkg/scheduler/factory.go | 9 ++- pkg/scheduler/scheduler_test.go | 13 ++-- 10 files changed, 71 insertions(+), 112 deletions(-) delete mode 100644 pkg/scheduler/algorithm/scheduler_interface.go diff --git a/pkg/scheduler/BUILD b/pkg/scheduler/BUILD index b6b9a926708..ab70977ff54 100644 --- a/pkg/scheduler/BUILD +++ b/pkg/scheduler/BUILD @@ -12,7 +12,6 @@ go_library( deps = [ "//pkg/api/v1/pod:go_default_library", "//pkg/features:go_default_library", - "//pkg/scheduler/algorithm:go_default_library", "//pkg/scheduler/algorithmprovider:go_default_library", "//pkg/scheduler/apis/config:go_default_library", "//pkg/scheduler/apis/config/scheme:go_default_library", @@ -62,7 +61,6 @@ go_test( "//pkg/api/testing:go_default_library", "//pkg/controller/volume/scheduling:go_default_library", "//pkg/features:go_default_library", - "//pkg/scheduler/algorithm:go_default_library", "//pkg/scheduler/apis/config:go_default_library", "//pkg/scheduler/apis/config/scheme:go_default_library", "//pkg/scheduler/apis/extender/v1:go_default_library", diff --git a/pkg/scheduler/algorithm/BUILD b/pkg/scheduler/algorithm/BUILD index a9b274ae904..f0d55650d20 100644 --- a/pkg/scheduler/algorithm/BUILD +++ b/pkg/scheduler/algorithm/BUILD @@ -2,17 +2,9 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", - srcs = [ - "doc.go", - "scheduler_interface.go", - ], + srcs = ["doc.go"], importpath = "k8s.io/kubernetes/pkg/scheduler/algorithm", visibility = ["//visibility:public"], - deps = [ - "//pkg/scheduler/apis/extender/v1:go_default_library", - "//pkg/scheduler/listers:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - ], ) filegroup( diff --git a/pkg/scheduler/algorithm/scheduler_interface.go b/pkg/scheduler/algorithm/scheduler_interface.go deleted file mode 100644 index 1965e969a24..00000000000 --- a/pkg/scheduler/algorithm/scheduler_interface.go +++ /dev/null @@ -1,71 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package algorithm - -import ( - "k8s.io/api/core/v1" - extenderv1 "k8s.io/kubernetes/pkg/scheduler/apis/extender/v1" - "k8s.io/kubernetes/pkg/scheduler/listers" -) - -// SchedulerExtender is an interface for external processes to influence scheduling -// decisions made by Kubernetes. This is typically needed for resources not directly -// managed by Kubernetes. -type SchedulerExtender interface { - // Name returns a unique name that identifies the extender. - Name() string - - // Filter based on extender-implemented predicate functions. The filtered list is - // expected to be a subset of the supplied list. failedNodesMap optionally contains - // the list of failed nodes and failure reasons. - Filter(pod *v1.Pod, nodes []*v1.Node) (filteredNodes []*v1.Node, failedNodesMap extenderv1.FailedNodesMap, err error) - - // Prioritize based on extender-implemented priority functions. The returned scores & weight - // are used to compute the weighted score for an extender. The weighted scores are added to - // the scores computed by Kubernetes scheduler. The total scores are used to do the host selection. - Prioritize(pod *v1.Pod, nodes []*v1.Node) (hostPriorities *extenderv1.HostPriorityList, weight int64, err error) - - // Bind delegates the action of binding a pod to a node to the extender. - Bind(binding *v1.Binding) error - - // IsBinder returns whether this extender is configured for the Bind method. - IsBinder() bool - - // IsInterested returns true if at least one extended resource requested by - // this pod is managed by this extender. - IsInterested(pod *v1.Pod) bool - - // ProcessPreemption returns nodes with their victim pods processed by extender based on - // given: - // 1. Pod to schedule - // 2. Candidate nodes and victim pods (nodeToVictims) generated by previous scheduling process. - // 3. nodeNameToInfo to restore v1.Node from node name if extender cache is enabled. - // The possible changes made by extender may include: - // 1. Subset of given candidate nodes after preemption phase of extender. - // 2. A different set of victim pod for every given candidate node after preemption phase of extender. - ProcessPreemption( - pod *v1.Pod, - nodeToVictims map[*v1.Node]*extenderv1.Victims, - nodeInfos listers.NodeInfoLister) (map[*v1.Node]*extenderv1.Victims, error) - - // SupportsPreemption returns if the scheduler extender support preemption or not. - SupportsPreemption() bool - - // IsIgnorable returns true indicates scheduling should not fail when this extender - // is unavailable. This gives scheduler ability to fail fast and tolerate non-critical extenders as well. - IsIgnorable() bool -} diff --git a/pkg/scheduler/core/BUILD b/pkg/scheduler/core/BUILD index 54c1bb834ef..f0c94c858d5 100644 --- a/pkg/scheduler/core/BUILD +++ b/pkg/scheduler/core/BUILD @@ -10,7 +10,6 @@ go_library( visibility = ["//visibility:public"], deps = [ "//pkg/api/v1/pod:go_default_library", - "//pkg/scheduler/algorithm:go_default_library", "//pkg/scheduler/apis/config:go_default_library", "//pkg/scheduler/apis/extender/v1:go_default_library", "//pkg/scheduler/framework/v1alpha1:go_default_library", @@ -45,7 +44,6 @@ go_test( embed = [":go_default_library"], deps = [ "//pkg/api/v1/pod:go_default_library", - "//pkg/scheduler/algorithm:go_default_library", "//pkg/scheduler/apis/config:go_default_library", "//pkg/scheduler/apis/extender/v1:go_default_library", "//pkg/scheduler/framework/plugins/defaultpodtopologyspread:go_default_library", diff --git a/pkg/scheduler/core/extender.go b/pkg/scheduler/core/extender.go index 7b4acdd90ec..11d33a7d04b 100644 --- a/pkg/scheduler/core/extender.go +++ b/pkg/scheduler/core/extender.go @@ -28,7 +28,6 @@ import ( utilnet "k8s.io/apimachinery/pkg/util/net" "k8s.io/apimachinery/pkg/util/sets" restclient "k8s.io/client-go/rest" - "k8s.io/kubernetes/pkg/scheduler/algorithm" schedulerapi "k8s.io/kubernetes/pkg/scheduler/apis/config" extenderv1 "k8s.io/kubernetes/pkg/scheduler/apis/extender/v1" "k8s.io/kubernetes/pkg/scheduler/listers" @@ -40,7 +39,55 @@ const ( DefaultExtenderTimeout = 5 * time.Second ) -// HTTPExtender implements the algorithm.SchedulerExtender interface. +// SchedulerExtender is an interface for external processes to influence scheduling +// decisions made by Kubernetes. This is typically needed for resources not directly +// managed by Kubernetes. +type SchedulerExtender interface { + // Name returns a unique name that identifies the extender. + Name() string + + // Filter based on extender-implemented predicate functions. The filtered list is + // expected to be a subset of the supplied list. failedNodesMap optionally contains + // the list of failed nodes and failure reasons. + Filter(pod *v1.Pod, nodes []*v1.Node) (filteredNodes []*v1.Node, failedNodesMap extenderv1.FailedNodesMap, err error) + + // Prioritize based on extender-implemented priority functions. The returned scores & weight + // are used to compute the weighted score for an extender. The weighted scores are added to + // the scores computed by Kubernetes scheduler. The total scores are used to do the host selection. + Prioritize(pod *v1.Pod, nodes []*v1.Node) (hostPriorities *extenderv1.HostPriorityList, weight int64, err error) + + // Bind delegates the action of binding a pod to a node to the extender. + Bind(binding *v1.Binding) error + + // IsBinder returns whether this extender is configured for the Bind method. + IsBinder() bool + + // IsInterested returns true if at least one extended resource requested by + // this pod is managed by this extender. + IsInterested(pod *v1.Pod) bool + + // ProcessPreemption returns nodes with their victim pods processed by extender based on + // given: + // 1. Pod to schedule + // 2. Candidate nodes and victim pods (nodeToVictims) generated by previous scheduling process. + // 3. nodeNameToInfo to restore v1.Node from node name if extender cache is enabled. + // The possible changes made by extender may include: + // 1. Subset of given candidate nodes after preemption phase of extender. + // 2. A different set of victim pod for every given candidate node after preemption phase of extender. + ProcessPreemption( + pod *v1.Pod, + nodeToVictims map[*v1.Node]*extenderv1.Victims, + nodeInfos listers.NodeInfoLister) (map[*v1.Node]*extenderv1.Victims, error) + + // SupportsPreemption returns if the scheduler extender support preemption or not. + SupportsPreemption() bool + + // IsIgnorable returns true indicates scheduling should not fail when this extender + // is unavailable. This gives scheduler ability to fail fast and tolerate non-critical extenders as well. + IsIgnorable() bool +} + +// HTTPExtender implements the SchedulerExtender interface. type HTTPExtender struct { extenderURL string preemptVerb string @@ -85,7 +132,7 @@ func makeTransport(config *schedulerapi.Extender) (http.RoundTripper, error) { } // NewHTTPExtender creates an HTTPExtender object. -func NewHTTPExtender(config *schedulerapi.Extender) (algorithm.SchedulerExtender, error) { +func NewHTTPExtender(config *schedulerapi.Extender) (SchedulerExtender, error) { if config.HTTPTimeout.Nanoseconds() == 0 { config.HTTPTimeout = time.Duration(DefaultExtenderTimeout) } diff --git a/pkg/scheduler/core/extender_test.go b/pkg/scheduler/core/extender_test.go index 2e9db9142ef..eec65a2ae42 100644 --- a/pkg/scheduler/core/extender_test.go +++ b/pkg/scheduler/core/extender_test.go @@ -33,7 +33,6 @@ import ( "k8s.io/client-go/informers" clientsetfake "k8s.io/client-go/kubernetes/fake" podutil "k8s.io/kubernetes/pkg/api/v1/pod" - "k8s.io/kubernetes/pkg/scheduler/algorithm" schedulerapi "k8s.io/kubernetes/pkg/scheduler/apis/config" extenderv1 "k8s.io/kubernetes/pkg/scheduler/apis/extender/v1" "k8s.io/kubernetes/pkg/scheduler/framework/plugins/queuesort" @@ -353,7 +352,7 @@ func (f *FakeExtender) IsInterested(pod *v1.Pod) bool { return !f.unInterested } -var _ algorithm.SchedulerExtender = &FakeExtender{} +var _ SchedulerExtender = &FakeExtender{} func TestGenericSchedulerWithExtenders(t *testing.T) { tests := []struct { @@ -566,7 +565,7 @@ func TestGenericSchedulerWithExtenders(t *testing.T) { client := clientsetfake.NewSimpleClientset() informerFactory := informers.NewSharedInformerFactory(client, 0) - extenders := []algorithm.SchedulerExtender{} + extenders := []SchedulerExtender{} for ii := range test.extenders { extenders = append(extenders, &test.extenders[ii]) } diff --git a/pkg/scheduler/core/generic_scheduler.go b/pkg/scheduler/core/generic_scheduler.go index 339aa9ecdcf..5b675935a64 100644 --- a/pkg/scheduler/core/generic_scheduler.go +++ b/pkg/scheduler/core/generic_scheduler.go @@ -37,7 +37,6 @@ import ( policylisters "k8s.io/client-go/listers/policy/v1beta1" "k8s.io/client-go/util/workqueue" podutil "k8s.io/kubernetes/pkg/api/v1/pod" - "k8s.io/kubernetes/pkg/scheduler/algorithm" extenderv1 "k8s.io/kubernetes/pkg/scheduler/apis/extender/v1" framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1" internalcache "k8s.io/kubernetes/pkg/scheduler/internal/cache" @@ -111,7 +110,7 @@ type ScheduleAlgorithm interface { Preempt(context.Context, *framework.CycleState, *v1.Pod, error) (selectedNode *v1.Node, preemptedPods []*v1.Pod, cleanupNominatedPods []*v1.Pod, err error) // Prioritizers returns a slice of priority config. This is exposed for // testing. - Extenders() []algorithm.SchedulerExtender + Extenders() []SchedulerExtender // Snapshot snapshots scheduler cache and node infos. This is needed // for cluster autoscaler integration. // TODO(#85691): remove this once CA migrates to creating a Framework instead of a full scheduler. @@ -136,7 +135,7 @@ type genericScheduler struct { cache internalcache.Cache schedulingQueue internalqueue.SchedulingQueue framework framework.Framework - extenders []algorithm.SchedulerExtender + extenders []SchedulerExtender nodeInfoSnapshot *internalcache.Snapshot volumeBinder *volumebinder.VolumeBinder pvcLister corelisters.PersistentVolumeClaimLister @@ -241,7 +240,7 @@ func (g *genericScheduler) Schedule(ctx context.Context, state *framework.CycleS }, err } -func (g *genericScheduler) Extenders() []algorithm.SchedulerExtender { +func (g *genericScheduler) Extenders() []SchedulerExtender { return g.extenders } @@ -1098,7 +1097,7 @@ func NewGenericScheduler( podQueue internalqueue.SchedulingQueue, nodeInfoSnapshot *internalcache.Snapshot, framework framework.Framework, - extenders []algorithm.SchedulerExtender, + extenders []SchedulerExtender, volumeBinder *volumebinder.VolumeBinder, pvcLister corelisters.PersistentVolumeClaimLister, pdbLister policylisters.PodDisruptionBudgetLister, diff --git a/pkg/scheduler/core/generic_scheduler_test.go b/pkg/scheduler/core/generic_scheduler_test.go index 974bec21547..c8ea4fcf7be 100644 --- a/pkg/scheduler/core/generic_scheduler_test.go +++ b/pkg/scheduler/core/generic_scheduler_test.go @@ -36,7 +36,6 @@ import ( "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/informers" clientsetfake "k8s.io/client-go/kubernetes/fake" - "k8s.io/kubernetes/pkg/scheduler/algorithm" schedulerapi "k8s.io/kubernetes/pkg/scheduler/apis/config" extenderv1 "k8s.io/kubernetes/pkg/scheduler/apis/extender/v1" "k8s.io/kubernetes/pkg/scheduler/framework/plugins/defaultpodtopologyspread" @@ -807,7 +806,7 @@ func TestGenericScheduler(t *testing.T) { internalqueue.NewSchedulingQueue(nil), snapshot, fwk, - []algorithm.SchedulerExtender{}, + []SchedulerExtender{}, nil, pvcLister, informerFactory.Policy().V1beta1().PodDisruptionBudgets().Lister(), @@ -1152,7 +1151,7 @@ func TestZeroRequest(t *testing.T) { nil, emptySnapshot, fwk, - []algorithm.SchedulerExtender{}, + []SchedulerExtender{}, nil, nil, nil, @@ -1611,7 +1610,7 @@ func TestSelectNodesForPreemption(t *testing.T) { internalqueue.NewSchedulingQueue(nil), snapshot, fwk, - []algorithm.SchedulerExtender{}, + []SchedulerExtender{}, nil, nil, informerFactory.Policy().V1beta1().PodDisruptionBudgets().Lister(), @@ -2374,7 +2373,7 @@ func TestPreempt(t *testing.T) { cachedNodeInfo.SetNode(node) cachedNodeInfoMap[node.Name] = cachedNodeInfo } - var extenders []algorithm.SchedulerExtender + var extenders []SchedulerExtender for _, extender := range test.extenders { // Set nodeInfoMap as extenders cached node information. extender.cachedNodeNameToInfo = cachedNodeInfoMap diff --git a/pkg/scheduler/factory.go b/pkg/scheduler/factory.go index d372fb264f6..8df07f97826 100644 --- a/pkg/scheduler/factory.go +++ b/pkg/scheduler/factory.go @@ -37,7 +37,6 @@ import ( "k8s.io/client-go/tools/cache" "k8s.io/klog" kubefeatures "k8s.io/kubernetes/pkg/features" - "k8s.io/kubernetes/pkg/scheduler/algorithm" "k8s.io/kubernetes/pkg/scheduler/algorithmprovider" schedulerapi "k8s.io/kubernetes/pkg/scheduler/apis/config" "k8s.io/kubernetes/pkg/scheduler/apis/config/validation" @@ -110,7 +109,7 @@ type Configurator struct { } // create a scheduler from a set of registered plugins. -func (c *Configurator) create(extenders []algorithm.SchedulerExtender) (*Scheduler, error) { +func (c *Configurator) create(extenders []core.SchedulerExtender) (*Scheduler, error) { framework, err := framework.NewFramework( c.registry, c.plugins, @@ -186,7 +185,7 @@ func (c *Configurator) createFromProvider(providerName string) (*Scheduler, erro pluginConfig = append(pluginConfig, c.pluginConfig...) c.pluginConfig = pluginConfig - return c.create([]algorithm.SchedulerExtender{}) + return c.create([]core.SchedulerExtender{}) } // createFromConfig creates a scheduler from the configuration file @@ -227,9 +226,9 @@ func (c *Configurator) createFromConfig(policy schedulerapi.Policy) (*Scheduler, } } - var extenders []algorithm.SchedulerExtender + var extenders []core.SchedulerExtender if len(policy.Extenders) != 0 { - var ignorableExtenders []algorithm.SchedulerExtender + var ignorableExtenders []core.SchedulerExtender var ignoredExtendedResources []string for ii := range policy.Extenders { klog.V(2).Infof("Creating extender with config %+v", policy.Extenders[ii]) diff --git a/pkg/scheduler/scheduler_test.go b/pkg/scheduler/scheduler_test.go index 1417bd97725..3e8bbb882ba 100644 --- a/pkg/scheduler/scheduler_test.go +++ b/pkg/scheduler/scheduler_test.go @@ -44,7 +44,6 @@ import ( clientcache "k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/events" volumescheduling "k8s.io/kubernetes/pkg/controller/volume/scheduling" - "k8s.io/kubernetes/pkg/scheduler/algorithm" schedulerapi "k8s.io/kubernetes/pkg/scheduler/apis/config" "k8s.io/kubernetes/pkg/scheduler/core" frameworkplugins "k8s.io/kubernetes/pkg/scheduler/framework/plugins" @@ -144,7 +143,7 @@ func (es mockScheduler) Schedule(ctx context.Context, state *framework.CycleStat return es.result, es.err } -func (es mockScheduler) Extenders() []algorithm.SchedulerExtender { +func (es mockScheduler) Extenders() []core.SchedulerExtender { return nil } func (es mockScheduler) Preempt(ctx context.Context, state *framework.CycleState, pod *v1.Pod, scheduleErr error) (*v1.Node, []*v1.Pod, []*v1.Pod, error) { @@ -614,7 +613,7 @@ func setupTestScheduler(queuedPodStore *clientcache.FIFO, scache internalcache.C internalqueue.NewSchedulingQueue(nil), internalcache.NewEmptySnapshot(), fwk, - []algorithm.SchedulerExtender{}, + []core.SchedulerExtender{}, nil, informerFactory.Core().V1().PersistentVolumeClaims().Lister(), informerFactory.Policy().V1beta1().PodDisruptionBudgets().Lister(), @@ -941,14 +940,14 @@ priorities: func TestSchedulerBinding(t *testing.T) { table := []struct { podName string - extenders []algorithm.SchedulerExtender + extenders []core.SchedulerExtender wantBinderID int name string }{ { name: "the extender is not a binder", podName: "pod0", - extenders: []algorithm.SchedulerExtender{ + extenders: []core.SchedulerExtender{ &fakeExtender{isBinder: false, interestedPodName: "pod0"}, }, wantBinderID: -1, // default binding. @@ -956,7 +955,7 @@ func TestSchedulerBinding(t *testing.T) { { name: "one of the extenders is a binder and interested in pod", podName: "pod0", - extenders: []algorithm.SchedulerExtender{ + extenders: []core.SchedulerExtender{ &fakeExtender{isBinder: false, interestedPodName: "pod0"}, &fakeExtender{isBinder: true, interestedPodName: "pod0"}, }, @@ -965,7 +964,7 @@ func TestSchedulerBinding(t *testing.T) { { name: "one of the extenders is a binder, but not interested in pod", podName: "pod1", - extenders: []algorithm.SchedulerExtender{ + extenders: []core.SchedulerExtender{ &fakeExtender{isBinder: false, interestedPodName: "pod1"}, &fakeExtender{isBinder: true, interestedPodName: "pod0"}, },