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

容器服务

复制全文
下载 pdf
调度管理
容器镜像感知调度
复制全文
下载 pdf
容器镜像感知调度
本文主要描述如何使用 VKE 提供的容器镜像感知调度能力,将 Pod 优先调度到有镜像缓存的节点上,从而降低容器冷启动时延、加快弹性扩容速度,并减轻镜像仓库和网络带宽压力。​
功能概述​
容器镜像感知调度是 VKE 提供的基于节点镜像缓存情况进行合理调度的策略。调度过程中,调度器参考各节点上已有缓存的镜像信息,将 Pod 优先调度到已有镜像缓存的节点,从而避免因跨节点重复拉取大镜像而导致的冷启动耗时过长问题。​
与 Kubernetes 原生的 ImageLocality 插件相比,容器镜像感知调度具备如下增强能力。​
​
对比维度​
Kubernetes 原生方案​
容器镜像感知调度​
上报镜像规模​
默认每节点最多约 50 个,镜像列表过大易使节点突破 20 KiB 写入建议值。​
采用前缀树压缩存储与独立 Custom Resource Definition(CRD),与原生方案相比支持 4~5 倍单节点镜像规模,秒级感知镜像变化、镜像大小和最近拉取时间。​
上报策略​
仅按镜像大小倒排截取,不考虑预热与使用情况。​
支持按最近拉取、镜像大小、镜像前缀匹配等维度筛选,可通过配置灵活控制。​
场景适配​
倾向于让同一镜像分散到多节点(适合在线服务),对强化学习(RL)这种 1 个镜像对应 1 个 Pod 的场景调度优先级打低分。​
以命中镜像大小作为基础分,天然适配高频、大镜像的强化学习、函数计算快速扩缩容、Agent 沙箱快速启动等场景。​
控制面耦合​
镜像信息挂载在节点上,DaemonSet、Autoscaler、Kubelet 等多个组件均需 Watch,易产生流量风暴。​
镜像信息独立存储在专用 CRD,仅调度器 Watch,控制面松耦合。​
​
使用限制​
使用该功能时,有如下限制和须知事项:​
  • 目前仅支持在如下 Kubernetes 版本的集群中使用容器镜像感知调度功能,若集群版本不满足要求,请升级集群版本,详情请参见 升级集群:​
  • 该功能依赖 v0.5.13-vke.16 及以上版本的 katalyst 组件,需要通过该组件的 ConfigMap 配置镜像感知调度开关按钮。组件相关介绍,请参见 katalyst。​
  • 使用该功能的集群规模建议不超过 2000 个节点,每台节点镜像数量不超过 100 个。​
前提条件​
  • 集群处于 运行中 状态,且集群中存在多个可用节点。本文使用示例将以有 4 个节点的集群为例。集群中增加节点的方法,请参见 新增节点。​
  • 已安装 v0.5.13-vke.16 及以上版本的 katalyst 组件,若组件版本不满足要求,请升级组件。详细操作,请参见 升级组件。​
  • (可选)如需提升调度命中率,您可以自行对目标镜像完成镜像预热,将镜像提前分发到相应节点。​
使用方法​
步骤一:为节点配置 Label​
为节点配置使用 katalyst 组件能力进行资源管理的标签(Label)。​
  1. 在左侧导航栏选择 集群,单击目标集群名称。​
  1. 在集群管理页面,按如下方式为 Pod 所在节点添加 Label。​
  • ​
    从节点池维度添加 Label
    从节点维度添加 Label
    ​
    说明​
    推荐使用该方法添加 Label,可以批量为节点池内的节点增加 Label。​
    1. 左侧导航栏选择 节点管理 > 节点池。​
    1. 在 节点池 页面找到目标节点池,单击对应 操作 列下的 编辑。​
    1. 在 编辑节点池 页面的 ①节点池配置 步骤 高级配置 模块下配置 节点标签(Labels)并勾选 开启节点标签及污点自动更新。​
    • 标签键:vke.node.katalyst.deploy​
    • 标签值:true​
    • ​​​
    1. 根据控制台向导,更新完成节点池配置。​
    ​
步骤二:开启镜像感知调度开关​
安装 katalyst 组件后系统自动生成 ConfigMap,该 ConfigMap 中镜像感知调度默认处于关闭状态,需要通过编辑 ConfigMap 开启功能。​
  1. 在集群管理页面左侧导航栏选择 配置管理 > 配置项。​
  1. 在 配置项 页面选择 katalyst-system 命名空间,找到 katalyst-config 配置项,单击对应 操作 列的... > 编辑 Yaml。​
  • ​​​
  1. 将 ConfigMap YAML 中imageAffinity.enable字段设置为true。保存 YAML 文件变更后镜像感知调度功能自动生效,无需重启 katalyst 组件。​
  • ​​​
步骤三:查询节点镜像信息​
完成上述步骤后,节点上的镜像信息都记录在 Kubernetes 自定义资源 NodeImageCache 中。​
  1. 使用 kubectl 连接集群。详情请参见 连接集群。​
  1. 执行以下命令,查询集群中节点的 NodeImageCache。​
  • 其中,将<node-name>替换为您的节点名称。​
  • ​
    kubectl get nodeimagecache <node-name> -oyaml​
    ​
  • 预期查询结果如下,您可以查看 NodeImageCache 对象中的注释行,了解节点镜像信息。​
  • ​
    apiVersion: node.katalyst.kubewharf.io/v1alpha1​
    kind: NodeImageCache​
    metadata:​
    name: 192.168.1.92​
    status:​
    updateTime: "2026-07-23T12:49:16Z"​
    # 树型结构组织镜像信息,提高检索速度的同时节省存储占用​
    images:​
    "docker.io":​
    chd:​
    "library":​
    chd:​
    "nginx":​
    lef:​
    # 镜像的不同版本,逗号分隔的三部分是:tag,sha256 摘要前缀,镜像大小字节数​
    - "1.25,abc123def456,150000000"​
    - "1.24,def456abc789,145000000"​
    "redis":​
    lef:​
    - "7-alpine,ghi789jkl012,35000000"​
    "busybox":​
    lef:​
    - "latest,jkl345mno678,2000000"​
    "cc-test-standard-cn-beijing.cr.volces.com":​
    chd:​
    "jianshan":​
    chd:​
    "nginx":​
    lef:​
    - "0.0.1-watch-sbx,fafd5f55,75916902"​
    "registry.k8s.io":​
    chd:​
    "pause":​
    lef:​
    - "3.9,pqr567stu890,700000"​
    "kube-proxy":​
    lef:​
    - "v1.30.0,stu234vwx5678,120000000"​
    "aibrix-cn-beijing.cr.volces.com":​
    chd:​
    "dcp":​
    chd:​
    "busybox":​
    lef:​
    - "latest,ec06ff94,2202009"​
    ​
使用示例​
本文以在拥有 4 个节点的托管集群上拉取所需镜像为例,为您演示使用镜像感知调度的效果。​
步骤一:准备容器镜像并预热镜像​
  1. 准备需要使用的容器镜像,VKE 支持使用火山引擎镜像仓库(CR)中的镜像,也支持使用第三方镜像仓库中的镜像。上传镜像到 CR 的操作,请参见 推送和拉取镜像。​
  • 您可以自行准备镜像,也可以使用本文提供的测试镜像:vke-cn-beijing.cr.volces.com/vke/nginx:latest。​
  1. 使用 ECS Terminal 方式登录节点,并通过crictl命令将准备好的镜像提前下载到 1 个节点上进行预热,其余 3 个节点不拉取该镜像。​
  • ​
    crictl pull vke-cn-beijing.cr.volces.com/vke/nginx:latest​
    ​
  • 本示例使用的 4 个节点拉取镜像情况如下:​
  • ​
    节点 IP​
    192.168.174.132​
    192.168.174.133​
    192.168.174.134​
    192.168.174.135​
    是否拉取了目标镜像​
    否​
    是​
    否​
    否​
    ​
步骤二:创建工作负载​
下文以创建无状态负载(Deployment)为例,更多工作负载相关操作,请参见 工作负载。​
  1. 通过 kubectl 连接集群。详细操作,请参见 连接集群。​
  1. 创建 Deployment 的 YAML 文件。示例文件nginx-deployment-scn-test.yaml代码如下:​
说明​
为了演示更直观,本示例中 Deployment 将副本数设置为 10,且没有配置实例打散策略。实际生产环境中请配置实例强打散策略并在多台节点准备镜像缓存,避免实例都调度到同一个节点。对于有高可用需求的在线服务,建议关闭容器服务镜像感知调度功能。​
  • ​
    apiVersion: apps/v1​
    kind: Deployment​
    metadata:​
    name: nginx-deployment-scn-test # Deployment 名称。​
    namespace: default # Deployment 所属命名空间。​
    spec:​
    progressDeadlineSeconds: 600​
    replicas: 10 # Deployment 副本数。​
    revisionHistoryLimit: 10​
    selector:​
    matchLabels:​
    app: nginx​
    strategy:​
    rollingUpdate:​
    maxSurge: 25%​
    maxUnavailable: 25%​
    type: RollingUpdate​
    template:​
    metadata:​
    labels:​
    app: nginx​
    spec:​
    containers:​
    - image: vke-cn-beijing.cr.volces.com/vke/nginx:latest # 容器镜像地址和 Tag,与已预热的镜像地址一致。​
    imagePullPolicy: Always​
    name: nginx​
    ports:​
    - containerPort: 80​
    protocol: TCP​
    resources: {}​
    terminationMessagePath: /dev/termination-log​
    terminationMessagePolicy: File​
    dnsPolicy: ClusterFirst​
    restartPolicy: Always​
    schedulerName: default-scheduler​
    securityContext: {}​
    terminationGracePeriodSeconds: 30​
    ​
  1. 执行以下命令创建 Deployment。​
  • ​
    kubectl apply -f nginx-deployment-scn-test.yaml​
    ​
步骤三:验证结果​
​
未开启镜像感知调度
开启镜像感知调度
​
下文以还未开启镜像感知调度能力为例,即 katalyst-config 配置项中imageAffinity.enable字段为false。​
  1. 单击左侧导航栏中的 集群,找到目标集群后,单击集群名称。​
  1. 在集群管理页面的左侧导航栏中,单击 工作负载 > 无状态负载。​
  1. 在 无状态负载 页面找到上方 步骤二 中创建的 Deployment,单击名称。​
  1. 在 无状态负载详情页 单击 实例列表 页签,查看 Pod 调度到节点上的情况。​
  • 预期结果如下图所示,仅有一个 Pod 调度到了具有已预热镜像的节点(192.168.174.133)上,镜像缓存命中率 10%。​
  • ​​​
​
最近更新时间:2026.08.05 16:16:57
这个页面对您有帮助吗?
有用
有用
无用
无用