大語言模型(LLM)線上服務因流量波動而普遍採用的多叢集架構部署,ACK One提供的多叢集解決方案可以適配這種情境。本文將示範如何基於ACK One艦隊,在雲上環境中部署vLLM推理服務,並利用多叢集HPA(FederatedHPA)進行跨叢集的Auto Scaling。
工作原理
在大規模推理情境中,大語言模型(LLM)線上服務面臨流量波動劇烈且難以預測的挑戰。多叢集架構是應對流量高峰時普遍採用的方案:
自建資料中心使用者:通常採用混合雲架構,在業務高峰期通過雲端叢集進行彈性擴容。
雲上使用者:傾向於在不同地區部署多個叢集,以此規避單地區資源供給不足的風險。
ACK One艦隊支援同時管理多個叢集的資源,並執行跨叢集的調度、Auto Scaling等能力,適配以上兩種部署模式的需求:
多叢集優先順序調度:支援配置叢集的調度優先順序,可以將副本優先調度到高優叢集,在資源不足時擴容副本至低優叢集,縮容時優先縮容低優叢集的副本。
基於庫存的智能調度:艦隊叢集會與子叢集的GoatScaler聯動結合ECS庫存進行副本的智能調度。
統一中心彈性擴縮容:通過建立FederatedHPA進行多叢集的統一中心彈性擴縮容,艦隊叢集的Metrics Adapter會採集子叢集的指標並進行彙總(子叢集也支援Prometheus-adapter),根據彙總指標對工作負載進行擴縮容。

適用範圍
已建立兩個ACK叢集,每個叢集都有GPU節點池,且初始化一個GPU執行個體。
兩個ACK叢集已關聯到ACK One艦隊,且已接入alibaba-cloud-metrics-adapter組件,註冊叢集需要安裝開源版prometheus-adapter。
多叢集HPA功能處於邀測階段,請聯絡我們提交申請開通白名單後使用。
操作步驟
步驟一:在子叢集中配置指標採集
在兩個ACK叢集中配置ack-alibaba-cloud-metrics-adapter的組件參數。
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
找到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>>)'修改完成後,單擊
確定。檢查自訂指標是否配置成功。
# 查看自訂指標 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_waiting和num_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} # 根據顯卡、模型最佳值有所不同效果驗證
驗證優先順序調度
執行
kubectl scale deployment -ntest qwen3 --replicas=2擴容工作負載。由於cluster1隻有一個GPU執行個體,預計第二個副本被調度到low-priority組的cluster2叢集。驗證FederatedHPA
參見管理南北流量使用多叢集ALB進行服務暴露,然後擷取Ingress地址。
替換下方命令中的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
驗證基於庫存感知的智能調度
當推理應用擴容至三個副本後,由於當前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的指標。
確認子叢集都已安裝ack-alibaba-cloud-metrics-adapter組件。
確認子叢集ack-alibaba-cloud-metrics-adapter組件的參數配置正確,可以通過在子叢集的看板查詢指標,觀察是否可以成功查詢。
子叢集查詢指標為什麼不可見?
執行如下命令觀察指標是否成功註冊,如果沒有相關指標請檢查Helm應用的組件參數配置是否正確。
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1" | jq .