Gang scheduling

Gang scheduling 是 Alauda Build of Kueue 中基于超时的 All-or-nothing 调度实现。

Gang scheduling 确保一组相关作业(即一个 gang)仅在所有所需资源均可用时才开始运行。Alauda Build of Kueue 通过挂起作业,直到 Alauda Container Platform 集群能够保证同时启动并执行该 gang 中所有相关作业的容量,从而实现 gang scheduling。

当您使用昂贵且有限的资源(如 GPU)时,Gang scheduling 非常重要。Gang scheduling 可以防止作业占用但不使用 GPU,从而提高 GPU 利用率并降低运行成本。Gang scheduling 还可以帮助防止资源分割和死锁等问题。

配置 gang scheduling

Gang scheduling 默认启用。作为集群管理员,您可以通过修改 Alauda Build of Kueue 集群插件的部署表单参数来启用/禁用 gang scheduling 或更新 timeout

timeoutwaitForPodsReady.timeout)是一个可选参数,默认值为 5 分钟。

当某个已准入的 Workload 的 timeout 到期且其所有 Pod 尚未全部调度(即 Workload 状态仍为 PodsReady=False)时,该 Workload 的准入将被取消,相应的作业被挂起,Workload 会被重新排队。

验证

前提条件

  • Alauda Container Platform Web CLI 能与您的集群通信。
  • 您已安装 Alauda Build of Hami。
  • 假设您的集群中仅有一块 GPU 卡用于 Hami 虚拟化。

操作步骤

  1. 验证 Gang scheduling 策略配置是否生效。

    kubectl -n cpaas-system get cm kueue-manager-config -o=yaml  | grep -C 8 waitForPodsReady

    您应看到类似如下结果:

        waitForPodsReady:
          blockAdmission: true
          recoveryTimeout: 3m
          requeuingStrategy:
            backoffBaseSeconds: 60
            backoffLimitCount: null
            backoffMaxSeconds: 3600
            timestamp: Eviction
          timeout: 5m
  2. 运行以下命令创建资源:

    cat <<EOF | kubectl create -f -
    ---
    apiVersion: kueue.x-k8s.io/v1beta1
    kind: ClusterQueue
    metadata:
      name: cluster-queue
    spec:
      namespaceSelector: {}
       #matchLabels:
       #  kubernetes.io/metadata.name: team-a
      resourceGroups:
      - coveredResources: ["cpu", "memory", "pods", "nvidia.com/gpualloc", "nvidia.com/total-gpucores", "nvidia.com/total-gpumem"]
        flavors:
        - name: "default-flavor"
          resources:
          - name: "cpu"
            nominalQuota: 9
          - name: "memory"
            nominalQuota: 36Gi
          - name: "pods"
            nominalQuota: 5
          - name: "nvidia.com/gpualloc"
            nominalQuota: "10"
          - name: "nvidia.com/total-gpucores"
            nominalQuota: "1000"
          - name: "nvidia.com/total-gpumem"
            nominalQuota: "20000"
    ---
    apiVersion: kueue.x-k8s.io/v1beta1
    kind: ResourceFlavor
    metadata:
      name: default-flavor
    ---
    apiVersion: kueue.x-k8s.io/v1beta1
    kind: LocalQueue
    metadata:
      name: test
    spec:
      clusterQueue: cluster-queue
    ---
    EOF
  3. 创建包含作业清单的文件:

    cat > job.yaml << EOF
    apiVersion: batch/v1
    kind: Job
    metadata:
      generateName: gang-demo-
      labels:
        kueue.x-k8s.io/queue-name: test
    spec:
      parallelism: 3
      completions: 3
      template:
        spec:
          containers:
          - name: dummy-job
            image: registry.k8s.io/e2e-test-images/agnhost:2.53
            command: [ "/bin/sh" ]
            args: [ "-c", "sleep infinity" ]
            resources:
              limits:
                cpu: "20m"
                memory: "200Mi"
                nvidia.com/gpualloc: 1
                nvidia.com/gpucores: 80
                nvidia.com/gpumem: 4096
              requests:
                cpu: "20m"
                memory: "200Mi"
          restartPolicy: Never
    EOF
    kubectl create -f job.yaml
  4. 由于只有一块 GPU 卡,您会看到一个 Pod 正在运行,另外两个 Pod 处于 Pending 状态。

    NAME                    READY   STATUS              RESTARTS   AGE
    gang-demo-vgzmf-fgkj8   0/1     Pending             0          13s
    gang-demo-vgzmf-hgtdn   1/1     Running             0          13s
    gang-demo-vgzmf-k6p4d   0/1     Pending             0          13s

    等待 5 分钟后,所有 Pod 最终被驱逐。