全部產品
Search
文件中心

Container Service for Kubernetes:基於vllm自訂指標的多叢集HPA實踐

更新時間:Dec 30, 2025

大語言模型(LLM)線上服務因流量波動而普遍採用的多叢集架構部署,ACK One提供的多叢集解決方案可以適配這種情境。本文將示範如何基於ACK One艦隊,在雲上環境中部署vLLM推理服務,並利用多叢集HPA(FederatedHPA)進行跨叢集的Auto Scaling。

工作原理

在大規模推理情境中,大語言模型(LLM)線上服務面臨流量波動劇烈且難以預測的挑戰。多叢集架構是應對流量高峰時普遍採用的方案:

  • 自建資料中心使用者:通常採用混合雲架構,在業務高峰期通過雲端叢集進行彈性擴容。

  • 雲上使用者:傾向於在不同地區部署多個叢集,以此規避單地區資源供給不足的風險。

ACK One艦隊支援同時管理多個叢集的資源,並執行跨叢集的調度、Auto Scaling等能力,適配以上兩種部署模式的需求:

  • 多叢集優先順序調度:支援配置叢集的調度優先順序,可以將副本優先調度到高優叢集,在資源不足時擴容副本至低優叢集,縮容時優先縮容低優叢集的副本。

  • 基於庫存的智能調度:艦隊叢集會與子叢集的GoatScaler聯動結合ECS庫存進行副本的智能調度。

  • 統一中心彈性擴縮容:通過建立FederatedHPA進行多叢集的統一中心彈性擴縮容,艦隊叢集的Metrics Adapter會採集子叢集的指標並進行彙總(子叢集也支援Prometheus-adapter),根據彙總指標對工作負載進行擴縮容。

image.jpeg

適用範圍

重要

多叢集HPA功能處於邀測階段,請聯絡我們提交申請開通白名單後使用。

操作步驟

步驟一:在子叢集中配置指標採集

在兩個ACK叢集中配置ack-alibaba-cloud-metrics-adapter的組件參數。

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集列表

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇應用 > Helm

  3. 找到ack-alibaba-cloud-metrics-adapter組件,在操作列單擊更新。在prometheus.adapter.rules,可以修改指標採集配置,例如:

    • vllm:num_requests_waiting:等待被處理的請求數。

    • vllm:num_requests_running:正在處理的請求數。

    rules:
      - seriesQuery: 'vllm:num_requests_waiting'
        resources:
          overrides:
            kubernetes_namespace: {resource: "namespace"}
            kubernetes_pod_name: {resource: "pod"}
        name:
          matches: 'vllm:num_requests_waiting'
          as: 'num_requests_waiting'
        metricsQuery: 'sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)'
      - seriesQuery: 'vllm:num_requests_running'
        resources:
          overrides:
            kubernetes_namespace: {resource: "namespace"}
            kubernetes_pod_name: {resource: "pod"}
        name:
          matches: 'vllm:num_requests_running'
          as: 'num_requests_running'
        metricsQuery: 'sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)'
  4. 修改完成後,單擊確定

  5. 檢查自訂指標是否配置成功。

    # 查看自訂指標
    kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/test/pods/qwen3-xxxxx/num_requests_waiting"
    kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/test/pods/qwen3-xxxxx/num_requests_running"

    預期輸出vLLM指標,表示指標採集配置成功。

步驟二:在艦隊中建立vLLM推理服務

將下方YAML樣本模板儲存到deployment.yaml,然後執行kubectl apply -f deployment.yaml在艦隊中部署推理服務。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: qwen3
  namespace: test
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: qwen3
  template:
    metadata:
      annotations:
        # 用來捕獲pod的metrics,效果如同PodMonitor
        prometheus.io/path: /metrics
        prometheus.io/port: "8000"
        prometheus.io/scrape: "true"
      labels:
        app: qwen3
    spec:
      containers:
      # 使用qwen3-0.6b模型,模型從modelscope下載
      - command:
        - sh
        - -c
        - export VLLM_USE_MODELSCOPE=True; vllm serve Qwen/Qwen3-0.6B --served-model-name
          qwen3-0.6b --port 8000 --trust-remote-code --tensor_parallel_size=1 --max-model-len
          2048 --gpu-memory-utilization 0.8
        image: kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/vllm-openai:v0.9.1
        imagePullPolicy: IfNotPresent
        name: vllm
        ports:
        - containerPort: 8000
          name: restful
          protocol: TCP
        readinessProbe:
          failureThreshold: 3
          initialDelaySeconds: 30
          periodSeconds: 10
          successThreshold: 1
          tcpSocket:
            port: 8000
          timeoutSeconds: 1
        resources:
          limits:
            nvidia.com/gpu: "1"
          requests:
            nvidia.com/gpu: "1"
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30

步驟三:在艦隊中配置多叢集分發策略

將下方樣本模板儲存到propagationpolicy.yaml,然後執行kubectl apply -f propagationpolicy.yaml

  • autoScaling.ecsProvision:開啟基於庫存的智能調度,會根據需要自動擴縮ECS執行個體。

  • clusterAffinities:優先順序分組,在調度時按優先順序依次填充affinity。

apiVersion: policy.one.alibabacloud.com/v1alpha1
kind: PropagationPolicy
metadata:
  name: vllm-deploy-pp
  namespace: test
spec:
  autoScaling:
    ecsProvision: true
  placement:
    clusterAffinities:
    - affinityName: high-priority
      clusterNames:
      - ${cluster1_id}
    - affinityName: low-priority
      clusterNames:
      - ${cluster2_id}
    replicaScheduling:
      replicaSchedulingType: Divided
      replicaDivisionPreference: Weighted
      weightPreference:
        dynamicWeight: AvailableReplicas
  preserveResourcesOnDeletion: false
  resourceSelectors:
  - apiVersion: apps/v1
    kind: Deployment
    namespace: test
  - apiVersion: v1
    kind: Service
    namespace: test
  schedulerName: default-scheduler

步驟四:在艦隊中建立FederatedHPA

FederatedHPA可以監控Pod的CPU、Memory、自訂指標和外部指標,下方樣本使用num_requests_waitingnum_requests_running這兩個自訂指標進行Auto Scaling。

將下方樣本模板儲存到federatedhpa.yaml,然後執行kubectl apply -f federatedhpa.yaml

apiVersion: autoscaling.one.alibabacloud.com/v1alpha1
kind: FederatedHPA
metadata:
  name: vllm-fhpa
  namespace: test
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: qwen3
  minReplicas: 1
  maxReplicas: 10
  behavior:
    scaleDown:
      stabilizationWindowSeconds: 30
    scaleUp:
      stabilizationWindowSeconds: 10
  metrics:
    - type: Pods
      pods:
        metric:
          name: num_requests_waiting
        target:
          type: AverageValue
          averageValue: ${waiting_size} # 根據顯卡、模型最佳值有所不同
    - type: Pods
      pods:
        metric:
          name: num_requests_running
        target:
          type: AverageValue
          averageValue: ${running_size} # 根據顯卡、模型最佳值有所不同

效果驗證

  1. 驗證優先順序調度

    執行kubectl scale deployment -ntest qwen3 --replicas=2擴容工作負載。由於cluster1隻有一個GPU執行個體,預計第二個副本被調度到low-priority組的cluster2叢集。

  2. 驗證FederatedHPA

    1. 參見管理南北流量使用多叢集ALB進行服務暴露,然後擷取Ingress地址。

    2. 替換下方命令中的ALB地址,然後執行命令,對服務進行壓力測試。

      hey -n 600 -c 60 -m POST -H "Content-Type: application/json" -d '{"messages": [{"role": "user", "content": "測試一下"}]}' http://alb-xxxxxx.cn-hangzhou.alb.aliyuncsslb.com:8000/v1/chat/completions

      預期觀察到num_requests_running大幅上升,副本數進行擴容:

        Current Metrics:
          Pods:
            Current:
              Average Value:  0
            Metric:
              Name:  num_requests_waiting
          Type:      Pods
          Pods:
            Current:
              Average Value:  58
            Metric:
              Name:        num_requests_running
          Type:            Pods
        Current Replicas:  2
        Desired Replicas:  3
  3. 驗證基於庫存感知的智能調度

    當推理應用擴容至三個副本後,由於當前cluster1和cluster2一共只有兩個GPU執行個體,但新擴容的副本依然可以成功調度並拉起,說明艦隊基於庫存的智能調度成功生效。

常見問題

kubectl get fhpa後的REPLICAS一列為什麼為空白?

因為fhpa沒有和對應的workload進行匹配,請檢查工作負載名稱、命名空間的配置。

kubectl get fhpa -o yaml後為什麼報錯?

condition報錯the HPA was unable to compute the replica count: unable to get metric xxx。原因是FHPA無法成功擷取到子叢集對應workload的指標。

  1. 確認子叢集都已安裝ack-alibaba-cloud-metrics-adapter組件。

  2. 確認子叢集ack-alibaba-cloud-metrics-adapter組件的參數配置正確,可以通過在子叢集的看板查詢指標,觀察是否可以成功查詢。

子叢集查詢指標為什麼不可見?

執行如下命令觀察指標是否成功註冊,如果沒有相關指標請檢查Helm應用的組件參數配置是否正確。

kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1" | jq .