You need to enable JavaScript to run this app.
文档中心
容器服务

容器服务

复制全文
下载 pdf
调度管理
弹性资源优先级调度
复制全文
下载 pdf
弹性资源优先级调度
容器服务提供弹性资源优先级调度策略,支持通过自定义资源策略(ResourcePolicy),设置工作负载的 Pod 被弹性调度到不同类型节点(例如包年包月 ECS、按量付费 ECS、虚拟节点)的顺序。本文主要介绍通过自定义资源策略(ResourcePolicy),设置弹性资源优先级调度的方法。​
前提条件​
  • 集群中已安装 scheduler-plugin 组件并开启 弹性资源优先级调度。详细操作,请参见 scheduler-plugin 组件。​
说明​
若您需要在 VCI 场景使用弹性资源优先级调度,请确保已创建 VCI 业务相关的集群,并在集群中安装了 scheduler-plugin 组件,开启 弹性资源优先级调度。 VCI 相关集群操作,请参见 对接 VCI。​
  • 在 VCI 业务中使用该能力时,建议开启 VCI 库存感知调度功能。详细操作,请参见 VCI 实例库存感知调度。​
使用限制​
  • 目前仅支持在如下 Kubernetes 版本的集群中使用弹性资源优先级调度功能,若集群版本不满足要求,请升级集群版本,详情请参见 升级集群:​
  • 该功能与 Kubernetes 的 pod-deletion-cost 冲突,不能同时使用。pod-deletion-cost 相关信息,请参见 pod-deletion-cost。​
  • 创建 ResourcePolicy 时,请确保目标命名空间下已调度的 Pod 没有被 ResourcePolicy 管理,否则已调度的 Pod 将会被优先缩容。​
  • 修改已有的 ResourcePolicy 时,已调度的 Pod 会按照原 ResourcePolicy 的顺序进行缩容,新建的 Pod 会按照更新后 ResourcePolicy 的顺序进行缩容。​
  • 仅 Deployment 支持通过 ResourcePolicy 实现逆序缩容,其余工作负载不支持逆序缩容。​
说明​
逆序缩容:指设置了 ResourcePolicy 的工作负载在缩容时,从 ResourcePolicy 中设置的优先级最低的资源池开始缩容。​
使用方法​
在 ResourcePolicy 中定义弹性资源优先级。​
注意​
  • ResourcePolicy 仅作用于自身所在命名空间下符合指定 Label 的所有工作负载相关 Pod。​
  • 下文中的 资源池 与 VKE 中定义的 节点池 不同,资源池 是集群中符合某一筛选条件的所有节点集合。​
  • 例如下文中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 缩容时,优先从最靠后的资源池节点进行缩容。​
子参数说明如下:​
  • name:资源池名称。​
  • maxReplicas:调度到该资源池的 Pod 数量上限。不设置表示不限制。可根据 ECS 资源容量/VCI 资源配额和 Pod 的资源需求估算出maxReplicas字段的值。​
  • maxReplicasRatio:调度到该资源池的 Pod,占所有被 ResourcePolicy 管理的 Pod 的比例阈值,当超过该阈值时,不再向该资源池调度 Pod。取值范围为 [0,1]。​
  • whenNotReachMax:调度策略,有如下两种策略:​
  • DoNotSchedule:如果该资源节点池还未达到maxReplicasRatio或maxReplicas阈值,则 Pod 只能被调度到该资源节点池或更高优先级的资源节点池。​
  • ScheduleAnyWay:当该资源节点池没有可调度的资源时,无论是否已经达到maxReplicasRatio或maxReplicas阈值,考虑次优先级的资源节点池。​
  • nodeSelectorTerm:通过 Label 选择可调度的资源节点池。​
  • tolerations:如果 Pod 被调度到该资源池,需要给 Pod 打上额外的容忍度(Toleration)。格式与 Kubernetes 中pod.spec.tolerations相同。不配置表示不需要给 Pod 打额外的 Toleration。​
policyStatuses​
各个资源池对应的可调度 Pod 情况。​
  • name:资源池名称。​
  • missingReplicas:该资源池剩余可调度的 Pod 数量。missingReplicas: "-"表示您在创建该 ResourcePolicy 时,没有设置 maxReplicas。​
​
使用示例​
本文以如下场景为例,描述创建 ResourcePolicy,定义弹性资源优先级的方法:​
您的集群中有固定的云服务器(ECS)资源,即节点所在节点池没有配置弹性伸缩,同时还有弹性容器实例(VCI)资源。在该集群中部署一个工作负载(例如 Deployment)时,为了降低资源使用成本,您希望:​
  • 部署的 Pod 优先调度到固定的 ECS 资源,当 ECS 资源不足时,使用 VCI 弹性资源作为补充。​
  • 在缩容时优先删除 VCI 上的 Pod,释放 VCI 资源,再删除 ECS 上的 Pod,释放 ECS 资源。​
该方法主要适用于具有一定长稳流量,偶尔出现突发性峰值流量的工作负载。可通过固定的 ECS 资源承载长稳流量,通过 VCI 的快速弹性能力应对突发峰值。更多使用场景示例,请参见本文下方 场景示例。​
步骤一:(可选)创建集群并开启弹性资源优先级调度​
若您已有可用的集群,且安装了 scheduler-plugin 组件并开启了弹性资源优先级调度,可跳过本步骤。​
  1. 在容器服务的左侧导航栏,选择 集群,单击 创建集群。​
  1. 在 创建集群 对话框,单击 自定义托管集群 区域下的 立即创建。​
  1. 在 创建集群 页面根据系统提示和实际需求配置集群参数。​
  • 其中部分参数按如下说明配置,其余参数的详细配置说明,请参见 创建托管集群。​
  • 因为以集群中同时存在 ECS 和 VCI 资源的场景为例,所以在 ① 集群配置 步骤中 容器网络模型 选择 VPC-CNI。​
  • 在 ③ 组件配置 步骤的 scheduler-plugin 参数配置 中开启 弹性资源优先级调度 按钮并配置调度权重。​
  • ​alt​​
  1. 确认配置并单击 确定,创建完成集群。​
步骤二:创建 ResourcePolicy​
  1. 通过 kubectl 连接 步骤一 中创建的 VPC-CNI 集群。具体操作说明,请参见 连接集群。​
  1. 创建 ResourcePolicy 的 YAML 文件。示例文件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​
    ​
  1. 执行以下命令,创建 ResourcePolicy。​
  • ​
    kubectl apply -f vke-resourcepolicy-nginx.yaml​
    ​
步骤三:创建工作负载​
本文以创建无状态负载(Deployment)为例,更多工作负载相关操作,请参见 工作负载。​
  1. 创建 Deployment 的 YAML 文件。示例文件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: {}​
    ​
  1. 执行以下命令,创建 Deployment。​
  • ​
    kubectl apply -f demo-nginx.yaml​
    ​
步骤四:查看调度结果​
  1. 执行如下命令,查看调度结果。​
  • ​
    kubectl get po -n default -o wide​
    ​
  • 预期输出如下,2 个 Pod 被调度到 ECS 资源上,剩余的 Pod(3 个)被调度到 VCI 资源。​
  • ​
    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>​
    ​
  1. (可选)查看 Pod 缩容时,释放资源的情况。​
  1. 执行如下命令,将 Deployment 的 Pod 数量(即 replicas 参数值)降到 3。​
  • ​
    kubectl scale --replicas=3 deployment/demo-nginx -n default​
    ​
  1. 查看调度结果。​
  • ​
    kubectl get po -n default -o wide​
    ​
  • 预期输出如下,VCI 资源上的 2 个 Pod 被优先缩容,释放 VCI 资源。​
  • ​
    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>​
    ​
场景示例​
场景一:VCI 资源 + 自动伸缩的 ECS 资源​
  • 场景说明​
  • 所在集群的目标命名空间下有 VCI 资源和自动伸缩的 ECS 资源时,优先使用 VCI 资源。当 VCI 配额不足时,将 Pod 调度到 ECS 资源中,并在 ECS 资源池中触发弹性伸缩进行扩容。该方法主要适用于突发资源用量较大的批量作业等业务,无需维持固定的 ECS 资源成本,优先通过 VCI 获得高性价比的弹性资源。当 VCI 承载能力不够时,可以通过 ECS 的弹性伸缩来保障资源供应。​
  • 配置说明​
  1. 将 VCI 资源对应的虚拟节点配置为第一个subset。​
  • 建议配置subset下的maxReplicas字段,防止耗尽 VCI 资源配额。可根据 VCI 资源的配额和 Pod 的资源需求估算出maxReplicas字段的值。​
  1. 将 ECS 资源对应的节点池配置为第二个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 资源​
  • 场景说明​
  • 按照一定的比例,将工作负载中的 Pod 调度到 ECS 资源和 VCI 资源中,以维持固定资源和弹性资源之间的平衡。该方法适用于业务从 ECS 资源向 VCI 弹性资源切换的过程中通过调整调度比例,实现逐步过渡。​
  • 配置说明​
  1. 将 ECS 资源对应的节点池配置为第一个subset。​
  • 需要配置subset下的maxReplicasRatio字段,按照比例调度 Pod 到 ECS 资源。​
  1. 将 VCI 资源对应的虚拟节点配置为第二个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​
    ​
​
最近更新时间:2026.03.13 10:40:55
这个页面对您有帮助吗?
有用
有用
无用
无用