blob: 74edc600f7c31a0fc372f82aafbc64dc2f9a3a50 [file] [log] [blame] [view]
<!--
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
-->
# Apache YuniKorn - A Universal Scheduler
Apache YuniKorn is a light-weight, universal resource scheduler for container orchestrator systems.
It was created to achieve fine-grained resource sharing for various workloads efficiently on a large scale, multi-tenant, and cloud-native environment. YuniKorn brings a unified, cross-platform, scheduling experience for mixed workloads that consist of AI, Machine Learning, stateless batch workloads and stateful services.
YuniKorn now supports K8s and can be deployed as a custom K8s scheduler. YuniKorn's architecture design also allows adding different shim layer and adopt to different ResourceManager implementation including Apache Hadoop YARN, or any other systems.
## Feature highlights
- Features to support both AI, Machine Learning or batch jobs and long-running/stateful services.
- Hierarchical queues with guaranteed/maximum resource quotas and applications.
- User and group quotas configurable for each queue with maximum applicatins and resources.
- Resource fairness between queues, users and apps.
- Scheduling policies configurable per queue: FIFO, priority and state based.
- Cross-queue preemption based on fairness.
- Automatically map incoming container requests to queues by policies.
- Node partition: partition cluster to sub-clusters with dedicated quota/ACL management.
- Fully compatible with K8s predicates, events, PV/PVC and admin commands.
- Support for [Cluster AutoScaler](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler) and [Karpenter](https://karpenter.sh/) to drive cluster scale up and down.
## Deployment model
YuniKorn can be deployed with [helm-charts](https://artifacthub.io/packages/helm/yunikorn/yunikorn) on an existing K8s cluster. It can be deployed with or without the admission controller. When the admission controller is enabled, YuniKorn will be the primary scheduler that takes over the resource scheduling (the admission controller runs a mutation webhook that automatically mutates pod spec's schedulerName to yunikorn); when it is disabled, user needs to manually change the schedulerName to `yunikorn` in order to get apps scheduled by YuniKorn.
## Supported K8s versions
| K8s Version | Support? |
|---------------------|:--------:|
| 1.23.x (or earlier) | X |
| 1.24.x | √ |
| 1.25.x | √ |
| 1.26.x | √ |
| 1.27.x | √ |
| 1.28.x | √ |
| 1.29.x | √ |
| 1.30.x | √ |
| 1.31.x | √ |
| 1.32.x | √ |
## Installing the chart
```
helm repo add yunikorn https://apache.github.io/yunikorn-release
helm repo update
helm install yunikorn yunikorn/yunikorn
```
## Configuration
The following table lists the configurable parameters of the YuniKorn chart and their default values:
| Parameter | Description | Default |
| ----------------------------------------------- | ----------------------------------------------------------- | ------------------------------- |
| `imagePullSecrets` | Docker repository secrets | `[]` |
| `serviceAccount` | Service account name | `yunikorn-admin` |
| `hostNetwork` | Whether scheduler should run in the host network | `false` |
| `image.repository` | Scheduler image repository | `apache/yunikorn` |
| `image.tag` | Scheduler image tag | `scheduler-latest` |
| `image.pullPolicy` | Scheduler image pull policy | `Always` |
| `pluginImage.repository` | Scheduler plugin image repository | `apache/yunikorn` |
| `pluginImage.tag` | Scheduler plugin image tag | `scheduler-plugin-latest` |
| `pluginImage.pullPolicy` | Scheduler plugin image pull policy | `Always` |
| `podLabels` | Scheduler pod labels | `{}` |
| `podAnnotations` | Scheduler pod annotations | `{}` |
| `admissionController.podLabels` | Admission controller pod labels | `{}` |
| `admissionController.podAnnotations` | Admission controller pod annotations | `{}` |
| `admissionController.replicaCount` | Admission controller replicas to be deployed | `1` |
| `admissionController.serviceAccount` | Admission controller service account name | `yunikorn-admission-controller` |
| `admissionController.image.repository` | Admission controller image repository | `apache/yunikorn` |
| `admissionController.image.tag` | Admission controller image tag | `admission-latest` |
| `admissionController.image.pullPolicy` | Admission controller image pull policy | `Always` |
| `admissionController.hostNetwork` | Whether admission controller should run in the host network | `true` |
| `admissionController.resources.requests.cpu` | Admission controller CPU resource requests | `100m` |
| `admissionController.resources.requests.memory` | Admission controller memory resource requests | `500Mi` |
| `admissionController.resources.limits.cpu` | Admission controller CPU resource limit | `500m` |
| `admissionController.resources.limits.memory` | Admission controller memory resource limit | `500Mi` |
| `admissionController.goMemoryLimit` | Admission controller memory limit (GOMEMLIMIT) | `200MiB` |
| `admissionController.goGC` | Admission controller GC threshold (GOGC) | `100` |
| `admissionController.nodeSelector` | Admission controller deployment nodeSelector(s) | `{}` |
| `admissionController.tolerations` | Admission controller deployment tolerations | `[]` |
| `admissionController.affinity` | Admission controller deployment affinity | `{}` |
| `admissionController.service.type` | Admission controller service type | `ClusterIP` |
| `admissionController.priorityClassName` | Admission controller pod priority | `""` |
| `priorityClassName` | Scheduler pod priority | `""` |
| `service.type` | Scheduler service type | `ClusterIP` |
| `service.port` | Port of the scheduler service | `9080` |
| `service.portWeb` | Port of the web application service | `9889` |
| `resources.requests.cpu` | CPU resource requests | `200m` |
| `resources.requests.memory` | Memory resource requests | `1Gi` |
| `resources.limits.cpu` | CPU resource limit | `4` |
| `resources.limits.memory` | Memory resource limit | `2Gi` |
| `goMemoryLimit` | Memory limit (GOMEMLIMIT) | `1536MiB` |
| `goGC` | GC threshold (GOGC) | `100` |
| `web.image.repository` | Web app image repository | `apache/yunikorn` |
| `web.image.tag` | Web app image tag | `web-latest` |
| `web.image.pullPolicy` | Web app image pull policy | `Always` |
| `web.resources.requests.cpu` | Web app CPU resource requests | `100m` |
| `web.resources.requests.memory` | Web app memory resource requests | `100Mi` |
| `web.resources.limits.cpu` | Web app CPU resource limit | `200m` |
| `web.resources.limits.memory` | Web app memory resource limit | `500Mi` |
| `web.goMemoryLimit` | Web app memory limit (GOMEMLIMIT) | `200MiB` |
| `web.goGC` | Web app GC threshold (GOGC) | `100` |
| `embedAdmissionController` | Flag for enabling/disabling the admission controller | `true` |
| `enableSchedulerPlugin` | Flag for enabling/disabling scheduler plugin mode | `false` |
| `enableWebService` | Flag for enabling/disabling web service | `true` |
| `nodeSelector` | Scheduler deployment nodeSelector(s) | `{}` |
| `tolerations` | Scheduler deployment tolerations | `[]` |
| `affinity` | Scheduler deployment affinity | `{}` |
| `yunikornDefaults` | Data for the `yunikorn-defaults` ConfigMap | `{}` |
These parameters can be passed in via helm's `--set` and `--values (-f)` options, such as `--set resources.requests.cpu=2000m` or `-f myvalues.yaml`.
In addition to these parameters, YuniKorn supports reading most of its runtime configuration directly from two ConfigMaps in the installed namespace: `yunikorn-defaults` and `yunikorn-configs`. The `yunikorn-defaults` ConfigMap is rendered by Helm based on the contents of the `yunikornDefaults` parameter. The `yunikorn-configs` ConfigMap is entirely ignored by Helm, and can be populated (or not) using external mechanisms. At runtime, YuniKorn will evaluate both ConfigMaps, using the contents of `yunikorn-configs` as an override to `yunikorn-defaults`.
## Deprecated Configuration
The following configuration parameters are deprecated and will be ignored in a future release of YuniKorn:
| Parameter | Description | Replacement |
|-----------------------------------------|-----------------------------------------------------|-------------------------------------------------------------------|
| `operatorPlugins` | Scheduler operator plugins | `service.operatorPlugins` ConfigMap entry |
| `placeholderImage` | Docker image of the placeholder pods | `service.placeholderImage` ConfigMap entry |
| `admissionController.processNamespaces` | List of namespace regexes to process (empty=ALL) | `admissionController.filtering.processNamespaces` ConfigMap entry |
| `admissionController.bypassNamespaces` | List of namespace regexes to bypass (empty=NONE) | `admissionController.filtering.bypassNamespaces` ConfigMap entry |
| `admissionController.labelNamespaces` | List of namespace regexes to label (empty=ALL) | `admissionController.filtering.labelNamespaces` ConfigMap entry |
| `admissionController.noLabelNamespaces` | List of namespace regexes not to label (empty=NONE) | `admissionController.filtering.noLabelNamespaces` ConfigMap entry |
| `configuration` | YAML-formatted queue configuration | `queues.yaml` ConfigMap entry |
Currently, if both the deprecated parameter and the replacement ConfigMap entry are specified, the ConfigMap entry will take precedence.