简介
官网: https://koordinator.sh/
koordinator 是一个基于 qos 的 kubernetes 混合工作负载调度系统。它旨在提高对延迟敏感的工作负载和批处理作业的运行时效率和可靠性,简化与资源相关的配置调整的复杂性,并增加 pod 部署密度以提高资源利用率。
文章基于
Koordinator版本: 1.0.0
内核版本: Anolis-4.19.91-26.6
两种关键机制
- 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 水平,在一定时期内稳定的计算吞吐量,低成本资源 |
- 优先级
PriorityClass | 优先级范围 | 描述 |
---|---|---|
koord-prod | [9000, 9999] | 需要提前规划资源配额,并且保证在配额内成功。 |
koord-mid | [7000, 7099] | 需要提前规划资源配额,并且保证在配额内成功。 |
koord-batch | [5000, 5999] | 需要提前规划资源配额,一般允许借用配额。 |
koord-free | [3000, 3999] | 不保证资源配额,可分配的资源总量取决于集群的总闲置资源。 |
架构图
调度能力
内核调度能力
https://help.aliyun.com/document_detail/155424.html
单节点调度能力
CPU 抑制
此特性适用于BE QoS的pod, 意思是只针对BE QoS的pod压缩CPU。
Koordinator的参数名 | 参数说明 | 对应的cgroup参数名 | 适用的QoS | 影响范围 |
---|---|---|---|---|
cpuSuppressPolicy | 支持cpuset和cpuQuota两种策略。cpuset策略对最终调整的是cgroup中的cpuset.cpus,cpuQuota测试最终调整的是cgroup中的cpu.cfs_quota_us。 ( 这里可忽略: 当kubelet中cpu-manager-policy设置为static时,对于cpuset策略生效的是新计算的cpuset不和老的cpuset进行merge; 当kubelet中的cpu-manager-policy不设置时, 对于cpuset策略生效的是新计算的cpuset和老的cpuset进行merge, 且为了避免cgroup上下级冲突,会做2次apply。 ) 默认策略为:cpuset。 |
cpuset.cpus和cpu.cfs_quota_us |
BE |
Pod和Pod.Spec.Containers |
cpuSuppressThresholdPercent | 用于计算BE的pods可以使用的cpu:suppress(BE) := node.Status.Allocatable.Cpu() cpuSuppressThresholdPercent - pod(LS).Used - system.Used* 最终可用的cpu是与策略有关联: (这里可以理解为需要修正下上一步计算出来的值,让其尽量合理一点)* 当策略为cpuset时, 上一步计算出来的值还需要与LSR占用的cpu再做计算;* 当策略为cpuQuota时, 上一步计算出来的值还需要与node.Status.Capacity.Cpu()的上浮再做计算。 默认值为: 65。 |
- |
CPU Burst
此特性只适用于LS QoS的pod, 不适用于其他LSR、BE等QoS的pod。
CPU Burst和 CPU CFSQuota Burst策略在Koordinator中默认是不开启的。
Koordinator的参数名 | 参数说明 | 对应的cgroup参数名 | 适用的QoS | 影响范围 |
---|---|---|---|---|
cpuBurstStrategy.cpuBurstPercent |
对应的计算公式为: cpu.cfs_burst_us = container.limit * burstCfg.CPUBurstPercent / 100 * cfs_period_us。 即:cpu最多可以使用到几倍的cpu limits。注: 突发时最多可以使用多少cpu与平时空余的CPU资源有关, 具体可以看下面的参考文档。 启用策略参数为: auto或cpuBurstOnly 参考文档:https://help.aliyun.com/document_detail/306980.html |
cpu.cfs_burst_us | LS | Pod和Pod.Spec.Containers |
cpuBurstStrategy.policy | 支持的策略类型: none、cpuBurstOnly、cfsQuotaBurstOnly、auto 默认值: none |
- | ||
cpuBurstStrategy.sharePoolThresholdPercent | 当LS QoS的pod的实际cpu使用率大于此参数时, 则认为Node目前处于overload状态; 如果是overload状态, 则会影响下面pod在burst时使用的cfs_quota_us值, 即当node处于高负载时, 需要降低cpu burst的使用, 每次以0.8的倍数降低cfs_quota_us的值;当LS QoS的pod的实际cpu使用率小于0.9 * 此参数值是, 则认为Node处于idle状态; 如果是idle状态,且允许cpu burst的使用,每次以1.2的倍数提升cfs_quota_us的值;node的负载还有其他2种: cooling和unknown, cooling位于overload和idele之间;unknown是状态未知, 比如metrics指标没有采集上来等。 默认值:50 |
- |
||
cpuBurstStrategy.cfsQuotaBurstPercent | 对应的计算公式为: cpu.cfs_quota_us = container.limit * cfsQuotaBurstPercent / 100。 burst限制器的容量为: cfsQuotaBurstPeriodSeconds * (cfsQuotaBurstPercent - 100)。 实际上计算方式同cfs_burst_us的方式, 都是过去一段时间空余的CPU资源有关。 启用策略参数为: auto或cfsQuotaBurstOnly 默认值:300 |
cpu.cfs_quota_us | ||
cpuBurstStrategy.cfsQuotaBurstPeriodSeconds | 指定pod在burst时可以使用的最长的时间。 默认:-1 (无限制) |
Memory CGroup特性
Koordinator的参数名 | 参数说明 | 对应的cgroup参数名 | 适用的QoS | 影响范围 |
---|---|---|---|---|
memoryQOS.wmarkRatio |
该接口用于设置是否启用memcg后台异步回收功能,以及设置异步回收功能开始工作的memcg内存水位线。单位是相对于memcg limit的百分之几。取值范围:0~100* 默认值为0,该值也表示禁用memcg后台异步回收功能。* 取值为非0时,表示开启memcg后台异步回收功能并设置对应的水位线。推荐值: 95 memory.wmark_high = memory.limit_in_bytes * memory.wmark_ratio / 100)当memcg内存使用超过该接口的值时,后台异步回收功能启动 参考文档:https://help.aliyun.com/document_detail/169535.html |
memory.wmark_ratio |
LSR/LS/BE | Pod和Pod.Spec.Containers |
memoryQOS.wmarkScalePermill | 该接口用于控制memory.wmark_high和memory.wmark_low之间的间隔。单位是相对于memcg limit的万分之几。取值范围:1~1000* 该接口在创建时,会继承父组的值(该值为50),该值也是默认值,即memcg limit的千分之五。* memcg根组目录不存在该接口文件。推荐值: 20 memory.wmark_low = memory.wmark_high - memory.limit_in_bytes * memory.wmark_scale_factor / 10000当memcg内存使用低于该接口的值时,后台异步回收结束 参考文档:https://help.aliyun.com/document_detail/169535.html |
memory.wmark_scale_factor | ||
memoryQOS.wmarkMinAdj | 表示基于全局最低水位线(global wmark_min)所作出的调整(adjustment)百分比。取值范围:-25 ~ 50,取值范围说明如下:* 该接口创建时,继承父组的值(值为0),即默认值为0。* 负值也表示global wmark_min下移, |