全部產品
Search
文件中心

Container Service for Kubernetes:基於庫存感知的跨地區多叢集彈性調度

更新時間:Nov 22, 2025

ACK One多叢集艦隊在多地區應用服務部署情境下,針對多地區資源撫平的難題設計並實現了基於庫存感知的智能調度器。本文介紹庫存感知的工作原理以及如何開啟和使用庫存感知調度能力。

能力介紹

在GPU推理服務情境中,使用者普遍面臨兩大挑戰:

  • 各地區GPU供給在動態變化,難以保證即時可用。

  • GPU價格昂貴,預先建立會導致高昂的成本。

庫存感知調度機制配合即時彈性可以很好地解決這兩大難題,當艦隊管理的多個叢集現有資源不足時,會將應用服務調度到有庫存的叢集中,該叢集的即時彈性會進行擴容所需節點來承接相關的應用服務。通過這個能力,最大化保證了需要GPU等稀缺資源的應用的成功調度,同時顯著降低了GPU使用成本。

重要

此能力目前處於邀測階段。如需體驗,請提交工單申請。

工作原理

當某個叢集資源不足時,在艦隊中建立應用觸發的整體工作流程如下:

  1. 建立應用和分發策略。

  2. 調度器感知子叢集資源不足,無法進行調度。

  3. 調度器觸發子叢集ACK GOATScaler對於庫存的檢查,然後擷取檢查結果。

  4. 根據庫存結果,調度器進行重新調度,然後進行應用分發。

  5. 應用分發到子叢集之後,叢集開始擴容節點,應用正常運行。

前提條件

重要

若子叢集已經開啟了節點自動調整,請根據開啟節點即時彈性功能切換為節點即時彈性

GPU執行個體規格和成本預估

在推理階段主要佔用顯存的是模型參數,可以通過以下公式計算。

以一個預設精度為FP16的7B模型為例,模型參數量為:7B(即70億),精度資料類型位元組數為:預設精度16位浮點數 / 8位每位元組 = 2位元組。

除了載入模型佔用的顯存之外,還需要考慮運算時所需的KV Cache大小和GPU使用率,通常會預留一部分buffer,因此推薦使用24GiB顯存的GPU執行個體ecs.gn7i-c8g1.2xlargeecs.gn7i-c16g1.4xlarge。關於GPU執行個體規格和計費的詳情,請參見GPU計算型執行個體規格類型系列GPU雲端服務器計費

準備工作

本步驟將準備qwen3-8b推理服務的模型檔案並分別在子叢集中建立對應的OSS儲存卷。

  1. 下載模型。

    說明

    請確認是否已安裝git-lfs外掛程式,如未安裝可執行yum install git-lfs或者apt-get install git-lfs安裝。更多的安裝方式,請參見安裝git-lfs

    git lfs install
    GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/Qwen/Qwen3-8B
    cd Qwen3-8B
    git lfs pull
  2. 在OSS中建立目錄,將模型上傳至OSS。

    說明

    關於ossutil工具的安裝和使用方法,請參見安裝ossutil

    ossutil mkdir oss://<your-bucket-name>/models/Qwen3-8B
    ossutil cp -r ./Qwen3-8B oss://<your-bucket-name>/models/Qwen3-8B
  3. 分別在子叢集中建立PV和PVC。具體操作,請參見使用ossfs 1.0靜態儲存卷

    展開查看YAML內容

    apiVersion: v1
    kind: Secret
    metadata:
      name: oss-secret
    stringData:
      akId: <your-oss-ak> # 配置用於訪問OSS的AccessKey ID
      akSecret: <your-oss-sk> # 配置用於訪問OSS的AccessKey Secret
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: qwen3-8b
      namespace: default
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 20Gi
      selector:
        matchLabels:
          alicloud-pvname: qwen3-8b
      storageClassName: oss
      volumeMode: Filesystem
      volumeName: qwen3-8b
    ---
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      labels:
        alicloud-pvname: qwen3-8b
      name: qwen3-8b
    spec:
      accessModes:
        - ReadWriteMany
      capacity:
        storage: 20Gi
      csi:
        driver: ossplugin.csi.alibabacloud.com
        nodePublishSecretRef:
          name: oss-secret
          namespace: default
        volumeAttributes:
          bucket: <your-bucket-name> # bucket名稱
          otherOpts: '-o allow_other -o umask=000'
          path: <your-model-path> # 本樣本中為/models/Qwen3-8B/
          url: <your-bucket-endpoint> # Endpoint資訊,如oss-cn-hangzhou-internal.aliyuncs.com
        volumeHandle: qwen3-8b
      persistentVolumeReclaimPolicy: Retain
      storageClassName: oss
      volumeMode: Filesystem

步驟一:為子叢集配置節點池

建立或編輯節點池,設定執行個體規格為ecs.gn7i-c8g1.2xlarge擴縮容模式選擇自動,節點池期望節點數為0。具體操作和配置參數,請參見建立和管理節點池

調整節點伸縮配置時,可以通過調整縮容觸發時延來縮短後續步驟的等待時間。

步驟二:在艦隊叢集建立應用和分發策略

  1. 建立deploy.yaml。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: qwen3-8b
      name: qwen3-8b
      namespace: default
    spec:
      replicas: 4
      selector:
        matchLabels:
          app: qwen3-8b
      template:
        metadata:
          labels:
            app: qwen3-8b
        spec:
          volumes:
            - name: qwen3-8b
              persistentVolumeClaim:
                claimName: qwen3-8b
            - name: dshm
              emptyDir:
                medium: Memory
                sizeLimit: 20Gi
          containers:
          - command:
            - sh
            - -c
            - vllm serve /models/qwen3-8b --port 8000 --trust-remote-code --served-model-name qwen3-8b --tensor-parallel=1 --max-model-len 8192 --gpu-memory-utilization 0.95 --enforce-eager
            image: kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/vllm-openai:v0.9.1
            name: vllm
            ports:
            - containerPort: 8000
            readinessProbe:
              tcpSocket:
                port: 8000
              initialDelaySeconds: 30
              periodSeconds: 30
            resources:
              limits:
                nvidia.com/gpu: "1"
            volumeMounts:
              - mountPath: /models/qwen3-8b
                name: qwen3-8b
              - mountPath: /dev/shm
                name: dshm
  2. 建立PropagationPolicy.yaml。

    apiVersion: policy.one.alibabacloud.com/v1alpha1
    kind: PropagationPolicy
    metadata:
      name: demo-policy
    spec:
      # 此欄位表示開啟庫存感知的彈性調度
      autoScaling:
        ecsProvision: true
      preserveResourcesOnDeletion: false
      conflictResolution: Overwrite
      resourceSelectors:
      - apiVersion: apps/v1
        kind: Deployment
        name: qwen3-8b
        namespace: default
      placement:
        replicaScheduling:
          replicaSchedulingType: Divided
          weightPreference:
            dynamicWeight: AvailableReplicas
        clusterAffinity:
          clusterNames:
          - ${cluster1-id} # 請替換為實際的子叢集ID
          - ${cluster2-id} # 請替換為實際的子叢集ID
  3. 使用艦隊的kubeconfig部署應用和分發策略。

    kubectl apply -f deploy.yaml
    kubectl apply -f PropagationPolicy.yaml

    一段時間後,可以觀察到cluster1和cluster2的GPU節點池開始自行擴容。

步驟三:驗證彈性擴縮容

  1. 查看工作負載調度情況。

    kubectl get resourcebinding

    預期輸出:

    NAME                  SCHEDULED   FULLYAPPLIED   OVERRIDDEN   ALLAVAILABLE   AGE
    qwen3-8b-deployment   True        True           True         False          7m47s

    可以看到,SCHEDULED為TRUE,說明工作負載已成功調度。

  2. 等待Pod狀態處於Running後,查看Pod分布情況。

    kubectl amc get deploy qwen3-8b -M

    預期輸出:

    NAME       CLUSTER           READY   UP-TO-DATE   AVAILABLE   AGE     ADOPTION
    qwen3-8b   cxxxxxxxxxxxxxx   2/2     2            2           3m22s   Y
    qwen3-8b   cxxxxxxxxxxxxxx   2/2     2            2           3m22s   Y

    可以看到,子叢集在沒有可用的GPU節點的情況下,工作負載的所有副本都成功調度並且正常運行。

  3. 修改qwen3-8b的副本數為2,更新工作負載。

    也可以選擇直接刪除工作負載,類比副本數縮容到0的情況。
    kubectl apply -f deploy.yaml
  4. 等待十分鐘,可以看到子叢集的GPU節點池縮容到一個節點。

    若選擇刪除工作負載,則節點數量會縮容到0。

從完整流程可以看到,艦隊的庫存感知調度能力確保在子叢集現有資源不足時通過感知庫存成功調度分發應用,隨後進行節點擴容來承載應用,在應用縮容、刪除後,自動縮容空閑節點,釋放資源以降低成本。