Support ignore scheduler extender error when binding

Signed-off-by: sunbinnnnn <sunbinnnnn@hotmail.com>
This commit is contained in:
Neil Sun 2023-12-28 14:08:09 +08:00 committed by sunbinnnnn
parent 1b6b3ba013
commit 87816ffb2c
3 changed files with 21 additions and 3 deletions

View File

@ -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
}

View File

@ -942,7 +942,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)
}
@ -950,15 +950,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
}

View File

@ -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 {