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

容器服务

复制全文
下载 pdf
调度
弹性资源优先级调度最佳实践
复制全文
下载 pdf
弹性资源优先级调度最佳实践
本文主要介绍弹性资源优先级调度能力相关的最佳实现。​
适用场景​
弹性资源优先级调度通过自定义资源 ResourcePolicy,设置工作负载 Pod 被调度到不同类型节点的顺序,例如包年包月 ECS、按量付费 ECS、自动伸缩 ECS 和 VCI 虚拟节点。该能力适合需要在多个资源池之间做成本、弹性和稳定性取舍的业务。根据不同的业务场景,推荐使用方式如下:​
​
场景​
推荐资源池顺序​
关键配置​
适用业务​
VCI 和自动伸缩 ECS ​
VCI 在前,自动伸缩 ECS 在后。​
  • VCI 设置maxReplicas​
  • ECS 设置maxReplicas和whenNotReachMax: DoNotSchedule。​
突发资源用量大的批量作业。​
​
固定 ECS 优先和VCI 承接突发​
ECS 节点池在前,VCI 在后。​
  • ECS 设置maxReplicas​
  • VCI 设置maxReplicas或maxReplicasRatio。​
有长期稳定流量、偶发峰值的在线服务。​
ECS 与 VCI 按比例调度​
通常 ECS 在前,VCI 在后。​
两个资源池都设置maxReplicasRatio,比例之和建议为 1。​
从 ECS 向 VCI 逐步迁移或成本结构调优。​
​
前置检查​
  • 集群已安装 scheduler-plugin,并开启 弹性资源优先级调度。​
  • 如果涉及 VCI,已创建 VCI 业务相关集群或虚拟节点,并建议开启 VCI 库存感知调度。​
  • 目标工作负载使用稳定 Label,且 ResourcePolicy 与 Pod 在同一命名空间。​
  • 目标命名空间下已调度 Pod 不会被新的ResourcePolicy.selector误选中。​
  • 未同时使用 Kubernetes pod-deletion-cost 控制缩容顺序。​
更多使用限制参考 弹性资源优先级调度。​
详细配置参数​
ResourcePolicy 只作用于自身命名空间下符合 selector 的工作负载 Pod。subsets表示资源池配置,顺序越靠前,Pod 越优先调度到该资源池;缩容时则优先从最靠后的低优先级资源池缩容。​
​
参数​
含义​
配置建议​
metadata.name​
​
ResourcePolicy 对象名称。​
建议体现业务和资源池模型,例如 web-ecs-vci-ratio、batch-vci-first,便于排障时快速识别策略用途。​
metadata.namespace​
ResourcePolicy 所属命名空间。策略只作用于同命名空间下被 selector 选中的 Pod。​
必须与目标工作负载 Pod 所在命名空间一致。不要把同一业务的策略和工作负载拆到不同命名空间。​
spec.selector​
选择被 ResourcePolicy 管理的 Pod,格式为一组 Label 键值对。​
使用业务专属且稳定的 Label,例如 app: web。创建前确认命名空间下已有 Pod 不会被误选中,否则已有 Pod 可能被优先缩容。​
spec.subsets​
资源池列表。顺序越靠前,调度优先级越高;缩容时优先从越靠后的资源池删除 Pod。​
按“稳定性、成本、弹性”的优先级排序。固定 ECS 优先场景通常 ECS 在前、VCI 在后;VCI 优先批量作业场景则 VCI 在前、自动伸缩 ECS 在后。​
spec.subsets[].name​
资源池名称,同时会出现在status.policyStatuses[].name中。​
使用能表达资源类型和用途的名称,例如pool-ecs-stable、pool-vci-burst、pool-ecs-autoscale。​
spec.subsets[].maxReplicas​
调度到该资源池的 Pod 数量上限。不配置表示不限制。​
按资源池可用容量、VCI 配额、单 Pod requests 和预算上限估算。VCI 资源池建议配置,避免突发时耗尽 VCI 配额。​
spec.subsets[].maxReplicasRatio​
调度到该资源池的 Pod 占所有被管理 Pod 的比例阈值,官方文档给出的取值范围为 [0,1]。​
适合 ECS/VCI 按比例分摊或迁移场景。所有资源池比例之和建议为 1;小副本数场景存在取整误差,不建议与whenNotReachMax: DoNotSchedule同时使用。​
spec.subsets[].whenNotReachMax​
资源池尚未达到maxReplicas或maxReplicasRatio,但暂时没有可调度资源时的处理策略。支持DoNotSchedule和ScheduleAnyWay。​
  • 需要等待目标资源池扩容时使用 DoNotSchedule,典型如自动伸缩 ECS。​
  • 需要快速降级到次优资源池时使用 ScheduleAnyWay,典型如固定 ECS 不足后快速溢出到 VCI。​
spec.subsets[].nodeSelectorTerm​
通过节点 Label 选择组成资源池的节点集合,结构与 Kubernetes NodeSelectorRequirement一致。​
  • ECS 通常匹配cluster.vke.volcengine.com/machinepool-name节点池 ID​
  • VCI 通常匹配type=virtual-kubelet。一个资源池可以匹配多个 ECS 节点池 ID。​
spec.subsets[].tolerations​
当 Pod 被调度到该资源池时,需要附加的容忍度,格式与 Kubernetes pod.spec.tolerations一致。​
  • VCI 虚拟节点通常需要配置vci.vke.volcengine.com/node-type=vci的 NoSchedule 容忍。​
  • ECS 普通节点池如无污点可不配置。​
​
场景一:VCI 和自动伸缩 ECS​
该场景中,业务优先使用 VCI 。当 VCI 配额不足或承载能力不够时,Pod 被调度到 ECS 节点池,并通过 ECS 节点池弹性伸缩补充资源。该方法主要适用于突发资源用量较大的批量作业等业务,无需长期维持固定 ECS 资源成本。当 VCI 承载能力不够时,可以通过 ECS 的弹性伸缩来保障资源供应。​
推荐配置​
  1. 将 VCI 虚拟节点配置为第一个subset,优先承接 Pod。​
  1. 为 VCI subset 设置maxReplicas,防止 VCI 配额被耗尽。​
  1. 将开启弹性伸缩的 ECS 节点池配置为第二个subset。​
  1. 为 ECS subset 设置maxReplicas,控制 ECS 资源使用上限。​
  1. 将 ECS subset 的whenNotReachMax设置为DoNotSchedule,让 ECS 资源不足时 Pod 短暂 Pending,从而触发节点池弹性伸缩。​
  • ​
    apiVersion: scheduling.vke.volcengine.com/v1beta1​
    kind: ResourcePolicy​
    metadata:​
    name: batch-vci-first​
    namespace: default​
    spec:​
    selector:​
    app: batch-worker​
    subsets:​
    - name: pool-vci​
    maxReplicas: 3​
    nodeSelectorTerm:​
    - key: type​
    operator: In​
    values:​
    - virtual-kubelet​
    tolerations:​
    - key: vci.vke.volcengine.com/node-type​
    operator: Equal​
    value: vci​
    effect: NoSchedule​
    - name: pool-ecs-autoscale​
    maxReplicas: 1000​
    whenNotReachMax: DoNotSchedule​
    nodeSelectorTerm:​
    - key: cluster.vke.volcengine.com/machinepool-name​
    operator: In​
    values:​
    - pd9jgcq4rr8ctg8mb****​
    ​
验证方法​
  1. 连接目标集群,详情请参见使用 kubectl 连接集群。​
  1. 确定 VCI 虚拟节点存在,且工作负载具备调度到 VCI 所需的 Toleration;ECS 节点池已开启弹性伸缩。​
  • ​​​
  • 为更直观的观察创建过程中的行为,这里将 ECS 节点池设置为 0 节点的空节点池。​
  • ​​​
  1. 部署示例应用。​
  • ​
    apiVersion: apps/v1​
    kind: Deployment​
    metadata:​
    name: batch-worker-verify​
    namespace: default​
    spec:​
    replicas: 10​
    selector:​
    matchLabels:​
    app: batch-worker​
    template:​
    metadata:​
    labels:​
    app: batch-worker​
    spec:​
    schedulerName: default-scheduler​
    containers:​
    - name: worker​
    image: cr-helm-test-cn-beijing.cr.volces.com/vke/nginx:latest​
    resources:​
    requests:​
    cpu: "1"​
    memory: "2Gi"​
    ​
  1. 当 VCI 达到maxReplicas或配额不足时,新 Pod 进入 ECS subset的调度路径。​
  • ​
    $ kubectl get pods -owide​
    NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES​
    batch-worker-verify-5f8f94c7f9-**** 0/1 Pending 0 15s <none> <none> <none> <none>​
    batch-worker-verify-5f8f94c7f9-**** 0/1 Pending 0 15s <none> <none> <none> <none>​
    batch-worker-verify-5f8f94c7f9-**** 1/1 Running 0 15s 192.**.**.** vci-node1-cn-beijing-a <none> <none>​
    batch-worker-verify-5f8f94c7f9-**** 0/1 Pending 0 15s <none> <none> <none> <none>​
    batch-worker-verify-5f8f94c7f9-**** 0/1 Pending 0 15s <none> <none> <none> <none>​
    batch-worker-verify-5f8f94c7f9-**** 1/1 Running 0 15s 192.**.**.** vci-node1-cn-beijing-a <none> <none>​
    batch-worker-verify-5f8f94c7f9-**** 0/1 Pending 0 15s <none> <none> <none> <none>​
    batch-worker-verify-5f8f94c7f9-**** 0/1 Pending 0 15s <none> <none> <none> <none>​
    batch-worker-verify-5f8f94c7f9-**** 1/1 Running 0 15s 192.**.**.** vci-node1-cn-beijing-b <none> <none>​
    batch-worker-verify-5f8f94c7f9-**** 0/1 Pending 0 15s <none> <none> <none> <none>​
    ​
  • ​​​
  • ECS 资源不足时,Pod 短暂 Pending,并触发节点池扩容。​
  • ​​​
  • 扩容后 Pod 能进入 Running,且没有因 VCI 库存不足直接 Failed。​
  • ​
    $ kubectl get pods -owide​
    NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES​
    batch-worker-verify-5f8f94c7f9-**** 1/1 Running 0 3m10s 192.**.**.** 192.**.**.** <none> <none>​
    batch-worker-verify-5f8f94c7f9-**** 1/1 Running 0 3m10s 192.**.**.** 192.**.**.** <none> <none>​
    batch-worker-verify-5f8f94c7f9-**** 1/1 Running 0 3m10s 192.**.**.** vci-node1-cn-beijing-a <none> <none>​
    batch-worker-verify-5f8f94c7f9-**** 1/1 Running 0 3m10s 192.**.**.** 192.**.**.** <none> <none>​
    batch-worker-verify-5f8f94c7f9-**** 1/1 Running 0 3m10s 192.**.**.** 192.**.**.** <none> <none>​
    batch-worker-verify-5f8f94c7f9-**** 1/1 Running 0 3m10s 192.**.**.** vci-node1-cn-beijing-a <none> <none>​
    batch-worker-verify-5f8f94c7f9-**** 1/1 Running 0 3m10s 192.**.**.** 192.**.**.** <none> <none>​
    batch-worker-verify-5f8f94c7f9-**** 1/1 Running 0 3m10s 192.**.**.** 192.**.**.** <none> <none>​
    batch-worker-verify-5f8f94c7f9-**** 1/1 Running 0 3m10s 192.**.**.** vci-node1-cn-beijing-b <none> <none>​
    batch-worker-verify-5f8f94c7f9-**** 1/1 Running 0 3m10s 192.**.**.** 192.**.**.** <none> <none>​
    ​
  • ​​​
风险与调优​
该场景的风险主要在等待时间。DoNotSchedule会让 Pod 在 ECS 节点池扩容前保持 Pending,因此不适合对启动时延极敏感的在线流量。​
场景二:按比例将 Pod 调度到 ECS 和 VCI​
该场景通过maxReplicasRatio控制 ECS 和 VCI 的副本比例,适合业务从 ECS 向 VCI 过渡、做成本结构调优,或希望固定资源和弹性资源之间保持长期平衡。​
推荐配置​
  1. 将 ECS 节点池配置为第一个subset,例如比例 0.6。​
  1. 将 VCI 虚拟节点配置为第二个subset,例如比例 0.4。​
  1. 两个 subset 都设置maxReplicasRatio,比例阈值之和建议为 1。​
  1. whenNotReachMax建议使用ScheduleAnyWay。Pod 数量较少时比例计算存在一定误差,不建议将maxReplicasRatio与whenNotReachMax: DoNotSchedule同时配置,否则可能出现部分 Pod 在预期外 Pending。​
  • ​
    apiVersion: scheduling.vke.volcengine.com/v1beta1​
    kind: ResourcePolicy​
    metadata:​
    name: web-ecs-vci-ratio​
    namespace: default​
    spec:​
    selector:​
    app: web​
    subsets:​
    - name: pool-ecs​
    maxReplicasRatio: "0.6"​
    whenNotReachMax: ScheduleAnyWay​
    nodeSelectorTerm:​
    - key: cluster.vke.volcengine.com/machinepool-name​
    operator: In​
    values:​
    - pd9jgcq4rr8ctg8mb****​
    - pd9jg9a4rr8ctg8mb****​
    - name: pool-vci​
    maxReplicasRatio: "0.4"​
    whenNotReachMax: ScheduleAnyWay​
    nodeSelectorTerm:​
    - key: type​
    operator: In​
    values:​
    - virtual-kubelet​
    tolerations:​
    - key: vci.vke.volcengine.com/node-type​
    operator: Equal​
    value: vci​
    effect: NoSchedule​
    ​
验证方法​
  1. 连接目标集群,详情请参见使用 kubectl 连接集群。​
  1. 验证 ResourcePolicy 对象符合预期。​
  • ​
    $ kubectl get resourcepolicy -n default​
    NAME AGE​
    web-ecs-vci-ratio 58s​
    ​
  • ​​​
  1. 部署测试工作负载,设置为 10 副本。​
  • ​
    apiVersion: apps/v1​
    kind: Deployment​
    metadata:​
    name: web-ecs-vci-ratio-verify​
    namespace: default​
    spec:​
    replicas: 10​
    selector:​
    matchLabels:​
    app: web​
    template:​
    metadata:​
    labels:​
    app: web​
    spec:​
    schedulerName: default-scheduler​
    containers:​
    - name: worker​
    image: cr-helm-test-cn-beijing.cr.volces.com/vke/nginx:latest​
    resources:​
    requests:​
    cpu: "1"​
    memory: "2Gi"​
    ​
  1. 观察副本分布。​
  • ​
    $ kubectl get pods -owide​
    NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 15s 192.**.**.** vci-node1-cn-beijing-b <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 15s 192.**.**.** 192.**.**.** <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 15s 192.**.**.** vci-node1-cn-beijing-b <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 15s 192.**.**.** vci-node1-cn-beijing-b <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 15s 192.**.**.** vci-node1-cn-beijing-a <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 15s 192.**.**.** 192.**.**.** <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 15s 192.**.**.** 192.**.**.** <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 15s 192.**.**.** 192.**.**.** <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 15s 192.**.**.** 192.**.**.** <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 15s 192.**.**.** 192.**.**.** <none> <none>​
    ​
  • ​​​
  1. 缩容时(10->8)优先释放靠后的低优先级资源池。​
  • ​
    $ kubectl get pods -owide​
    NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 81s 192.**.**.** vci-node1-cn-beijing-b <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 81s 192.**.**.** 192.**.**.** <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 0/1 Terminating 0 81s 192.**.**.** vci-node1-cn-beijing-b <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 0/1 Terminating 0 81s 192.**.**.** vci-node1-cn-beijing-b <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 81s 192.**.**.** vci-node1-cn-beijing-a <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 81s 192.**.**.** 192.**.**.** <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 81s 192.**.**.** 192.**.**.** <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 81s 192.**.**.** 192.**.**.** <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 81s 192.**.**.** 192.**.**.** <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 81s 192.**.**.** 192.**.**.** <none> <none>​
    ​
  • ​​​
风险与调优​
比例调度不适合副本数很少的工作负载。比如总副本数只有 2 或 3 时,0.6/0.4 的目标比例会因为取整出现偏差。建议在副本数足够大、业务可以接受短时间比例偏差时使用该模式。迁移过程中可以从 0.9/0.1 开始,观察 VCI 稳定性和成本,再逐步调整到 0.7/0.3 或 0.6/0.4。​
场景三:固定 ECS 优先和VCI 承接突发​
该场景对应集群中同时存在固定 ECS 资源和 VCI 资源,工作负载优先调度到固定 ECS;当 ECS 资源不足或达到maxReplicas上限时,再使用 VCI 作为弹性补充。缩容时,ResourcePolicy 会优先从靠后的 VCI 资源池删除 Pod,先释放按需弹性资源,再释放固定 ECS 资源。​
该模式适合有一定长期稳定流量、偶尔出现突发峰值的在线服务。相比“VCI 优先 + 自动伸缩 ECS”,它更强调固定资源利用率和成本可控;相比“按比例调度”,它更强调资源池顺序和缩容释放顺序,而不是长期维持固定比例。​
推荐配置​
  1. 将固定 ECS 节点池配置为第一个 subset,优先承载稳定基线流量。​
  1. 为 ECS subset 设置maxReplicas,该值建议接近稳定流量所需副本数。​
  1. 将 VCI 虚拟节点配置为第二个 subset,用于承接 ECS 资源不足或业务突发峰值。​
  1. 为 VCI subset 设置maxReplicas,按峰值流量、VCI 配额和预算上限控制弹性资源使用规模。​
  1. 将 ECS subset 的whenNotReachMax设置为ScheduleAnyWay,确保固定 ECS 资源不足时 Pod 能快速溢出到 VCI;只有当 ECS 节点池本身开启弹性伸缩,且希望等待高优资源池扩容时,才考虑 DoNotSchedule。​
  • ​
    apiVersion: scheduling.vke.volcengine.com/v1beta1​
    kind: ResourcePolicy​
    metadata:​
    name: web-burst-policy​
    namespace: default​
    spec:​
    selector:​
    app: web​
    subsets:​
    - name: ecs-stable​
    maxReplicas: 4​
    whenNotReachMax: ScheduleAnyWay​
    nodeSelectorTerm:​
    - key: cluster.vke.volcengine.com/machinepool-name​
    operator: In​
    values:​
    - pd9jgcq4rr8ctg8mb1afg​
    - name: vci-burst​
    maxReplicas: 50​
    nodeSelectorTerm:​
    - key: type​
    operator: In​
    values:​
    - virtual-kubelet​
    tolerations:​
    - key: vci.vke.volcengine.com/node-type​
    operator: Equal​
    value: vci​
    effect: NoSchedule​
    ​
验证方法​
  1. 连接目标集群,详情请参见使用 kubectl 连接集群。​
  1. 验证 ResourcePolicy 对象符合预期​
  • ​
    $ kubectl get resourcepolicy -n default web-burst-policy -o jsonpath='{.status}'​
    {"policyStatuses":[{"currentReplicasRatio":"-","missingReplicas":"4","name":"ecs-stable"},{"currentReplicasRatio":"-","missingReplicas":"48","name":"vci-burst"}]}​
    ​
  • ​​​
  1. 部署测试工作负载。​
  • ​
    apiVersion: apps/v1​
    kind: Deployment​
    metadata:​
    name: web-ecs-vci-ratio-verify​
    namespace: default​
    spec:​
    replicas: 10​
    selector:​
    matchLabels:​
    app: web​
    template:​
    metadata:​
    labels:​
    app: web​
    spec:​
    schedulerName: default-scheduler​
    containers:​
    - name: worker​
    image: cr-helm-test-cn-beijing.cr.volces.com/vke/nginx:latest​
    resources:​
    requests:​
    cpu: "1"​
    memory: "2Gi"​
    ​
  1. 观察工作负载副本分布。​
  • ​
    $ kubectl get pods -owide​
    NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 30s 192.**.**.** vci-node1-cn-beijing-b <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 30s 192.**.**.** vci-node1-cn-beijing-b <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 30s 192.**.**.** 192.**.**.** <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 31s 192.**.**.** 192.**.**.** <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 31s 192.**.**.** 192.**.**.** <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 30s 192.**.**.** vci-node1-cn-beijing-a <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 31s 192.**.**.** 192.**.**.** <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 30s 192.**.**.** vci-node1-cn-beijing-a <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 30s 192.**.**.** vci-node1-cn-beijing-b <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 30s 192.**.**.** vci-node1-cn-beijing-b <none> <none>​
    ​
  • ​​​
  1. 缩容工作负载时,优先删除 VCI 资源池上的 Pod。​
  • ​
    $ kubectl get pods -owide​
    NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 83s 192.**.**.** vci-node1-cn-beijing-b <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Terminating 0 83s 192.**.**.** vci-node1-cn-beijing-b <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 83s 192.**.**.** 192.**.**.** <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 84s 192.**.**.** 192.**.**.** <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 84s 192.**.**.** 192.**.**.** <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 83s 192.**.**.** vci-node1-cn-beijing-a <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 84s 192.**.**.** 192.**.**.** <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 83s 192.**.**.** vci-node1-cn-beijing-a <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Running 0 83s 192.**.**.** vci-node1-cn-beijing-b <none> <none>​
    web-ecs-vci-ratio-verify-77c5f65fbb-**** 1/1 Terminating 0 83s 192.**.**.** vci-node1-cn-beijing-b <none> <none>​
    ​
  • ​​​
风险与调优​
该模式下,ecs-stable.maxReplicas应接近稳定流量所需副本数,例如常态 20 个副本即可承载基线流量,就可以把 ECS 资源池上限设置为 20;vci-burst.maxReplicas应按峰值流量、VCI 配额和预算上限设置。若固定 ECS 资源池配置过小,业务会过早进入 VCI,可能增加弹性资源成本;若 VCI 上限配置过大,突发流量可能快速消耗 VCI 配额或预算。​
注意如果将 ECS 节点池的whenNotReachMax参数设置为DoNotSchedule,但该 ECS 节点池未开启弹性伸缩,会导致业务 Pod 持续 Pending,而不会使用 VCI 创建 Pod,因此,若希望固定 ECS 资源池扩容后再使用 VCI,应确认 ECS 节点池已开启弹性伸缩,并谨慎将whenNotReachMax调整为DoNotSchedule。​
上线验证时建议先选择一个灰度工作负载,同时做扩容和缩容演练。若发现已有 Pod 被策略误选中,应先缩小selector范围,再重新执行灰度。​
上线步骤​
  1. 选择目标工作负载,确认 Deployment 的 Pod Label 稳定且不会误选其它 Pod。​
  1. 选择资源池模型:固定 ECS 优先、VCI 优先后备 ECS、或 ECS/VCI 按比例。​
  1. 创建 ResourcePolicy,把selector限定到灰度工作负载。​
  1. 扩容工作负载,观察 Pod 是否按资源池顺序调度。​
  1. 缩容工作负载,验证是否优先从低优先级资源池释放 Pod。​
  1. 若涉及 VCI,观察库存感知、VCI Pod 创建事件和成本指标。​
  1. 灰度稳定后,扩大到同类工作负载。​
风险与限制​
该能力与 Kubernetes pod-deletion-cost冲突,不能同时使用。创建 ResourcePolicy 前,还应确认目标命名空间下已调度 Pod 不会被策略误选中,否则已有 Pod 可能被优先缩容。​
修改已有 ResourcePolicy 时,已调度 Pod 会按照原策略顺序进行缩容,新建 Pod 会按照更新后的策略顺序进行缩容。因此,调整资源池顺序前应暂停或控制扩缩容,避免同一批 Pod 同时受新旧策略影响。​
回滚方案​
  1. 暂停对目标工作负载的扩缩容操作。​
  1. 将 Deployment 模板中的 Label 改为不匹配ResourcePolicy.selector,或删除 ResourcePolicy。​
  1. 重新发布工作负载并观察新 Pod 是否恢复普通调度。​
  1. 若已产生不符合预期的缩容顺序,先扩容恢复副本数,再重新设计资源池顺序。​
  1. 若 VCI 库存或配额异常,先降低 VCI maxReplicas或比例,再恢复在线服务副本。​
常见问题​
为什么 Pod 没有进入 VCI?​
先检查 VCI 虚拟节点是否存在、Pod 是否具备对应Toleration、ResourcePolicy.selector是否匹配、VCI subset 是否达到maxReplicas或maxReplicasRatio,以及 VCI 库存感知调度是否因为库存不足让 Pod 保持 Pending。​
为什么配置比例后实际分布不完全符合 ResourcePolicy 中给定的比例?​
副本数较少时,比例计算存在取整误差。建议在副本数足够大时使用比例调度,并避免将maxReplicasRatio与whenNotReachMax: DoNotSchedule同时配置。​
是否所有工作负载都支持逆序缩容?​
当前仅 Deployment 支持通过 ResourcePolicy 实现逆序缩容,其余工作负载不支持逆序缩容。​
最近更新时间:2026.09.20 17:15:33
这个页面对您有帮助吗?
有用
有用
无用
无用