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​
    ​
  • 预期输出如下,STATUS为deployed:​
  • ​
    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​
    ​
  • 预期输出如下,READY为 1/1且STATUS为Running:​
  • ​
    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​
    ​
  • 预期输出如下,可见clusterqueues、localqueues、workloads、resourceflavors等 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 的ADMITTED为True),解除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
这个页面对您有帮助吗?
有用
有用
无用
无用