简介
在 Kubernetes 集群中,因为容器化的方式,可以在一个节点上运行更多的业务,但这样也会引发业务之间资源的竞争。此时会使用 Request 来保证 Pod 申请资源的最小量,以防止在发生资源竞争时,没有足够的资源可用。但是这部分通过 Request 申请的资源量被永久“占用”,无法被别的业务使用,在流量波谷时,会造成较大浪费。因此 TKE 推出了可抢占式 Job,该类型 Job 使用的资源是集群中的闲置资源,不占用集群/节点真实的剩余可调度量,在发生资源竞争时,该部分资源会被优先回收,保证正常使用 Request 资源的业务的稳定性。
部署在集群内的资源对象
说明:
使用可抢占式 Job 需要首先在集群中安装 QoSAgent 组件并开启 CPU 使用优先级,我们会自动为所有可抢占式 Job 分配最低的优先级(优先级7),在发生资源抢占时被绝对抢占,该组件在集群中部署的资源对象请参见下方表格。
Kubernetes 对象名称 | 类型 | 默认占用资源 | 所属 Namespaces |
avoidanceactions.ensurance.crane.io | CustomResourceDefinition | - | - |
nodeqoss.ensurance.crane.io | CustomResourceDefinition | - | - |
podqoss.ensurance.crane.io | CustomResourceDefinition | - | - |
timeseriespredictions.prediction.crane.io | CustomResourceDefinition | - | - |
kube-system | Namespace | - | - |
all-be-pods | PodQOS | - | kube-system |
qos-agent | ClusterRole | - | - |
qos-agent | ClusterRoleBinding | - | - |
crane-agent | Service | - | kube-system |
qos-agent | ServiceAccount | - | kube-system |
qos-agent | Daemonset | - | kube-system |
功能说明
因为只有原生节点才有闲置资源,所以该功能仅支持在 原生节点 中使用。
支持为 Job、CronJob 分配集群中的闲置资源。
该部分闲置资源不占用集群中的剩余可调度资源。
当发生资源竞争时,闲置资源会被优先回收,因此被称之为可抢占式 Job。
节点和集群的闲置资源数值是动态变化的,根据实际的负载动态变化。当集群/节点闲置资源小于 Job 对闲置资源申请时,导致 Pod 会 Pending。
Request 推荐原理
闲置资源的分配方式是根据 Kubernetes 原生的 Extended Resource 实现。通过 Extended Resource 回收节点的剩余可用资源形成共享资源池,共享资源池不占用实际集群/节点的 CPU/RAM 可调度资源量。
如下图所示,QoS Agent 组件将集群中所有没有被真正使用的资源中抽取一部分资源,根据节点历史负载画像情况预测出安全的 Extended Resource 数值,该部分资源可以被声明使用 Extended Resource 的 Job/CronJob 使用。
使用可抢占式 Job
安装组件
1. 登录 容器服务控制台,选择左侧导航栏中的集群。
2. 在集群管理页面单击目标集群 ID,进入集群详情页。
3. 选择左侧菜单栏中的组件管理,进入组件列表页面。
4. 在组件列表页面中选择新建,并在新建组件页面中勾选 QoS Agent。
5. 单击完成即可安装组件。
部署可抢占式 Job
1. 登录 容器服务控制台,选择左侧导航栏中的集群。
2. 在集群管理页面单击目标集群 ID,进入集群详情页。
3. 选择工作负载 > Job/CronJob,在 Job/CronJob 资源列表页面,单击新建。
4. 在新建组件页面中开启可抢占功能。如下图所示:
开启可抢占的能力之后,Job/CronJob 的资源输入方式发生了变化,无需输入 Request/Limit 变为了 Extended CPU 和 Extended 内存:Extended CPU:申请原生节点中的空闲 CPU 资源。Extended CPU 限制只能是整数。
Extended 内存:申请原生节点中的空闲内存资源。Extended 内存限制只能是整数。如下图所示:
5. 通过声明使用 Extended Resource 的闲置资源创建出来的可抢占类型的 Job:
注意:
若您没有原生节点,或原生节点没有足够多的闲置资源,则可能有如下报错:"Insufficient gocrane.io/memory",表示没有足够的闲置内存资源;如果是"Insufficient gocrane.io/cpu",表示没有足够的闲置 CPU 资源。此时需要增加 原生节点 数量。
报错信息如下图所示: