YuniKorn
简介
YuniKorn 是一种轻量级的通用资源调度程序,适用于容器编排系统。它的创建是为了一方面在大规模,多租户环境中有效地实现各种工作负载的细粒度资源共享,另一方面可以动态地创建云原生环境。YuniKorn 为混合工作负载提供统一的跨平台调度体验,包括无状态批处理工作负载和状态服务,支持但不限于 YARN 和 Kubernetes。
YuniKorn[‘ju:nikɔ:n] 是一个虚构的词,“Y”代表 YARN,“K”代表 K8s,“Uni”代表统一,其发音与“Unicorn”相同。创建它是为了最初支持这两个系统,但最终目的是创建一个可以支持任何容器协调器系统的统一调度程序。
背景
企业用户在不同的平台上运行工作负载,例如 YARN 和 Kubernetes。他们需要使用不同的资源调度程序,以便规划其工作负载有效地在这些平台上运行。
目前,调度程序生态系统是分散的,并且在平衡现有用例(如批处理工作负载)以及云本机体系结构,自动扩展等新需求方面的实现不是最理想的。例如:
- YARN 具有批量工作负载的 Capacity Scheduler 和 Fair Scheduler。
- K8s 具有服务的默认调度程序。对于批处理工作负载,社区有 Kube-batch,Poseidon,Rubix(Spark 的 Scheduler 扩展)。
YuniKorn团队调查了这些项目,并意识到到目前为止还没有一个完美的方案来支持无状态批处理作业(需要公平性,高调度吞吐量等)和长期运行服务(需要持久化存储,复杂的编排约束,等等...)。这促使他们必须创建一个统一的调度框架来满足所有这些重要需求,并使大数据和云原生社区受益。
架构
YuniKorn 的其中一个设计目标是将调度程序与下面的资源管理系统分离,为此,YuniKorn团队创建了一个定义通信协议的通用调度程序接口。通过利用它,scheduler-core 和 shim 一起工作来处理调度请求。关于 YuniKorn 各组件的更多详细的介绍如下:

YuniKorn 的主要模块如下:
- Scheduler interface:调度程序接口是资源管理平台(如 YARN / K8s)将通过诸如 GRPC / 编程语言绑定之类的 API 与之通信的抽象层。更多信息请查看yunikorn-scheduler-interface。
- Scheduler core:YuniKorn Core 封装了所有调度算法,它从资源管理平台(如 YARN / K8s)下面收集资源,并负责资源分配请求。它决定每个请求的最佳部署位置,然后将响应分配发送到资源管理平台。调度程序核心与下层平台无关,所有通信都通过调度程序接口。更多信息请查看 yunikorn-core。
- Resource Manager shims:调度程序 Shim 在主机系统内运行(如 YARN / K8s),它负责通过调度程序接口转换主机系统资源和资源请求,并将它们发送到调度程序核心。在做出调度程序决策时,它负责实际的 pod / 容器绑定。目前, yunikorn-k8shim 应用于Kubernetes集成。
- Scheduler UI:调度程序 UI 为已托管的节点,计算资源,应用程序和队列提供简单视图。更多信息请查看yunikorn-web。
特性
以下是 YuniKorn 目前支持的调度功能列表:
- 调度功能支持批处理作业和长期运行 / 有状态服务
- 具有最小 / 最大资源配额的分层池 / 队列
- 队列,用户和应用程序之间的资源公平性
- 基于公平性的跨队列抢占
- 自定义资源类型(如 GPU)调度支持
- 丰富的编排约束支持
- 根据策略自动将传入的容器请求映射到队列
- 对节点使用专用配额 / ACL 管理将大的集群拆分成若干子群集
同时, YuniKorn 作为调度程序对 K8S 的一些支持如下:
- 支持 K8s 谓词。如 pod 亲和 / 反亲和,节点选择器
- 支持持久化存储,配额申请等
- 从 configmap 动态加载调度程序配置(热刷新)
- 可以在 Kubernetes 之上部署
YuniKorn Web UI支持监控调度程序队列,资源使用,应用程序等。
- 用于监控 YuniKorn 队列资源使用情况的 Web UI

- 用于监控 YuniKorn 应用程序管理和资源使用情况的 Web UI

参考资料