...

/

Scheduler Extender

Scheduler Extender

Learn how the Kubernetes scheduler extender works.

What is the scheduler extender?

A scheduler extender works as an external service. It isn’t another scheduler. Just as the name suggests, it simply extends the default Kubernetes scheduler with more customized features or implementations. That doesn’t mean we can customize everything in the default Kubernetes scheduler. But there are some extension points that we can include in our customized implementations.

Press + to interact
// https://github.com/kubernetes/kubernetes/blob/master/pkg/scheduler/framework/extender.go#L24-L72
// Extender 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 Extender 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.
// The failedNodes and failedAndUnresolvableNodes optionally contains the list
// of failed nodes and failure reasons, except nodes in the latter are
// unresolvable.
Filter(pod *v1.Pod, nodes []*v1.Node) (filteredNodes []*v1.Node, failedNodesMap extenderv1.FailedNodesMap, failedAndUnresolvable extenderv1.FailedNodesMap, err error)
// Prioritize based on extender-implemented priority functions
// The returned scores and weight are used to compute the weighted score for an extender.
// The weighted scores are added t 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
// sInterested() 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 the extender based on the following:
// 1. Pod to schedule
// 2. Candidate nodes and victim pods (nodeNameToVictims) generated by previous scheduling process.
// The possible changes made by extender may include:
// 1. Subset of given candidate nodes after the preemption phase of extender.
// 2. A different set of victim Pods for every given candidate node after the preemption phase of extender."
ProcessPreemption(
pod *v1.Pod,
nodeNameToVictims map[string]*extenderv1.Victims,
nodeInfos NodeInfoLister,
) (map[string]*extenderv1.Victims, error)
// The SupportsPreemption() function returns whether or not the scheduler extender supports preemption.
SupportsPreemption() bool
// The IsIgnorable() function returns true, which indicates that scheduling should not fail when this extender is unavailable.
// This gives the scheduler the ability to fail fast and tolerate non-critical extenders as well.
IsIgnorable() bool
}

Above is the extender interface, where we can add our extension implementations during the Filter, Preempt, Prioritize, and Bind phases. The Kubernetes scheduler extender works like a webhook. When Pod scheduling comes into these four phases, the kube-scheduler can call the extension logic registered by the extender.

Now, let’s take a closer look at how the scheduler extender works.

How the scheduler extender works

With the scheduler ...

Access this course and 1400+ top-rated courses and projects.