容器服务提供弹性资源优先级调度策略,支持通过自定义资源策略(ResourcePolicy),设置工作负载的 Pod 被弹性调度到不同类型节点(例如包年包月 ECS、按量付费 ECS、虚拟节点)的顺序。本文主要介绍通过自定义资源策略(ResourcePolicy),设置弹性资源优先级调度的方法。
说明
若您需要在 VCI 场景使用弹性资源优先级调度,请确保已创建 VCI 业务相关的集群,并在集群中安装了 scheduler-plugin 组件,开启 弹性资源优先级调度。 VCI 相关集群操作,请参见 对接 VCI。
说明
逆序缩容:指设置了 ResourcePolicy 的工作负载在缩容时,从 ResourcePolicy 中设置的优先级最低的资源池开始缩容。
在 ResourcePolicy 中定义弹性资源优先级。
注意
vci-pool为当前集群中,所有符合type=virtual-kubelet的节点集合。apiVersion: scheduling.vke.volcengine.com/v1beta1 kind: ResourcePolicy metadata: name: vke-resourcepolicy # ResourcePolicy 对象名称。 namespace: default # ResourcePolicy 所属命名空间。该命名空间必须与被调度的 Pod 命名空间相同。 spec: selector: # 被 ResourcePolicy 管理的 Pod 的 Label 选择器。 app: nginx subsets: # 资源池配置。 - name: pool-1 # 资源池名称。 maxReplicas: 100 # 调度到该资源池的 Pod 数量上限。 maxReplicasRatio: "0.1" # 调度到该资源池的 Pod,占所有 Pod 的比例阈值,当超过该阈值时,不再向该资源池调度 Pod。 whenNotReachMax: ScheduleAnyWay # 调度策略,有 DoNotSchedule 和 ScheduleAnyWay 两个取值。 nodeSelectorTerm: - key: cluster.vke.volcengine.com/machinepool-name # 资源池标签键,此处的 machinepool-name 为资源池(节点池)ID 标签键。 operator: In values: # 资源池标签值,即实际的资源池(节点池)ID。 - pcgc1omersf****** - ncljdfq33h3****** - name: vci-pool # 资源池名称。 maxReplicas: 100 maxReplicasRatio: "0.1" nodeSelectorTerm: - key: type operator: In values: - virtual-kubelet # 匹配到 VCI 资源对应的虚拟节点。 tolerations: # 如果 Pod 被调度到该资源池,需要给 Pod 打上额外的容忍度。 - effect: NoSchedule key: vci.vke.volcengine.com/node-type operator: Equal value: vci status: # ResourcePolicy 的当前状态。 policyStatuses: # 各个资源池对应的可调度 Pod 情况。 - name: pool-1 missingReplicas: 50 - name: vci-pool missingReplicas: "-"
重点参数说明如下所示。
| 参数 | 描述 |
|---|---|
| selector | 被 ResourcePolicy 管理的 Pod 的 Label 选择器。表示该 ResourcePolicy 作用于自身所在命名空间下指定 Label 的 Pod。 |
subsets | 目标资源池。顺序越靠前,Pod 会优先调度到该资源池节点;Pod 缩容时,优先从最靠后的资源池节点进行缩容。
|
policyStatuses | 各个资源池对应的可调度 Pod 情况。
|
本文以如下场景为例,描述创建 ResourcePolicy,定义弹性资源优先级的方法:
您的集群中有固定的云服务器(ECS)资源,即节点所在节点池没有配置弹性伸缩,同时还有弹性容器实例(VCI)资源。在该集群中部署一个工作负载(例如 Deployment)时,为了降低资源使用成本,您希望:
该方法主要适用于具有一定长稳流量,偶尔出现突发性峰值流量的工作负载。可通过固定的 ECS 资源承载长稳流量,通过 VCI 的快速弹性能力应对突发峰值。更多使用场景示例,请参见本文下方 场景示例。
若您已有可用的集群,且安装了 scheduler-plugin 组件并开启了弹性资源优先级调度,可跳过本步骤。


vke-resourcepolicy-nginx.yaml代码如下:apiVersion: scheduling.vke.volcengine.com/v1beta1 kind: ResourcePolicy metadata: name: vke-resourcepolicy-nginx namespace: default # ResourcePolicy 所属命名空间。该命名空间必须与被调度的 Pod 命名空间相同。 spec: selector: app: demo-nginx # Label 为 app:demo-nginx 的 Pod 将被该 ResourcePolicy 管理。 subsets: - name: pool-ecs # 第一个 subset 为 ECS 资源池。 maxReplicas: 2 # 调度到该资源池的 Pod 数量上限,本示例为实现 ECS 资源不足或 Pod 数量达到上限时调度 Pod 到 VCI 资源的效果,此处设置为 2。实际使用中请按“参数说明”估算。 whenNotReachMax: ScheduleAnyWay #配置为 ScheduleAnyWay,确保当 ECS 资源不足时 Pod 直接被调度到 VCI 资源上。 nodeSelectorTerm: - key: cluster.vke.volcengine.com/machinepool-name operator: In values: - pcm5pq1r5i7aqm****** # 匹配的 ECS 资源对应节点池 ID,请确保节点池 ID 配置正确。可以配置多个节点池 ID。 - name: pool-vci # 第二个 subset 为 VCI 资源池。 maxReplicas: 100 # 建议为 VCI 资源池配置可调度的 Pod 数量上限,以防止 VCI 资源配额被耗尽。 nodeSelectorTerm: - key: type operator: In values: - virtual-kubelet # 匹配到 VCI 虚拟节点。 tolerations: # 如果 Pod 被调度到该资源池,需要给 Pod 打上额外的容忍度。 - effect: NoSchedule key: vci.vke.volcengine.com/node-type operator: Equal value: vci
kubectl apply -f vke-resourcepolicy-nginx.yaml
本文以创建无状态负载(Deployment)为例,更多工作负载相关操作,请参见 工作负载。
demo-nginx.yaml代码如下:apiVersion: apps/v1 kind: Deployment metadata: name: demo-nginx namespace: default # Deployment 所属命名空间,与 ResourcePolicy 的 namespace 相匹配。 spec: replicas: 5 # Pod 数量。 selector: matchLabels: app: demo-nginx template: metadata: labels: app: demo-nginx # Pod Label,与 ResourcePolicy 的 selector 中配置的 label 相匹配。 spec: schedulerName: default-scheduler containers: - image: nginx:1.14.2 # Pod 的容器镜像地址和 Tag,请替换为您实际业务中的镜像地址。 imagePullPolicy: IfNotPresent name: nginx-container resources: requests: cpu: 10m memory: 10Mi dnsPolicy: ClusterFirst restartPolicy: Always securityContext: {}
kubectl apply -f demo-nginx.yaml
预期输出如下,2 个 Pod 被调度到 ECS 资源上,剩余的 Pod(3 个)被调度到 VCI 资源。kubectl get po -n default -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES demo-nginx-6b6bfc8b7f-62qls 1/1 Running 0 66m 192.168.**.** vci-node1-cn-shanghai-a <none> <none> demo-nginx-6b6bfc8b7f-97md6 1/1 Running 0 66m 192.168.**.** 192.168.**.** <none> <none> demo-nginx-6b6bfc8b7f-bzdnw 1/1 Running 0 66m 192.168.**.** vci-node1-cn-shanghai-b <none> <none> demo-nginx-6b6bfc8b7f-rjrnx 1/1 Running 0 66m 192.168.**.** vci-node1-cn-shanghai-a <none> <none> demo-nginx-6b6bfc8b7f-tjc5p 1/1 Running 0 31m 192.168.**.** 192.168.**.** <none> <none>
kubectl scale --replicas=3 deployment/demo-nginx -n default
预期输出如下,VCI 资源上的 2 个 Pod 被优先缩容,释放 VCI 资源。kubectl get po -n default -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES demo-nginx-6b6bfc8b7f-97md6 1/1 Running 0 70m 192.168.**.** 192.168.**.** <none> <none> demo-nginx-6b6bfc8b7f-bzdnw 1/1 Running 0 70m 192.168.**.** vci-node1-cn-shanghai-b <none> <none> demo-nginx-6b6bfc8b7f-tjc5p 1/1 Running 0 35m 192.168.**.** 192.168.**.** <none> <none>
subset。subset下的maxReplicas字段,防止耗尽 VCI 资源配额。可根据 VCI 资源的配额和 Pod 的资源需求估算出maxReplicas字段的值。subset。subset下的maxReplicas字段,用于控制 ECS 资源被使用的上限。可根据 ECS 资源的容量和 Pod 的资源需求估算出maxReplicas字段的值。subset的whenNotReachMax配置为DoNotSchedule,在 ECS 资源不足时会短暂 Pending 被调度的 Pod,然后触发弹性伸缩对 ECS 资源节点池进行扩容。apiVersion: scheduling.vke.volcengine.com/v1beta1 kind: ResourcePolicy metadata: name: vke-resourcepolicy-nginx namespace: default spec: selector: app: nginx # Label 为 app: nginx 的 Pod 将被该 ResourcePolicy 管理。 subsets: - name: pool-vci # 第一个 subset 为 VCI 资源池,优先使用 VCI 资源。 maxReplicas: 100 # 建议配置 maxReplicas 字段,防止耗尽 VCI 资源配额。 nodeSelectorTerm: - key: type operator: In values: - virtual-kubelet # 匹配到 VCI 虚拟节点。 - name: pool-ecs # 第二个 subset 为 ECS 资源池,作为 VCI 资源不足时的补充。 maxReplicas: 1000 # 需配置 maxReplicas 字段,用于控制 ECS 资源被使用的上限。 whenNotReachMax: DoNotSchedule # 配置为 DoNotSchedule,当 ECS 节点池资源不足时,将会暂时让 Pod 处于 Pending 状态并等待节点池弹性伸缩。 nodeSelectorTerm: - key: cluster.vke.volcengine.com/machinepool-name operator: In values: - pcgc1omersf****** # 匹配的 ECS 节点池 ID,可以配置多个节点池。 - ncljdfq33h3****** tolerations: # 如果 Pod 被调度到该资源池,需要给 Pod 打上额外的容忍度。 - effect: NoSchedule key: vci.vke.volcengine.com/node-type operator: Equal value: vci
场景说明
按照一定的比例,将工作负载中的 Pod 调度到 ECS 资源和 VCI 资源中,以维持固定资源和弹性资源之间的平衡。该方法适用于业务从 ECS 资源向 VCI 弹性资源切换的过程中通过调整调度比例,实现逐步过渡。
配置说明
subset。subset下的maxReplicasRatio字段,按照比例调度 Pod 到 ECS 资源。subset。subset下的maxReplicasRatio字段,按照比例调度 Pod 到 VCI 资源。建议保障所有subset的maxReplicasRatio字段比例阈值之和为 1。注意
由于调度比例的计算在 Pod 数量较少时存在一定误差,不建议maxReplicasRatio与whenNotReachMax: DoNotSchedule同时配置,否则可能出现部分 Pod 在预期外被 Pending 的情况。
配置样例
apiVersion: scheduling.vke.volcengine.com/v1beta1 kind: ResourcePolicy metadata: name: vke-resourcepolicy-nginx namespace: default spec: selector: app: nginx # Label 为 app: nginx 的 Pod 将被该 ResourcePolicy 管理。 subsets: - name: pool-ecs # 第一个 subset 为 ECS 资源池。 maxReplicasRatio: "0.6" # 为第一个资源池配置调度比例为 0.6。 whenNotReachMax: ScheduleAnyWay # 建议配置为 ScheduleAnyWay。 nodeSelectorTerm: - key: cluster.vke.volcengine.com/machinepool-name operator: In values: - pcgc1omersf****** # 匹配的 ECS 节点池 ID,可以配置多个节点池。 - ncljdfq33h3****** - name: pool-vci # 第二个 subset 为 VCI 资源池。 maxReplicasRatio: "0.4" # 为第二个资源池配置调度比例为 0.4。 whenNotReachMax: ScheduleAnyWay # 建议配置为 ScheduleAnyWay 。 nodeSelectorTerm: - key: type operator: In values: - virtual-kubelet # 匹配到 VCI 虚拟节点。 tolerations: # 如果 Pod 被调度到该资源池,需要给 Pod 打上额外的容忍度。 - effect: NoSchedule key: vci.vke.volcengine.com/node-type operator: Equal value: vci