You need to enable JavaScript to run this app.
导航

VCI 实例库存感知调度

最近更新时间2024.04.26 15:01:18

首次发布时间2024.04.26 15:01:18

本文主要介绍如何使用弹性容器实例(VCI)库存感知调度,感知 VCI 资源的库存,合理规划容器业务。

说明

邀测·申请试用】:该功能目前处于邀测阶段,如需使用,请提交申请。

背景信息

一个 Kubernetes 集群分为控制面和数据面,通常编排和调度 Pod 的组件在控制面,拉起 Pod 使其运行的组件在数据面,因此一个 Pod 的生命周期可以简单分为两个阶段:

  • 等待控制面为 Pod 调度一个数据面节点,在等待过程中,Pod 处于 Pending 状态。调度成功后,Pod 将被某个数据面节点接管。
  • 数据面节点将 Pod 拉起运行,如果拉起成功,则会进入 Running/Succeeded 状态,如果拉起失败,则会进入 Failed 状态。

对于 VKE 集群而言,VCI 属于一个特殊的数据面,可将集群中的 Pod 调度到 VCI 上。然而 VCI 资源,尤其 GPU 等稀缺资源和大规格(例如 64 核)资源可能会有售罄的情况,此时集群仍将 Pod 调度到 VCI 上会导致 VCI 没有足够的资源拉起 Pod,从而使 Pod 进入 Failed 状态。

针对上述场景,VCI 提供库存感知调度能力,使得 VKE 在调度 Pod 时,能够感知到 VCI 的资源库存,选择库存更加充足的可用区(AZ)或者部署模式来调度 Pod 到 VCI 或者 ECS,从而提升 Pod 创建成功率。

使用方法

步骤一:确认集群版本

由于库存感知调度依赖多个 VKE 中组件的共同作用,部分组件是需要在 VKE 集群升级到特定版本之后才能具备对应的能力,因此使用 VCI 库存感知调度能力前,请确保业务所在的 VKE 集群版本满足如下要求:

若集群版本不满足要求,请升级集群版本。详细操作,请参见 升级集群

说明

Kubernetes 1.28 版本 版本集群暂不支持使用 VCI 相关功能。

步骤二:安装和配置依赖的组件

集群版本满足要求后,需要确保已安装 VCI 库存感知调度能力依赖的组件 vci-virtual-kubelet 和 scheduler-plugin 组件,同时在 scheduler-plugin 中开启 VCI 库存感知调度 开关。

  1. 登录 容器服务控制台
  2. 在左侧导航栏中选择 集群,单击目标集群。
  3. 在集群管理页面的左侧导航栏中,选择 组件管理
  4. 找到 vci-virtual-kubeletscheduler-plugin 组件并安装组件。
    其中:
    • vci-virtual-kubelet:选择... > 安装,直接安装即可,无需二次配置。
    • scheduler-plugin:选择... > 安装 后需要进行二次配置,在本文操作中必须开启 VCI 库存感知调度 开关。详细操作和组件配置参数说明,请参见 scheduler-plugin 组件
      alt

步骤三:查看调度结果

VCI 库存感知能力的最终结果会受到集群调度器、VCI Annotation、VCI Profile 以及 ResourcePolicy 等多种机制共同影响,具体影响举例说明请见下文。

场景一:指定 Pod 必须调度到 VCI 上

通过如下两种方式,实现指定 Pod 必须调度到 VCI 资源上:

根据 步骤二VCI 库存感知调度 开关的开启和关闭状态的不同,Pod 创建结果也不同:

  • 已开启 VCI 库存感知调度:当 VCI 资源库存充足时,Pod 会被调度到虚拟节点(Virtual Node)上,并在 VCI 中被拉起。如果 VCI 库存不足,则 Pod 暂时在控制面处于 Pending 状态,等待 VCI 库存充足后会被调度到 VCI 上。
  • 未开启 VCI 库存感知调度:无论 VCI 库存是否充足,Pod 都会被调度到虚拟节点上,如果此时 VCI 库存不足,则 Pod 因创建失败而直接入 Failed 状态。

场景二:既允许 Pod 调度到 ECS 上,也允许 Pod 调度到 VCI 上

通过如下三种方式,实现同时允许 Pod 调度到 ECS 节点和 VCI 资源上:

  • 手动为 Pod 添加以下容忍度(Toleration):
    tolerations: # 该 toleration 表示允许 Pod 调度到 VCI 上
    - effect: NoSchedule
      key: vci.vke.volcengine.com/node-type
      operator: Equal
      value: vci
    
  • (推荐)使用 vci-profile,但 不要配置enforceSelectorToVci: true配置enforceSelectorToVci: false。详细操作,请参见 通过配置 vci-profile 使用 VCI
  • (推荐)使用弹性资源优先级调度能力,在 ResourcePolicy 中同时指定 VCI 类型的节点池和 ECS 类型的节点池。详细操作,请参见 弹性资源优先级调度

根据 步骤二VCI 库存感知调度 开关的开启和关闭状态的不同,Pod 创建结果也不同:

  • 已开启 VCI 库存感知调度:会按照 ResourcePolicy 中定义的优先级调度,当 VCI 资源库存充足时,Pod 有可能会被调度到虚拟节点上,当 VCI 资源库存不足时,Pod 要么调度到 ECS 节点上,要么处于 Pending 状态,但不会出现因为资源不足而创建 Pod 失败并进入 Failed 状态的情况。
  • 未开启 VCI 库存感知调度:无论 VCI 库存是否充足,Pod 都会被调度到虚拟节点上。Pod 被调度到 VCI 的可能性取决于其它的调度策略,不取决于 VCI 资源的库存。如果此时 VCI 库存不足,则 Pod 因创建失败而进入 Failed 状态。

场景三:强制 Pod 调度到指定虚拟节点上

通过为 Pod 指定node name为某个虚拟节点名称,可以实现强制 Pod 调度到指定的虚拟节点上。

这种场景下,VCI 库存感知调度不会生效,因为 Pod 会绕过 Kubernetes 调度机制直接在虚拟节点中创建,因此即便打开了 VCI 库存感知调度,Pod 仍然可能会因为 VCI 资源不足而创建失败,进入 Failed 状态。