什么是Koordinator?
Koordinator 是一个以 QoS 为基础的 Kubernetes 混合工作负载调度系统,通过提高延迟敏感的工作负载和批处理作业的运行时效率和可靠性,以简化与资源相关的配置调整的复杂性,同时增加 Pod 部署密度以提高资源利用率。Koordinator的重要功能包括:
- 精心设计的优先级和QoS机制,允许不同类型的工作负载混合运行,并在单个节点上运行不同类型的Pod。
- 允许资源超售以提高资源利用率,但仍满足QoS保证。
- 细粒度的资源协调和隔离机制,提高延迟敏感的工作负载和批处理作业的效率。
- 灵活的作业调度机制,支持特定领域的工作负载,如大数据、人工智能、音频和视频。
- 一整套用于监控、故障排除和操作的工具。
Koordinator与Kubernetes原生的调度有着一定的区别与联系:
- Koordinator与Kubernetes QoS兼容,但对每种类型都有增强功能,使用独立字段描述混部QoS。
- Koordinator调度器不是为了取代kube-scheduler,而是为了让混部工作负载在Kubernetes上更好地运行。
- Koordinator调度器基于schedule-framework开发,在原生调度能力之上增加了与混部和优先级抢占相关的调度插件。
- Koordinator将推动相关增强进入Kubernetes的上游社区,推动混部技术的标准化。
Koordinator的核心组件
Koordinator 由两个控制面(Koordinator Scheduler、Koordinator Manager)及一个 DaemonSet 组件(Koordlet)组成。
Koordinator Scheduler,以Deployment的形式部署,用于增强 Kubernetes 在混部场景下的资源调度能力。它增加了包括弹性配额调度、资源超卖、资源预留、Gang调度、异构资源调度等多种场景的支持。Koordinator Scheduler通过动态索引优化、等价class调度、随机算法优化等多种方式获得更好的性能。在安全方面,Koordinator Scheduler通过工作负载感知、确定性的pod迁移、细粒度的流量控制和变更审计支持等方式提升了调度的安全性。
Koordinator Manager, 以Deployment的形式部署,通常由leader实例和backup实例组成。它是为了增强Kubernetes在混部场景下的资源调度能力而创建的,其中的三个组件Colocation Profile、SLO控制器和Recommender。
- Colocation Profile,支持混部而无需修改工作负载。用户只需在集群中进行少量配置,原有的工作负载即可在混部模式下运行。
- SLO控制器,用于资源超卖管理。根据节点混部时的运行状态,动态调整集群的超发配置比例。该控制器的核心职责是管理混部时的SLO,包括智能识别异常节点并降低其权重、动态调整混部时的水位和压力策略,以保证集群中pod的稳定性和吞吐量。
- Recommender(即将推出),使用histograms统计和预测工作负载的资源使用细节,以预估工作负载的峰值资源需求,从而支持更好地分散热点,提高混部的效率。此外,资源profiling还可用于简化用户资源规范化配置的复杂性,如支持VPA。
Koordlet,以DaemonSet的形式部署在Kubernetes集群中的工具,旨在优化混部场景下的资源超卖、干扰检测和QoS保证等问题。Koordlet包括以下模块:
- 资源Profiling:估算Pod的实际资源使用情况,回收已分配但未使用的资源,用于低优先级Pod的超发。
- 资源隔离:为不同类型的Pod设置资源隔离参数,避免低优先级的Pod影响高优先级Pod的稳定性和性能。
- 干扰检测:动态检测资源争夺,包括CPU调度、内存分配延迟、网络、磁盘IO延迟等。
- QoS管理器:根据资源剖析、干扰检测结果和SLO配置,动态调整混部节点的水位,抑制影响服务质量的Pod。
- 资源调优:针对混部场景进行容器资源调优,优化容器的CPU Throttle、OOM等,提高服务运行质量。
Koordinator的资源模型
<main class="flex-1 overflow-hidden" data-v-7748bc16="">混部利用未使用的资源来运行低优先级的 Pod。为了实现这个目标,Koordinator采用了资源模型,它包括四个部分:限制、使用、短期预留和长期预留。
- 限制是高优先级 Pod 请求的资源量,用灰色线表示;
- 使用是实际使用的资源量,用红色线表示;
- 短期预留是基于过去时期内的资源使用量对未来估计,用深蓝色线表示;
- 长期预留是基于更长历史使用期的资源预留,用浅蓝色线表示。通过这四条线的展示,我们可以清晰地了解资源的分配情况和变化趋势。
混部资源调度是基于这个资源模型构建的,它不仅可以满足各种工作负载的资源需求,还可以充分利用集群的未使用资源,提高资源利用率。总之,这种方法可以在不浪费资源的情况下,使低优先级的 Pod 也能得到充分的资源支持。
在集群中运行的 Pod 资源 SLO 由两个概念组成:优先级和 QoS。优先级代表了请求资源被调度的优先级,通常情况下,它会影响 Pod 在调度器待定队列中的相对位置。QoS 代表 Pod 运行时的服务质量,如 cgroups cpu share、cfs 配额、LLC、内存、OOM 优先级等等。需要注意的是,Priority 和 QoS 是两个维度的概念,但在实际业务场景中,两者之间会有一些约束。并非所有的组合都是合法的。
优先级
Koordinator 在 Kubernetes 优先级类型的基础上,定义了一套规范并扩展了优先级的一个维度,以支持混部场景的细粒度调度。
优先级用数字表示,目前定义了四个类:
PriorityClass | 优先级范围 | 描述 |
---|---|---|
koord-prod | [9000, 9999] | 需要提前规划资源配额,并且保证在配额内成功。 |
koord-mid | [7000, 7999] | 需要提前规划资源配额,并且保证在配额内成功。 |
koord-batch | [5000, 5999] | 需要提前规划资源配额,一般允许借用配额。 |
koord-free | [3000, 3999] | 不保证资源配额,可分配的资源总量取决于集群的总闲置资源。 |
Koordinator 将不同类型的工作负载匹配到不同的优先级中:
- koord-prod 适用于典型的延迟敏感型服务,需要实时响应的服务类型,例如移动应用程序中的按钮点击等。
- koord-mid 适用于长周期的可用资源,一般用于运行实时计算和人工智能训练任务/作业,如 TensorFlow/PyTorch 等。
- koord-batch 适用于短周期可用资源,运行典型的离线批处理作业,例如日级大数据报告和非交互式 SQL 查询。
- koord-free 适用于低优先级的离线批处理作业,一般用于开发人员为测试目的提交的作业,不占用资源预算,充分利用空闲资源。
QoS
QoS 用于表达节点上 Pod 的运行质量,包括资源获取方式、资源获取比例以及 QoS 保障策略等方面的内容。
Koordinator 调度系统支持的 QoS 有五种类型:
QoS | 特点 | 说明 |
---|---|---|
SYSTEM | 系统进程,资源受限 | 对于 DaemonSets 等系统服务,虽然需要保证系统服务的延迟,但也需要限制节点上这些系统服务容器的资源使用,以确保其不占用过多的资源 |
LSE(Latency Sensitive Exclusive) | 保留资源并组织同 QoS 的 pod 共享资源 | 很少使用,常见于中间件类应用,一般在独立的资源池中使用 |
LSR(Latency Sensitive Reserved) | 预留资源以获得更好的确定性 | 类似于社区的 Guaranteed,CPU 核被绑定 |
LS(Latency Sensitive) | 共享资源,对突发流量有更好的弹性 | 微服务工作负载的典型QoS级别,实现更好的资源弹性和更灵活的资源调整能力 |
BE(Best Effort) | 共享不包括 LSE 的资源,资源运行质量有限,甚至在极端情况下被杀死 | 批量作业的典型 QoS 水平,在一定时期内稳定的计算吞吐量,低成本资源 |