容器服务提供 Capacity 调度功能,用于支持大数据和机器学习场景的资源弹性场景。本文介绍如何使用 Capacity 调度功能。
说明
【邀测·申请试用】:该功能目前处于邀测阶段,如需使用,请提交申请。
部分企业使用集群场景中,一个集群可能会被多个部门(用户)使用。原生 Kubernetes 通过 ResourceQuota 为每个用户分配固定的资源,从而实现用户资源容量隔离。但该方法有一个弊端,即各用户之间的资源无法实现弹性利用,比如在同一个集群中,如果一个部门的可用集群资源比较紧张,而另一个部门资源比较空闲时,资源使用紧张的部门无法使用空闲部门的资源,导致集群资源利用率不高。在大数据和机器学习场景下,这种情况尤其明显。
容器服务基于 Scheduling Framework 的扩展机制,在调度侧通过引入弹性配额(ElasticQuota),实现了 Capacity 调度功能。在确保用户资源分配的基础上通过资源共享的方式来提升集群的整体资源利用率。
容器服务提供的 Capacity 调度有以下功能:
最多可以设置两级 ElasticQuota。如上图 root.1 和 root.2 是第一级,root.1.1 和 root.1.2 是第二级。
叶子级 ElasticQuota 必须和命名空间关联。如上图 root.2、root.1.1、root.1.2 是叶子级 ElasticQuota,因此必须关联自定义命名空间。
单个 ElasticQuota 支持关联多个命名空间。
同一个命名空间只能关联一个叶子级 ElasticQuota。
通过 Label 表示 ElasticQuota 的层级关系。
Label | 默认值 | 说明 |
---|---|---|
vke.volcengine.com/elasticquota-is-parent | false | 该 ElasticQuota 是否可以挂载叶子级 ElasticQuota。取值如下:
|
vke.volcengine.com/elasticquota-parent | root | 该 ElasticQuota 的父级。取值如下:
|
通过 Label 表示 ElasticQuota 资源是否可以被借用。
Label | 默认值 | 说明 |
---|---|---|
vke.volcengine.com/elasticquota-allow-lent | true | 是否允许该 ElasticQuota 的资源被借用。取值如下:
|
通过设置资源使用上限(Max)和资源使用保障(Min),保证不同 ElasticQuota 之间的资源借用和回收策略的运行。
集群资源弹性配额划分示意图如下所示。
容器服务中,集群资源按照弹性配额角度划分为两部分:
目前仅支持在创建集群时开启 Capacity 调度功能,且开启后暂不支持修改。
本文通过两台 4 vCPU 16 GiB 规格的 ECS 实例(节点),描述容器服务中 Capacity 调度的实现原理和使用方法。
2
。本文以创建 root.1、root.2、root.1.1、root.1.2 四个 ElasticQuota 并关联 namespace-1、namespace-2、namespace-3 三个命名空间为例,规划弹性配额。
kubectl create ns namespace-1 kubectl create ns namespace-2 kubectl create ns namespace-3
注意
ElasticQuota 必须在 kube-system 命名空间下创建,并将叶子级 ElasticQuota 关联到自定义的命名空间。
apiVersion: scheduling.vke.volcengine.com/v1beta1 kind: ElasticQuota metadata: labels: vke.volcengine.com/elasticquota-allow-lent: "true" # 空闲时保障资源是否可租借给其他 ElasticQuota。 vke.volcengine.com/elasticquota-is-parent: "true" # 该 ElasticQuota 下可以挂载叶子级配额。 vke.volcengine.com/elasticquota-parent: root # 该 ElasticQuota 的父级为 root。 name: root.1 namespace: kube-system # 必须为 kube-system 才生效。 spec: max: cpu: 4 memory: 40Gi nvidia.com/gpu: 2 min: cpu: 2 memory: 40Gi nvidia.com/gpu: 2
apiVersion: scheduling.vke.volcengine.com/v1beta1 kind: ElasticQuota metadata: labels: vke.volcengine.com/elasticquota-allow-lent: "true" # 空闲时保障资源是否可租借给其他 ElasticQuota。 vke.volcengine.com/elasticquota-is-parent: "false" # 该 ElasticQuota 下不可以挂载叶子级配额。 vke.volcengine.com/elasticquota-parent: root # 该 ElasticQuota 的父级为 root。 name: root.2 namespace: kube-system # 必须为 kube-system 才生效。 spec: max: cpu: 6 memory: 40Gi nvidia.com/gpu: 2 min: cpu: 4 memory: 20Gi nvidia.com/gpu: 1 namespaces: # ElasticQuota 关联的命名空间。 - namespace-3
apiVersion: scheduling.vke.volcengine.com/v1beta1 kind: ElasticQuota metadata: labels: vke.volcengine.com/elasticquota-allow-lent: "true" # 空闲时保障资源是否可租借给其他 ElasticQuota。 vke.volcengine.com/elasticquota-is-parent: "false" # 该 ElasticQuota 下不可以挂载叶子级配额。 vke.volcengine.com/elasticquota-parent: root.1 # 该 ElasticQuota 的父级为 root.1。 name: root.1.1 namespace: kube-system # 必须为 kube-system 才生效。 spec: max: cpu: 4 memory: 40Gi nvidia.com/gpu: 2 min: cpu: 1 memory: 20Gi nvidia.com/gpu: 1 namespaces: # ElasticQuota 关联的命名空间。 - namespace-1
apiVersion: scheduling.vke.volcengine.com/v1beta1 kind: ElasticQuota metadata: labels: vke.volcengine.com/elasticquota-allow-lent: "true" # 空闲时保障资源是否可租借给其他 ElasticQuota。 vke.volcengine.com/elasticquota-is-parent: "false" # 该 ElasticQuota 下不可以挂载叶子级配额。 vke.volcengine.com/elasticquota-parent: root.1 # 该 ElasticQuota 的父级为 root.1。 name: root.1.2 namespace: kube-system # 必须为 kube-system 才生效。 spec: max: cpu: 4 memory: 40Gi nvidia.com/gpu: 2 min: cpu: 1 memory: 20Gi nvidia.com/gpu: 1 namespaces: # ElasticQuota 关联的命名空间。 - namespace-2
执行如下命令查看生成的 Quota 树(ElasticQuotaTree)。
kubectl get ElasticQuotaTree -n kube-system system-elasticquota-tree -o yaml
预期返回结果如下:
apiVersion: scheduling.vke.volcengine.com/v1beta1 kind: ElasticQuotaTree metadata: annotations: cluster-capacity-resource: '{"cpu":"7800m","ephemeral-storage":"189273916718","hugepages-1Gi":"0","hugepages-2Mi":"0","memory":"26811077427200m","pods":"126"}' default-quota-used-resource: '{"cpu":"200m","memory":"128Mi"}' guaranteed-sum-min-resource: '{"cpu":"7160m","ephemeral-storage":"189273916718","hugepages-1Gi":"0","hugepages-2Mi":"0","memory":"26058199859200m","pods":"126"}' root-children-sum-min-resource: '{"cpu":"6","memory":"60Gi","nvidia.com/gpu":"3"}' system-quota-used-resource: '{"cpu":"440m","memory":"590Mi"}' name: system-elasticquota-tree namespace: kube-system spec: # 弹性配额的层级关系以及资源配置。 root: - name: root.1 children: - name: root.1.1 max: '{"cpu":"4","memory":"40Gi","nvidia.com/gpu":"2"}' min: '{"cpu":"1","memory":"20Gi","nvidia.com/gpu":"1"}' other: '{"is_parent":false,"namespaces":["namespace-1"]}' - name: root.1.2 max: '{"cpu":"4","memory":"40Gi","nvidia.com/gpu":"2"}' min: '{"cpu":"1","memory":"20Gi","nvidia.com/gpu":"1"}' other: '{"is_parent":false,"namespaces":["namespace-2"]}' max: '{"cpu":"4","memory":"40Gi","nvidia.com/gpu":"2"}' min: '{"cpu":"2","memory":"40Gi","nvidia.com/gpu":"2"}' other: '{"is_parent":true}' - name: root.2 max: '{"cpu":"6","memory":"40Gi","nvidia.com/gpu":"2"}' min: '{"cpu":"4","memory":"20Gi","nvidia.com/gpu":"1"}' other: '{"is_parent":false,"namespaces":["namespace-3"]}'
重点参数说明如下所示。
参数 | 描述 |
---|---|
cluster-capacity-resource | 集群可用的总资源配额。 |
default-quota-used-resource | Default 组已使用的资源配额。 |
root-children-sum-min-resource | 一级 ElasticQuota 的 Min 之和。 |
system-quota-used-resource | System 组已使用的资源配额。 |
guaranteed-sum-min-resource | 系统自动计算的可保障资源配额。 注意
|
查看已创建的 root.1、root.2、root.1.1、root.1.2 四个 ElasticQuota YAML 文件内容,系统会自动为 ElasticQuota 添加 Capacity 调度相关 Annotation。
下文以 root.1 的 YAML 文件为例。
apiVersion: scheduling.vke.volcengine.com/v1beta1 kind: ElasticQuota metadata: annotations: vke.volcengine.com/elasticquota-fair-share: '{"cpu":"3160m"}' # 该 ElasticQuota 根据公平性计算以后最终可以用于分配的资源。 vke.volcengine.com/elasticquota-request: '{"cpu":"4"}' # 表示该 ElasticQuota 关联 Namespace 的 Pod 总请求。 labels: vke.volcengine.com/elasticquota-allow-lent: "true" # 空闲时保障资源是否可租借给其他 ElasticQuota 。 vke.volcengine.com/elasticquota-is-parent: "true" # 该 ElasticQuota 下可以挂载叶子级配额。 vke.volcengine.com/elasticquota-parent: root # 该 ElasticQuota 的父级是 root。 name: root.1 namespace: kube-system spec: max: # 可以使用的资源上限。 cpu: 4 memory: 40Gi nvidia.com/gpu: "2" min: # 可以使用的保障资源。所有用户使用的 Min 之和需要小于集群的总资源量。 cpu: "2" memory: 40Gi nvidia.com/gpu: "2" weight: # 该 ElasticQuota 的权重。权重越大,分到的剩余资源能力越强。默认使用 Max,大部分场景不建议您自定义 weight。 cpu: 4 memory: 40Gi nvidia.com/gpu: "2" status: used: cpu: "2"
以部署 Nginx 无状态负载(Deployment)为例,从 CPU 维度验证 Capacity 调度能力是否正常。
说明
您可以参考镜像仓库的 推送和拉取镜像 文档内容,提前上传 Nginx 镜像到火山引擎镜像仓库中。
2
。2
Core、CPU 上限 设置为2
Core。4
。1
Core、CPU 上限 设置为1
Core。