Layanan online untuk large language models (LLMs) sering menggunakan arsitektur multi-kluster untuk menangani fluktuasi lalu lintas. Solusi multi-kluster yang disediakan oleh ACK One sangat ideal untuk skenario ini. Topik ini menjelaskan cara menggunakan armada ACK One untuk menerapkan layanan inferensi vLLM di lingkungan cloud dan memanfaatkan Horizontal Pod Autoscaler (HPA) multi-kluster, atau FederatedHPA, guna mencapai skalabilitas elastis lintas kluster.
Cara kerja
Dalam skenario inferensi berskala besar, layanan online untuk LLM menghadapi tantangan fluktuasi lalu lintas yang intens dan tidak dapat diprediksi. Arsitektur multi-kluster merupakan solusi umum untuk menangani puncak lalu lintas:
Pengguna dengan pusat data yang dikelola sendiri biasanya menerapkan arsitektur Cloud Hibrida dan melakukan skalabilitas elastis keluar ke kluster berbasis cloud selama jam sibuk bisnis.
Pengguna cloud-native cenderung menerapkan beberapa kluster di wilayah berbeda untuk menghindari risiko kekurangan resource di satu wilayah.
Armada ACK One dapat mengelola resource di beberapa kluster, melakukan penjadwalan lintas kluster, serta mendukung skalabilitas elastis—memenuhi kebutuhan kedua mode penyebaran tersebut:
Penjadwalan prioritas multi-kluster: Anda dapat mengonfigurasi prioritas penjadwalan untuk kluster. Replika dijadwalkan terlebih dahulu ke kluster berprioritas tinggi. Jika resource tidak mencukupi, replika diskalakan keluar ke kluster berprioritas rendah. Saat melakukan scaling in, replika di kluster berprioritas rendah dihapus terlebih dahulu.
Penjadwalan cerdas berbasis inventaris: Kluster armada bekerja sama dengan komponen GoatScaler dari kluster anggota. Komponen ini menggunakan informasi ECS Inventory untuk menjadwalkan replika secara cerdas.
Skalabilitas elastis terpusat: Anda dapat membuat FederatedHPA untuk melakukan skalabilitas elastis terpusat pada beberapa kluster. Metrics Adapter dari kluster armada mengumpulkan dan mengagregasi metrik dari kluster anggota. Kluster anggota juga mendukung prometheus-adapter. Beban kerja kemudian diskalakan berdasarkan metrik yang telah diagregasi.

Lingkup
Anda telah membuat dua kluster ACK. Setiap kluster harus memiliki node pool GPU dan satu instans GPU-accelerated yang telah diinisialisasi.
Kedua kluster ACK dikaitkan dengan armada ACK One, dan komponen alibaba-cloud-metrics-adapter diaktifkan. Untuk kluster terdaftar, Anda juga harus menginstal prometheus-adapter open source.
Fitur HPA multi-kluster sedang dalam pratinjau undangan. Untuk menggunakan fitur ini, kirim permintaan agar ditambahkan ke daftar putih.
Prosedur
Langkah 1: Konfigurasikan pengumpulan metrik di kluster anggota
Konfigurasikan parameter komponen ack-alibaba-cloud-metrics-adapter di kedua kluster ACK.
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Pada halaman Clusters, temukan kluster yang diinginkan lalu klik namanya. Di panel navigasi sebelah kiri, pilih .
Temukan komponen ack-alibaba-cloud-metrics-adapter dan klik Update di kolom Actions. Pada bagian
prometheus.adapter.rules, Anda dapat memodifikasi konfigurasi pengumpulan metrik. Contohnya:vllm:num_requests_waiting: Jumlah permintaan yang menunggu untuk diproses.vllm:num_requests_running: Jumlah permintaan yang sedang diproses.
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>>)'Setelah mengubah konfigurasi, klik
OK.Periksa apakah metrik kustom telah dikonfigurasi.
# Lihat metrik kustom 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"Output yang diharapkan mencakup metrik vLLM. Hal ini menunjukkan bahwa pengumpulan metrik telah dikonfigurasi dengan benar.
Langkah 2: Buat layanan inferensi vLLM di armada
Simpan templat YAML berikut sebagai deployment.yaml. Kemudian, jalankan perintah kubectl apply -f deployment.yaml untuk menerapkan layanan inferensi di armada.
apiVersion: apps/v1
kind: Deployment
metadata:
name: qwen3
namespace: test
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: qwen3
template:
metadata:
annotations:
# Digunakan untuk menangkap metrik pod, mirip dengan PodMonitor.
prometheus.io/path: /metrics
prometheus.io/port: "8000"
prometheus.io/scrape: "true"
labels:
app: qwen3
spec:
containers:
# Gunakan model qwen3-0.6b, diunduh dari 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: 30Langkah 3: Konfigurasikan kebijakan propagasi multi-kluster di armada
Simpan templat berikut sebagai propagationpolicy.yaml. Kemudian, jalankan perintah kubectl apply -f propagationpolicy.yaml.
autoScaling.ecsProvision: Mengaktifkan penjadwalan cerdas berbasis inventaris. Instans ECS secara otomatis diskalakan keluar atau masuk sesuai kebutuhan.clusterAffinities: Menentukan kelompok prioritas. Selama penjadwalan, afinitas diisi sesuai urutan prioritas.
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-schedulerLangkah 4: Buat FederatedHPA di armada
FederatedHPA dapat memantau CPU, memori, metrik kustom, dan metrik eksternal dari pod. Contoh berikut menggunakan metrik kustom num_requests_waiting dan num_requests_running untuk skalabilitas elastis.
Simpan templat berikut sebagai federatedhpa.yaml. Kemudian, jalankan perintah 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} # Bervariasi berdasarkan nilai optimal untuk GPU dan model.
- type: Pods
pods:
metric:
name: num_requests_running
target:
type: AverageValue
averageValue: ${running_size} # Bervariasi berdasarkan nilai optimal untuk GPU dan model.Verifikasi hasil
Verifikasi penjadwalan prioritas
Jalankan perintah
kubectl scale deployment -ntest qwen3 --replicas=2untuk melakukan scaling out workload. Karena cluster1 hanya memiliki satu instans GPU-accelerated, replika kedua dijadwalkan ke cluster2 dalam kelompok berprioritas rendah.Verifikasi FederatedHPA
Ekspos layanan menggunakan Application Load Balancer (ALB) multi-kluster, lalu peroleh alamat Ingress. Untuk informasi selengkapnya, lihat Kelola lalu lintas utara-selatan.
Ganti alamat ALB dalam perintah berikut. Kemudian, jalankan perintah tersebut untuk melakukan uji stres pada layanan.
hey -n 600 -c 60 -m POST -H "Content-Type: application/json" -d '{"messages": [{"role": "user", "content": "Run a test"}]}' http://alb-xxxxxx.cn-hangzhou.alb.aliyuncsslb.com:8000/v1/chat/completionsAnda dapat mengharapkan peningkatan signifikan pada
num_requests_runningdan jumlah replika: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
Verifikasi penjadwalan cerdas berbasis inventaris
Setelah aplikasi inferensi diskalakan menjadi tiga replika, replika baru berhasil dijadwalkan dan dimulai meskipun cluster1 dan cluster2 hanya memiliki total dua instans GPU-accelerated. Hal ini menunjukkan bahwa penjadwalan cerdas berbasis inventaris armada berfungsi dengan benar.
FAQ
Mengapa kolom REPLICAS kosong setelah saya menjalankan kubectl get fhpa?
Hal ini terjadi karena FederatedHPA tidak cocok dengan workload yang benar. Periksa konfigurasi nama dan namespace workload.
Mengapa muncul error setelah saya menjalankan kubectl get fhpa -o yaml?
Kondisi tersebut melaporkan error the HPA was unable to compute the replica count: unable to get metric xxx. Hal ini terjadi karena FederatedHPA gagal mengambil metrik untuk workload yang sesuai dari kluster anggota.
Konfirmasi bahwa komponen ack-alibaba-cloud-metrics-adapter telah diinstal di semua kluster anggota.
Konfirmasi bahwa parameter komponen ack-alibaba-cloud-metrics-adapter di kluster anggota telah dikonfigurasi dengan benar. Anda dapat mengkueri metrik di dasbor kluster anggota untuk memeriksa apakah kueri berhasil.
Mengapa metrik tidak terlihat saat saya mengkuerinya di kluster anggota?
Jalankan perintah berikut untuk memeriksa apakah metrik telah terdaftar. Jika metrik yang relevan tidak ditemukan, periksa apakah parameter komponen untuk aplikasi Helm telah dikonfigurasi dengan benar.
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1" | jq .