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

容器服务

复制全文
下载 pdf
任务调度
基于 Kueue 的 Job 准入调度
复制全文
下载 pdf
基于 Kueue 的 Job 准入调度
本文主要介绍如何在 VKE 集群中使用 Kueue 实现 All-or-Nothing 调度能力。
背景信息
Kueue 是一个 Kubernetes 原生系统,用于管理配额以及作业(Job)如何使用配额。 在多团队/多业务共享集群,需要配额、排队、优先级、抢占等情况的完整批量作业治理场景中,可通过 Kueue 的配额(ClusterQueue)+ 整组准入(Workload)实现 All-or-Nothing。当配额不足以容纳整个 Job 时,该 Job 保持 Suspended,不会下发任何 Pod。
前提条件
  • 已创建 v1.30 及以上 Kubernetes 版本的 VKE 托管集群,详情请参见 创建托管集群
  • 已将目标集群的 KubeConfig 下载并配置到本地$HOME/.kube/config文件中,详情请参见 使用 kubectl 连接集群
操作步骤
步骤一:安装 Kueue
  1. 在本地终端配置 KubeConfig 地址。
  • export KUBECONFIG=${your_kubeconfig_path}
    ## 将 ${your_kubeconfig_path} 替换为您本地配置 KubeConfig 的地址。
    ## 例如本地配置 KubeConfig 的地址为 /Users/bytedance/.kube/config,则完整命令如下:
    ## export KUBECONFIG=/Users/bytedance/.kube/config
  1. 使用 Helm 工具安装 Kueue。
  • helm install kueue oci://registry.k8s.io/kueue/charts/kueue \
    --version 0.18.1 \
    --namespace kueue-system --create-namespace \
    --wait
  1. 确认 Kueue 安装状态。
  1. 确认 Helm release 状态。
  • helm list -n kueue-system
  • 预期输出如下,STATUSdeployed
  • NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
    kueue kueue-system 1 2026-06-15 18:55:25.549036 +0800 CST deployed kueue-0.18.1 v0.18.1
  1. 确认 Controller Pod 运行状态。
  • kubectl get pods -n kueue-system -o wide
  • 预期输出如下,READY1/1STATUSRunning
  • NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
    kueue-controller-manager-9c54ccf47-k5vmf 1/1 Running 0 4m10s 192.168.123.8 192.168.123.4 <none> <none>
  1. 检查 CRD 注册内容。
  • kubectl get crd | grep kueue.x-k8s.io
  • 预期输出如下,可见clusterqueueslocalqueuesworkloadsresourceflavors等 CRD:
  • admissionchecks.kueue.x-k8s.io 2026-06-15T10:55:33Z
    clusterqueues.kueue.x-k8s.io 2026-06-15T10:55:33Z
    cohorts.kueue.x-k8s.io 2026-06-15T10:55:33Z
    localqueues.kueue.x-k8s.io 2026-06-15T10:55:33Z
    multikueueclusters.kueue.x-k8s.io 2026-06-15T10:55:33Z
    multikueueconfigs.kueue.x-k8s.io 2026-06-15T10:55:33Z
    provisioningrequestconfigs.kueue.x-k8s.io 2026-06-15T10:55:33Z
    resourceflavors.kueue.x-k8s.io 2026-06-15T10:55:33Z
    topologies.kueue.x-k8s.io 2026-06-15T10:55:33Z
    workloadpriorityclasses.kueue.x-k8s.io 2026-06-15T10:55:33Z
    workloads.kueue.x-k8s.io 2026-06-15T10:55:33Z
步骤二:Job 准入调度
安装 Kueue 后,在 VKE 集群中使用 Kueue 验证 All-or-Nothing 调度能力。
  1. 创建队列并设置配额。
  • 本文仅配置 4 核 CPU 的 ClusterQueue 配额,用于后续验证配额不足时整组 Job 不被准入。执行以下命令,创建 ResourceFlavor、ClusterQueue 与 LocalQueue:
  • cat <<'EOF' | kubectl apply -f -
    apiVersion: kueue.x-k8s.io/v1beta1
    kind: ResourceFlavor
    metadata:
    name: default-flavor # ResourceFlavor 名称,被下方 ClusterQueue 引用。
    ---
    apiVersion: kueue.x-k8s.io/v1beta1
    kind: ClusterQueue
    metadata:
    name: cluster-queue # ClusterQueue 名称。
    spec:
    namespaceSelector: {}
    resourceGroups:
    - coveredResources: ["cpu", "memory"]
    flavors:
    - name: default-flavor # 引用上方定义的 ResourceFlavor。
    resources:
    - name: "cpu"
    nominalQuota: 4 # ClusterQueue 的 CPU 配额。本文设置为 4,用于验证配额不足场景。
    - name: "memory"
    nominalQuota: 8Gi
    ---
    apiVersion: kueue.x-k8s.io/v1beta1
    kind: LocalQueue
    metadata:
    name: user-queue # LocalQueue 名称。
    namespace: default # LocalQueue 所属命名空间,后续提交的 Job 所在命名空间需与该命名空间一致。
    spec:
    clusterQueue: cluster-queue # LocalQueue 关联到 ClusterQueue,作业需通过实例标签 kueue.x-k8s.io/queue-name 指定使用该 LocalQueue。
    EOF
  1. 提交两个 Job,验证整组准入。
  • 每个 Job 需要 3 核 CPU,即设置parallelism=3,而队列配额仅为 4 核,仅能容纳一个 Job。两个 Job 均需带标签kueue.x-k8s.io/queue-name=user-queue,并设置suspend=true,交由 Kueue 接管 Job:
  • cat <<'EOF' | kubectl apply -f -
    apiVersion: batch/v1
    kind: Job
    metadata:
    name: job-a # Job 名称。
    namespace: default # Job 所属命名空间,需与 LocalQueue 所属命名空间一致。
    labels:
    kueue.x-k8s.io/queue-name: user-queue # 指定作业使用的 LocalQueue,交由 Kueue 接管。
    spec:
    parallelism: 3 # 并行 Pod 数,本 Job 共需 3 核 CPU。
    completions: 3 # 需成功完成的 Pod 数。
    suspend: true # 必须为 true,作业先挂起,等待 Kueue 准入后再下发。
    template:
    spec:
    containers:
    - name: dummy
    image: doc-cn-beijing.cr.volces.com/vke/nginx-demo:v1.0 # 容器镜像地址和 Tag,请替换为您自己的容器镜像。若使用公网镜像,请确保您的集群能够访问公网
    resources:
    requests:
    cpu: "1" # 单 Pod 请求 1 核,3 个 Pod 合计请求 3 核。
    memory: "1Gi"
    restartPolicy: Never
    ---
    apiVersion: batch/v1
    kind: Job
    metadata:
    name: job-b # Job 名称。
    namespace: default # Job 所属命名空间,需与 LocalQueue 所属命名空间一致。
    labels:
    kueue.x-k8s.io/queue-name: user-queue # 与 job-a 使用同一队列,共享 4 核配额。
    spec:
    parallelism: 3 # 同样需 3 核;两个 Job 合计 6 核 > 4 核配额,只能容纳一个。
    completions: 3
    suspend: true # 必须为 true,等待 Kueue 准入。
    template:
    spec:
    containers:
    - name: dummy
    image: doc-cn-beijing.cr.volces.com/vke/nginx-demo:v1.0 # 容器镜像地址和 Tag,请替换为您自己的容器镜像。若使用公网镜像,请确保您的集群能够访问公网
    resources:
    requests:
    cpu: "1"
    memory: "1Gi"
    restartPolicy: Never
    EOF
验证结果
查看 Workload 与 Job 状态。
kubectl get workloads -n default
kubectl get jobs -n default
kubectl get pods -n default -o wide
预期输出结果如下:
  • 一个 Job 被准入(对应 Workload 的ADMITTEDTrue),解除suspend后 3 个 Pod 同时处于Running状态;
  • 另一个 Job 因配额不足,保持Suspended状态,对应 Workload 处于Pending状态,不下发任何 Pod。
上述结果证明,在队列配额不足以容纳全部作业时,Kueue 以整个 Job 为单位进行准入,不会出现半个 Job 抢占配额、另一半排队的资源浪费情况,从而实现作业级的 All-or-Nothing。
清理资源
验证完成后,执行以下命令清理本文创建的 Job、队列与 Kueue 组件。
## 删除 Job
kubectl delete job job-a job-b -n default --ignore-not-found
## 删除队列与配额
kubectl delete localqueue user-queue -n default --ignore-not-found
kubectl delete clusterqueue cluster-queue --ignore-not-found
kubectl delete resourceflavor default-flavor --ignore-not-found
## 卸载 Kueue
helm uninstall kueue -n kueue-system
kubectl delete ns kueue-system --ignore-not-found
最近更新时间:2026.06.29 11:13:29
这个页面对您有帮助吗?
有用
有用
无用
无用