diff --git a/pkg/scheduler/framework/extender.go b/pkg/scheduler/framework/extender.go index 9a7a104a17c..e6da687df48 100644 --- a/pkg/scheduler/framework/extender.go +++ b/pkg/scheduler/framework/extender.go @@ -71,5 +71,6 @@ type Extender interface { // 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. + // Both Filter and Bind actions are supported. IsIgnorable() bool } diff --git a/pkg/scheduler/schedule_one.go b/pkg/scheduler/schedule_one.go index 0af3b1f3528..ef316d21b00 100644 --- a/pkg/scheduler/schedule_one.go +++ b/pkg/scheduler/schedule_one.go @@ -944,7 +944,7 @@ func (sched *Scheduler) bind(ctx context.Context, fwk framework.Framework, assum sched.finishBinding(logger, fwk, assumed, targetNode, status) }() - bound, err := sched.extendersBinding(assumed, targetNode) + bound, err := sched.extendersBinding(logger, assumed, targetNode) if bound { return framework.AsStatus(err) } @@ -952,15 +952,20 @@ func (sched *Scheduler) bind(ctx context.Context, fwk framework.Framework, assum } // TODO(#87159): Move this to a Plugin. -func (sched *Scheduler) extendersBinding(pod *v1.Pod, node string) (bool, error) { +func (sched *Scheduler) extendersBinding(logger klog.Logger, pod *v1.Pod, node string) (bool, error) { for _, extender := range sched.Extenders { if !extender.IsBinder() || !extender.IsInterested(pod) { continue } - return true, extender.Bind(&v1.Binding{ + err := extender.Bind(&v1.Binding{ ObjectMeta: metav1.ObjectMeta{Namespace: pod.Namespace, Name: pod.Name, UID: pod.UID}, Target: v1.ObjectReference{Kind: "Node", Name: node}, }) + if err != nil && extender.IsIgnorable() { + logger.Info("Skipping extender in bind as it returned error and has ignorable flag set", "extender", extender, "err", err) + continue + } + return true, err } return false, nil } diff --git a/pkg/scheduler/schedule_one_test.go b/pkg/scheduler/schedule_one_test.go index a85873a5270..06a01eeb905 100644 --- a/pkg/scheduler/schedule_one_test.go +++ b/pkg/scheduler/schedule_one_test.go @@ -92,6 +92,7 @@ type fakeExtender struct { ignorable bool gotBind bool isPrioritizer bool + errBind bool } func (f *fakeExtender) Name() string { @@ -127,6 +128,9 @@ func (f *fakeExtender) Prioritize( func (f *fakeExtender) Bind(binding *v1.Binding) error { if f.isBinder { + if f.errBind { + return errors.New("bind error") + } f.gotBind = true return nil } @@ -1223,6 +1227,14 @@ func TestSchedulerBinding(t *testing.T) { }, wantBinderID: -1, // default binding. }, + { + name: "ignore when extender bind failed", + podName: "pod1", + extenders: []framework.Extender{ + &fakeExtender{isBinder: true, errBind: true, interestedPodName: "pod1", ignorable: true}, + }, + wantBinderID: -1, // default binding. + }, } for _, test := range table {