- 文档首页
容器服务
容器服务 VKE
用户指南
调度管理
容器镜像感知调度
容器镜像感知调度
本文主要描述如何使用 VKE 提供的容器镜像感知调度能力,将 Pod 优先调度到有镜像缓存的节点上,从而降低容器冷启动时延、加快弹性扩容速度,并减轻镜像仓库和网络带宽压力。
容器镜像感知调度是 VKE 提供的基于节点镜像缓存情况进行合理调度的策略。调度过程中,调度器参考各节点上已有缓存的镜像信息,将 Pod 优先调度到已有镜像缓存的节点,从而避免因跨节点重复拉取大镜像而导致的冷启动耗时过长问题。
与 Kubernetes 原生的 ImageLocality 插件相比,容器镜像感知调度具备如下增强能力。
使用该功能时,有如下限制和须知事项:
- 目前仅支持在如下 Kubernetes 版本的集群中使用容器镜像感知调度功能,若集群版本不满足要求,请升级集群版本,详情请参见 升级集群:
- 该功能依赖 v0.5.13-vke.16 及以上版本的 katalyst 组件,需要通过该组件的 ConfigMap 配置镜像感知调度开关按钮。组件相关介绍,请参见 katalyst。
- 使用该功能的集群规模建议不超过 2000 个节点,每台节点镜像数量不超过 100 个。
- 集群处于 运行中 状态,且集群中存在多个可用节点。本文使用示例将以有 4 个节点的集群为例。集群中增加节点的方法,请参见 新增节点。
- 已安装 v0.5.13-vke.16 及以上版本的 katalyst 组件,若组件版本不满足要求,请升级组件。详细操作,请参见 升级组件。
- (可选)如需提升调度命中率,您可以自行对目标镜像完成镜像预热,将镜像提前分发到相应节点。
为节点配置使用 katalyst 组件能力进行资源管理的标签(Label)。
- 在集群管理页面,按如下方式为 Pod 所在节点添加 Label。
从节点池维度添加 Label
从节点维度添加 Label
说明
推荐使用该方法添加 Label,可以批量为节点池内的节点增加 Label。
- 在 节点池 页面找到目标节点池,单击对应 操作 列下的 编辑。
- 在 编辑节点池 页面的 ①节点池配置 步骤 高级配置 模块下配置 节点标签(Labels)并勾选 开启节点标签及污点自动更新。
- 标签键:vke.node.katalyst.deploy
-
- 在 节点 页面,找到目标节点,单击对应 操作 列下的...按钮选择 标签管理。
- 在 节点详情页 的 标签 页签下单击 添加标签,为节点添加如下标签后单击 确定。
- 标签键:vke.node.katalyst.deploy
安装 katalyst 组件后系统自动生成 ConfigMap,该 ConfigMap 中镜像感知调度默认处于关闭状态,需要通过编辑 ConfigMap 开启功能。
- 在集群管理页面左侧导航栏选择 配置管理 > 配置项。
- 在 配置项 页面选择 katalyst-system 命名空间,找到 katalyst-config 配置项,单击对应 操作 列的... > 编辑 Yaml。
-
- 将 ConfigMap YAML 中imageAffinity.enable字段设置为true。保存 YAML 文件变更后镜像感知调度功能自动生效,无需重启 katalyst 组件。
-
完成上述步骤后,节点上的镜像信息都记录在 Kubernetes 自定义资源 NodeImageCache 中。
- 使用 kubectl 连接集群。详情请参见 连接集群。
- 执行以下命令,查询集群中节点的 NodeImageCache。
- 其中,将<node-name>替换为您的节点名称。
- 预期查询结果如下,您可以查看 NodeImageCache 对象中的注释行,了解节点镜像信息。
本文以在拥有 4 个节点的托管集群上拉取所需镜像为例,为您演示使用镜像感知调度的效果。
- 准备需要使用的容器镜像,VKE 支持使用火山引擎镜像仓库(CR)中的镜像,也支持使用第三方镜像仓库中的镜像。上传镜像到 CR 的操作,请参见 推送和拉取镜像。
- 您可以自行准备镜像,也可以使用本文提供的测试镜像:vke-cn-beijing.cr.volces.com/vke/nginx:latest。
- 使用 ECS Terminal 方式登录节点,并通过crictl命令将准备好的镜像提前下载到 1 个节点上进行预热,其余 3 个节点不拉取该镜像。
下文以创建无状态负载(Deployment)为例,更多工作负载相关操作,请参见 工作负载。 - 通过 kubectl 连接集群。详细操作,请参见 连接集群。
- 创建 Deployment 的 YAML 文件。示例文件nginx-deployment-scn-test.yaml代码如下:
说明
为了演示更直观,本示例中 Deployment 将副本数设置为 10,且没有配置实例打散策略。实际生产环境中请配置实例强打散策略并在多台节点准备镜像缓存,避免实例都调度到同一个节点。对于有高可用需求的在线服务,建议关闭容器服务镜像感知调度功能。
下文以还未开启镜像感知调度能力为例,即 katalyst-config 配置项中imageAffinity.enable字段为false。
- 单击左侧导航栏中的 集群,找到目标集群后,单击集群名称。
- 在集群管理页面的左侧导航栏中,单击 工作负载 > 无状态负载。
- 在 无状态负载 页面找到上方 步骤二 中创建的 Deployment,单击名称。
- 在 无状态负载详情页 单击 实例列表 页签,查看 Pod 调度到节点上的情况。
- 预期结果如下图所示,仅有一个 Pod 调度到了具有已预热镜像的节点(192.168.174.133)上,镜像缓存命中率 10%。
-
- 单击左侧导航栏中的 集群,找到目标集群后,单击集群名称。
- 在集群管理页面的左侧导航栏中,单击 工作负载 > 无状态负载。
- 在 无状态负载 页面找到上方 步骤二 中创建的 Deployment,单击对应操作列的... > 编辑 Yaml,将 Deployment 副本数缩容到 0。
- 以 ECS Terminal 方式分别登录 3 个节点,执行以下命令删除节点上的镜像缓存,仅保留 1 个节点上的镜像缓存(本示例保留了192.168.174.133节点上的镜像缓存)。
- 在 配置管理 > 配置项 页面找到 katalyst-config 配置项,将其 YAML 中的imageAffinity.enable字段值设置为true,开启镜像感知调度。操作详情,请参见本文上方 使用方法-步骤二。
- 查询节点镜像信息,确保 4 个节点都有 NodeImageCache 对象,且192.168.174.133节点的 NodeImageCache 对象中有目标镜像。操作详情,请参见本文上方 使用方法-步骤三。
- 在 工作负载 > 无状态负载 页面单击目标 Deployment 对应操作列的... > 编辑 Yaml,将 Deployment 副本数重新调整到 10。
- 调整完 Deployment 副本数后,单击 Deployment 名称,进入 无状态负载详情页,然后单击 实例列表 页签,查看 Pod 调度到节点上的情况。
- 预期结果如下图所示,10 个 Pod 全部调度到了具有已预热镜像的节点(192.168.174.133)上,镜像缓存命中率 100%。
-
最近更新时间:2026.08.05 16:16:57