Merge pull request #122503 from sunbinnnnn/scheduler-extender-support-ignore-bind

Support ignore scheduler extender error when binding
This commit is contained in:
Kubernetes Prow Robot 2024-01-08 17:30:44 +01:00 committed by GitHub
commit 919d4624a0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
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

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

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 {