From e729a944398a288004ddcd7c664812bc94da3225 Mon Sep 17 00:00:00 2001 From: Jan Chaloupka Date: Wed, 31 Mar 2021 12:37:44 +0200 Subject: [PATCH] sig-scheduling: Scheduler code hierarchy overview --- .../default_scheduler_architecture.png | Bin 0 -> 28576 bytes .../scheduling_code_hierarchy_overview.md | 286 ++++++++++++++++++ 2 files changed, 286 insertions(+) create mode 100644 contributors/devel/sig-scheduling/default_scheduler_architecture.png create mode 100644 contributors/devel/sig-scheduling/scheduling_code_hierarchy_overview.md diff --git a/contributors/devel/sig-scheduling/default_scheduler_architecture.png b/contributors/devel/sig-scheduling/default_scheduler_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..f742b8b27f65c34c567320853cc2c2ba7e83fc7e GIT binary patch literal 28576 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 CruQHK literal 0 HcmV?d00001 diff --git a/contributors/devel/sig-scheduling/scheduling_code_hierarchy_overview.md b/contributors/devel/sig-scheduling/scheduling_code_hierarchy_overview.md new file mode 100644 index 000000000..006fea708 --- /dev/null +++ b/contributors/devel/sig-scheduling/scheduling_code_hierarchy_overview.md @@ -0,0 +1,286 @@ +# Scheduler code hierarchy overview + +## Introduction + +The scheduler watches for newly created Pods that have no Node assigned. +For every Pod that the scheduler discovers, the scheduler becomes responsible +for finding the best Node for that Pod to run on. +Scheduling in general is quite an extensive field in computer science which takes +into account various range of constraints and limitations. +Each workload may require a different approach to achieve optimal scheduling results. +The kube-scheduler provided by Kubernetes project was constructed with a goal +to provide high throughput at the cost of being simple. +To help in building a scheduler (the default or a custom one) and to share +elements of the scheduling logic, +[the scheduling framework](https://kubernetes.io/docs/concepts/scheduling-eviction/scheduling-framework/) +was implemented. +The framework does not provide all pieces to build a new scheduler from scratch. +Queues, caches, scheduling algorithms and other building elements are still needed to assemble +a fully functional unit. This document aims at describing how all the individual +pieces are put together and what’s their role in the overall architecture +so a developer can quickly orient in the code. + +## Scheduling a pod + +The default scheduler instance has a loop running indefinitely +which (everytime there’s a pod) is responsible for invoking the scheduling logic +and making sure a pod gets either a node assigned or requeued for future processing. +Each loop consists of a blocking scheduling and a non-blocking binding cycle. +The scheduling cycle is responsible for running the scheduling algorithm selecting +the most suitable node for placing the pod. +The binding cycle makes sure the kube-apiserver is made aware of the selected +node at the right time. A pod may be bound immediately, or in the case of gang scheduling, +wait until all its sibling pods have their node assigned. + +### Scheduling cycle + +Each cycle honors the following steps: +1. Get the next pod for scheduling +1. Schedule a pod with provided algorithm +1. If a pod fails to be scheduled due to `FitError`, run preemption plugin in + `PostFilterPlugin` (if the plugin is registered) to nominate a node where + the pods can run. If preemption was successful, + let the current pod be aware of the nominated node. + Handle the error, get the next pod and start over. +1. If the scheduling algorithm finds a suitable node, store the pod into + the scheduler cache (`AssumePod` operation) and run plugins from the `Reserve` + and `Permit` extension point in that order. In case any of the plugins fails, + end the current scheduling cycle, increase relevant metrics and handle + the scheduling error through the `Error` handler. +1. Upon successfully running all extension points, proceed to the binding cycle. + At the same time start processing another pod (if there’s any). + +### Binding cycle + +Consists of the following four steps ran in the same order: +- Invoking [WaitOnPermit](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler/scheduler.go#L560) + (internal API) of plugins from `Permit` extension point. Some plugins from the extension point + may send a request for an operation requiring to wait for a condition + (e.g. wait for additional resources to be available or wait for all pods + in a gang to be assumed). + Under the hood, `WaitOnPermit` waits for such a condition to be met within a timeout threshold. +- Invoking plugins from [PreBind](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler/scheduler.go#L580) extension point +- Invoking plugins from [Bind](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler/scheduler.go#L592) extension point +- Invoking plugins from [PostBind](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler/scheduler.go#L611) extension point + +In case of processing of any of the extension points fails, `Unreserve` operation +of all `Reserve` plugins is invoked (e.g. free resources allocated for a gang of pods). + +## Configuring and assembling the scheduler + +The scheduler codebase spans across various locations. Last but not least to mention: +- [cmd/kube-scheduler/app](https://github.com/kubernetes/kubernetes/tree/a651804427dd9a15bb91e1c4fb7a79994e4817a2/cmd/kube-scheduler/app): + location of the controller code alongside definition of CLI arguments (honors the standard setup for all Kubernetes controllers) +- [pkg/scheduler](https://github.com/kubernetes/kubernetes/tree/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler): + the default scheduler codebase root directory +- [pkg/scheduler/core](https://github.com/kubernetes/kubernetes/tree/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler/core): + location of the default scheduling algorithm +- [pkg/scheduler/framework](https://github.com/kubernetes/kubernetes/tree/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler/framework): + scheduling framework alongside plugins +- [pkg/scheduler/internal](https://github.com/kubernetes/kubernetes/tree/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler/internal): + implementation of the cache, queues and other internal elements +- [staging/src/k8s.io/kube-scheduler](https://github.com/kubernetes/kubernetes/tree/a651804427dd9a15bb91e1c4fb7a79994e4817a2/staging/src/k8s.io/kube-scheduler): + location of ComponentConfig API types +- [test/e2e/scheduling](https://github.com/kubernetes/kubernetes/tree/a651804427dd9a15bb91e1c4fb7a79994e4817a2/test/e2e/scheduling): + scheduling e2e +- [test/integration/scheduler](https://github.com/kubernetes/kubernetes/tree/a651804427dd9a15bb91e1c4fb7a79994e4817a2/test/integration/scheduler) + scheduling integration tests +- [test/integration/scheduler_perf](https://github.com/kubernetes/kubernetes/tree/a651804427dd9a15bb91e1c4fb7a79994e4817a2/test/integration/scheduler_perf) + scheduling performance benchmarks + +### Initial startup configuration + +Code under `cmd/kube-scheduler/app` is responsible for collecting scheduler +configuration and initializing logic allowing the kube-scheduler to run +as part of the Kubernetes control plane. The code includes: +- Initializing [command line options](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/cmd/kube-scheduler/app/server.go#L96) + (along with a default `ComponentConfig`) and [validation](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/cmd/kube-scheduler/app/server.go#L300) +- Initializing [metrics](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/cmd/kube-scheduler/app/server.go#L238) + (`/metrics`), [health check](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/cmd/kube-scheduler/app/server.go#L268) + (`/healthz`) and [other handlers](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/cmd/kube-scheduler/app/server.go#L225-L236) + (authorization, authentication, panic recovery, etc.) +- Reading and defaulting configuration of [KubeSchedulerConfiguration](https://github.com/kubernetes/kubernetes/blob/4740173f3378ef9d0dc59b0aa9299444a97d0818/pkg/scheduler/apis/config/types.go#L49-L106) +- Building a registry with plugins (in-tree, [out-of-tree](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/cmd/kube-scheduler/app/server.go#L312-L317)) +- Initializing the scheduler with various options such as [profiles, algorithm source, pod back off, etc.](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/cmd/kube-scheduler/app/server.go#L326-L337) +- Invocation of [LogOrWriteConfig](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/cmd/kube-scheduler/app/server.go#L342) which logs the final scheduler configuration for debugging purposes +- Right before running, `/configz` [is registered](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/cmd/kube-scheduler/app/server.go#L141), + [events broadcaster started](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/cmd/kube-scheduler/app/server.go#L148), + [leader election initiated](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/cmd/kube-scheduler/app/server.go#L198-L216), + and [the server](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/cmd/kube-scheduler/app/server.go#L185) + with all the configured handlers and [informers](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/cmd/kube-scheduler/app/server.go#L192) + is started. + +Once initialized, the scheduler can run. + +In more detail, there’s a [Setup](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/cmd/kube-scheduler/app/server.go#L299) +function accomplishing what is essentially +the initialization of the scheduler’s core process. +First, it validates the options that have been passed through (the flags added +in `NewSchedulerCommand()` are set directly on this options struct’s fields). +If the options passed so far don’t raise any errors, it then calls `opts.Config()` +which sets up the final internal settings including secure serving, leader election, +clients, and begins parsing options related to the algorithm source +(like loading config files and initializing empty profiles as well as handling +deprecated options like policy config). The next lines call `c.Complete()` to complete +the config by filling in any empty values. At this point any out-of-tree plugins +are registered by creating a blank registry and adding entries in that registry +for each plugin’s New function. It should be noted that the Registry is simply +a map of plugin names to their factory functions. For the default scheduler, +this step does nothing (because our main function in `cmd/kube-scheduler/scheduler.go` +passes nothing to `NewSchedulerCommand()`). +This means the default set of plugins is initialized in `scheduler.New()`. + +Given the initialization is performed outside the scheduling framework, +different consumers of the framework can initialize the environment differently +to cover their needs. For example, a simulator can inject its own object +through informers. Or custom plugins may be provided instead of the default ones. +Known consumers of the scheduling framework: +- [cluster-autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/simulator/scheduler_based_predicates_checker.go#L48-L79) +- [cluster-capacity](https://github.com/kubernetes-sigs/cluster-capacity/blob/8e9c2dcf3644cb5f73fca3d35d4e22899c265ad5/pkg/framework/simulator.go#L370-L383) + +### Assembling the scheduler + +The code is located under `pkg/scheduler`. +This is where implementation of the default scheduler lives. +Various elements of the scheduler are initialized and put together here: +- Default scheduling options such as node percentage, initial and maximum backoff, profiles +- Scheduler cache and queues +- Scheduling profiles instantiated to tailor a framework for each profile + to better suit pod placement (each profile defines a set of plugins to use) +- Handler functions for getting the next pod for scheduling (`NextPod`) and error handling (`Error`) + +The following steps are taken during the process of creating a scheduler instance: +- Scheduler [cache is initialized](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler/scheduler.go#L206) +- Both in-tree and out-of-tree registries with plugins are [merged together](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler/scheduler.go#L208-L211) +- Metrics are [registered](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler/scheduler.go#L232) +- [Configurator](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler/scheduler.go#L215-L230) + building a scheduler instance (wiring the cache, plugin registry, + scheduling algorithm and other elements together) +- Event handlers [are registered](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler/scheduler.go#L273) + to allow the scheduler to react on changes in PVs, + PVCs, services and other objects relevant for scheduling (eventually, + each plugin will define a set of events on which it reacts, + see [kubernetes/kubernetes#100347](https://github.com/kubernetes/kubernetes/issues/100347) + for more details). + +The following diagram shows how individual elements are connected together +once initialized. Event handlers make sure pods are properly enqueued +in the [scheduling queues](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-scheduling/scheduler_queues.md), +the cache is updated with pods and nodes +as they go (to provide up-to-date snapshot). Scheduling algorithm and the binding cycle +have the right instances of the framework available (one instance of the framework per a profile). + +![Scheduler architecture](default_scheduler_architecture.png "Scheduler architecture") + +#### Scheduling framework + +Its code is currently located under `pkg/scheduler/framework`. +It contains [various plugins](https://github.com/kubernetes/kubernetes/tree/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler/framework/plugins) +responsible for filtering and scoring nodes (among others). +Used as building blocks for any scheduling algorithm. + +When a [plugin is initialized](https://github.com/kubernetes/kubernetes/blob/4740173f3378ef9d0dc59b0aa9299444a97d0818/pkg/scheduler/framework/runtime/framework.go#L310), +it’s passed a [framework handler](https://github.com/kubernetes/kubernetes/blob/4740173f3378ef9d0dc59b0aa9299444a97d0818/pkg/scheduler/framework/runtime/framework.go#L251-L264) +which provides interfaces to access and/or manipulate pods, nodes, clientset, +event recorder and other handlers every plugin needs to implement its functionality. + +#### Scheduler cache + +Cache is responsible for capturing the current state of a cluster. +Keeping a list of nodes and assumed pods alongside states of pods and images. +The cache provides methods for reconciling pod and node objects +(invoked through event handlers) keeping the state of the cluster up to date. +Allowing to update the snapshot of a cluster (to pin the cluster state while a scheduling +algorithm is run) with the latest state at the beginning of each scheduling cycle. + +The cache also allows to run assume operation which temporarily stores a pod +in the cache and makes it look as the pod is actually already +running on a designated node for all consumers of the snapshot. +Assume operation exists to remove the time the pod actually gets updated +on the kube-apiserver side and thus increasing the scheduler’s throughput. +The following operations manipulate with the assumed pods: +- `AssumePod`: to signal the scheduling algorithm found a feasible node so the next + pod can be attempted while the current pod enters the binding cycle +- `FinishBinding`: used to signal Bind finished so the pod can be removed + from the list of assumed pods +- `ForgetPod`: removes pod from the list of assumed pods, used in case the pod + fails to get processed in the binding cycle successfully + (e.g. during `Reserve`, `Permit`, `PreBind` or `Bind` evaluation) + +The cache keeps track of the following three metrics: +- `scheduler_cache_size_assumed_pods`: number of pods in the assume pods list +- `scheduler_cache_size_pods`: number of pods in the cache +- `scheduler_cache_size_nodes`: number of nodes in the cache + +#### Snapshot + +The [snapshot](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler/internal/cache/snapshot.go) +captures the state of a cluster carrying information about all nodes +in a cluster and objects located on each node. +Namely node objects, pods assigned on each node, requested resources of all pods +on each node, node’s allocatable, images pulled and other information needed +to make a scheduling decision. Every time a pod is scheduled, +a snapshot of the current state of the cluster is captured. +To avoid a case where a pod or node gets changed while plugins are processed +which might lead to data inconsistency as some plugins might get a different +view of the cluster. + +#### Configurator + +A [configurator](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler/factory.go#L90) +builds the scheduler instance by wiring plugins, cache, queues, +handlers and other elements together. Each profile [is initialized](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler/factory.go#L138-L147) +with its own framework (with all frameworks sharing informers, event recorders, etc.). + +At this point it’s still possible to have the configurator create the instance +[from a policy file](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler/factory.go#L213). +Though, this approach is deprecated and will be removed +from the configuration eventually. Keeping only the kube scheduler configuration +as the only way to provide the configuration. + +#### Default scheduling algorithm + +The codebase defines a [ScheduleAlgorithm](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler/core/generic_scheduler.go#L61-L66) +interface. +Any implementation of the interface can be used as a scheduling algorithm. +There are two methods: +- `Schedule`: responsible for scheduling a pod using plugins from `PreFilter` + up to `NormalizeScore` extension points, provides [ScheduleResult](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler/core/generic_scheduler.go#L70-L77) + containing a scheduling decision (the most suitable nodes) with additional + accompanying information such as how many nodes were evaluated + and how many nodes were found feasible for scheduling. +- `Extenders`: currently exposed only for testing + +Each cycle of the default algorithm implementation consists of: +1. Taking the [current snapshot](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler/core/generic_scheduler.go#L101) + from the scheduling cache +1. [Filter out all nodes](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler/core/generic_scheduler.go#L110) + not feasible for scheduling a pod + 1. Run [PreFilter plugins](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler/core/generic_scheduler.go#L230) + first (preprocessing phase, e.g. computing pod [anti-]affinity relations) + 1. Run [Filter plugins](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler/core/generic_scheduler.go#L261) in parallel: + filter out all nodes which does not satisfy pod’s constraints + (e.g. sufficient resources, node affinity, etc.), including running filter extenders + 1. Run [PostFilter plugins](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler/scheduler.go#L479) + if no node can fit the incoming pod +1. In case there are at least two feasible nodes for scheduling, run [scoring plugins](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler/core/generic_scheduler.go#L133): + 1. Run [PreScore plugins](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler/core/generic_scheduler.go#L427) + first (preprocessing phase) + 1. Run [Score plugins](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler/core/generic_scheduler.go#L433) in parallel: + each node is given a score vector (each coordinate corresponding to one plugin) + 1. Run [NormalizeScore plugins](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler/framework/runtime/framework.go#L798): + to have all plugins given a score in <0; 100> interval + 1. Compute [weighted score](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler/framework/runtime/framework.go#L810-L828) + for each node (each score plugin can have + a weight assigned indicating how much its score is preferred over others) + 1. Run [score extenders](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler/core/generic_scheduler.go#L456) + and add it to the total score of each node +1. [Select](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler/core/generic_scheduler.go#L138) + and [give back a node](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler/core/generic_scheduler.go#L141-L145) + with the highest score. If there’s only a [single feasible node](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler/core/generic_scheduler.go#L125-L131) + skip `PreScore`, `Score` and `NormalizeScore` extension points + and give back the node right away. If there’s no feasible node, report it. + +Be aware of: +- If a plugin provides score normalization, it needs to return non-nil +when [ScoreExtensions()](https://github.com/kubernetes/kubernetes/blob/a651804427dd9a15bb91e1c4fb7a79994e4817a2/pkg/scheduler/framework/plugins/podtopologyspread/scoring.go#L254-L256) gets invoked