全部产品
Search
文档中心

Container Service for Kubernetes:Konfigurasikan penskalaan otomatis untuk layanan inferensi LLM mandiri atau terdistribusi

更新时间:Sep 19, 2025

Dalam mengelola layanan inferensi model bahasa besar (LLM), penting untuk menangani fluktuasi beban kerja yang dinamis. Topik ini menjelaskan cara mengintegrasikan metrik khusus dari framework inferensi Anda dengan Penyekala Pod Horizontal Kubernetes (HPA) untuk secara otomatis dan fleksibel menskalakan pod layanan inferensi Anda. Ini memastikan ketersediaan tinggi dan stabilitas untuk layanan LLM Anda.

Prasyarat

Penagihan

Integrasi dengan Managed Service for Prometheus akan menyebabkan layanan Anda mengeluarkan metrik khusus, yang dapat menimbulkan biaya tambahan. Biaya ini bervariasi berdasarkan faktor-faktor seperti ukuran kluster, jumlah aplikasi, dan volume data. Anda dapat memantau dan mengelola sumber daya Anda dengan meminta data penggunaan.

Langkah 1: Konfigurasikan pengumpulan metrik

Berbeda dengan layanan mikro tradisional, layanan inferensi LLM umumnya dibatasi oleh daya komputasi GPU dan memori, bukan CPU atau memori sistem. Metrik standar seperti Penggunaan GPU dan Penggunaan Memori dapat menyesatkan dalam menentukan beban sebenarnya pada layanan inferensi. Oleh karena itu, pendekatan yang lebih efektif adalah melakukan penskalaan berdasarkan metrik performa yang diekspos langsung oleh mesin inferensi, seperti latensi permintaan atau kedalaman antrian.

Jika Anda telah mengonfigurasi pemantauan untuk layanan inferensi LLM, Anda dapat melewati langkah ini.
  1. Buat file bernama podmonitor.yaml untuk menginstruksikan Prometheus mengambil metrik dari pod inferensi Anda.

    Templat YAML

    apiVersion: monitoring.coreos.com/v1
    kind: PodMonitor
    metadata:
      name: llm-serving-podmonitor
      namespace: default
      annotations:
        arms.prometheus.io/discovery: "true"
        arms.prometheus.io/resource: "arms"
    spec:
      selector:
        matchExpressions:
        - key: alibabacloud.com/inference-workload
          operator: Exists
      namespaceSelector:
        any: true
      podMetricsEndpoints:
      - interval: 15s
        path: /metrics
        port: "http"
        relabelings:
        - action: replace
          sourceLabels:
          - __meta_kubernetes_pod_name
          targetLabel: pod_name
        - action: replace
          sourceLabels:
          - __meta_kubernetes_namespace
          targetLabel: pod_namespace
        - action: replace
          sourceLabels:
          - __meta_kubernetes_pod_label_rolebasedgroup_workloads_x_k8s_io_role
          regex: (.+)
          targetLabel: rbg_role
        # Allow to override workload-name with specific label
        - action: replace
          sourceLabels:
          - __meta_kubernetes_pod_label_alibabacloud_com_inference_workload
          regex: (.+)
          targetLabel: workload_name
        - action: replace
          sourceLabels:
          - __meta_kubernetes_pod_label_alibabacloud_com_inference_backend
          regex: (.+)
          targetLabel: backend
    
  2. Terapkan konfigurasi.

    kubectl apply -f ./podmonitor.yaml

Langkah 2: Konfigurasikan ack-alibaba-cloud-metrics-adapter

  1. Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.

  2. Di halaman Clusters, klik nama kluster target. Di panel navigasi kiri, klik Applications > Helm.

  3. Di halaman Helm, temukan ack-alibaba-cloud-metrics-adapter dan klik Update di kolom Actions.

  4. Di panel Update Release, perbarui konfigurasi YAML seperti yang ditunjukkan dalam contoh berikut dan klik OK. Metrik dalam YAML hanya untuk tujuan demonstrasi. Ubah sesuai kebutuhan.

    Lihat dokumentasi resmi untuk daftar lengkap metrik untuk vLLM, SGLang, dan Dynamo.

    Templat YAML

    AlibabaCloudMetricsAdapter:
    
      prometheus:
        enabled: true    # Setel ini ke true untuk mengaktifkan fitur adapter Prometheus.
        # Masukkan URL Managed Service for Prometheus Anda.
        url: http://cn-beijing.arms.aliyuncs.com:9090/api/v1/prometheus/xxxx/xxxx/xxx/cn-beijing
        # Jika otentikasi berbasis token diaktifkan untuk Managed Service for Prometheus, konfigurasikan parameter Authorization dari bidang prometheusHeader.
    #    prometheusHeader:
    #    - Authorization: xxxxxxx
    
        adapter:
          rules:
            default: false  			# Konfigurasi pengumpulan metrik default. Pertahankan ini tetap false.
            custom:
    
            # ** Contoh 1: Ini adalah contoh untuk vLLM **
            # vllm:num_requests_waiting: Jumlah permintaan yang menunggu.
            # Jalankan perintah berikut untuk memeriksa apakah metrik dikumpulkan.
            # kubectl get --raw  "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/vllm:num_requests_waiting"
            - seriesQuery: 'vllm:num_requests_waiting{namespace!="",pod!=""}'
              resources:
                overrides:
                  namespace: { resource: "namespace" }
                  pod: { resource: "pod" }
              metricsQuery: 'sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)'
    
            # vllm:num_requests_running: Jumlah permintaan yang sedang diproses.
            # Jalankan perintah berikut untuk memeriksa apakah metrik dikumpulkan.
            # kubectl get --raw  "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/vllm:num_requests_running"
            - seriesQuery: 'vllm:num_requests_running{namespace!="",pod!=""}'
              resources:
                overrides:
                  namespace: { resource: "namespace" }
                  pod: { resource: "pod" }
              metricsQuery: 'sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)'
    
            # vllm:kv_cache_usage_perc: Penggunaan cache KV.
            # Jalankan perintah berikut untuk memeriksa apakah metrik dikumpulkan.
            # kubectl get --raw  "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/vllm:kv_cache_usage_perc"
            - seriesQuery: 'vllm:kv_cache_usage_perc{namespace!="",pod!=""}'
              resources:
                overrides:
                  namespace: { resource: "namespace" }
                  pod: { resource: "pod" }
              metricsQuery: 'sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)'
    
            # ** Contoh 2: Ini adalah contoh untuk SGLang **
            # sglang:num_queue_reqs: Jumlah permintaan yang menunggu.
            # Jalankan perintah berikut untuk memeriksa apakah metrik dikumpulkan.
            # kubectl get --raw  "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/sglang:num_queue_reqs"
            - seriesQuery: 'sglang:num_queue_reqs{namespace!="",pod!=""}'
              resources:
                overrides:
                  namespace: { resource: "namespace" }
                  pod: { resource: "pod" }
              metricsQuery: 'sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)'
            # sglang:num_running_reqs: Jumlah permintaan yang sedang diproses.
            # Jalankan perintah berikut untuk memeriksa apakah metrik dikumpulkan.
            # kubectl get --raw  "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/sglang:num_running_reqs"
            - seriesQuery: 'sglang:num_running_reqs{namespace!="",pod!=""}'
              resources:
                overrides:
                  namespace: { resource: "namespace" }
                  pod: { resource: "pod" }
              metricsQuery: 'sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)'
              # sglang:token_usage: Penggunaan token dalam sistem, yang dapat mencerminkan pemanfaatan cache KV.
              # Jalankan perintah berikut untuk memeriksa apakah metrik dikumpulkan.
              # kubectl get --raw  "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/sglang:token_usage"
            - seriesQuery: 'sglang:token_usage{namespace!="",pod!=""}'
              resources:
                overrides:
                  namespace: { resource: "namespace" }
                  pod: { resource: "pod" }
              metricsQuery: 'sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)'
    
            # Contoh 3: Ini adalah contoh untuk Dynamo
            # nv_llm_http_service_inflight_requests: Jumlah permintaan yang sedang diproses.
            # Jalankan perintah berikut untuk memeriksa apakah metrik dikumpulkan.
            # kubectl get --raw  "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/nv_llm_http_service_inflight_requests"
            - seriesQuery: 'nv_llm_http_service_inflight_requests{namespace!="",pod!=""}'
              resources:
                overrides:
                  namespace: { resource: "namespace" }
                  pod: { resource: "pod" }
              metricsQuery: 'sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)'
    
    

Langkah 3: Konfigurasikan HPA

Buat sumber daya HPA yang menargetkan layanan inferensi Anda dan menggunakan salah satu metrik khusus yang telah Anda konfigurasikan.

Catatan

Konfigurasi parameter dalam kebijakan penskalaan berikut hanya untuk tujuan demonstrasi. Tentukan ambang batas yang sesuai untuk kasus penggunaan spesifik Anda berdasarkan pengujian performa, biaya sumber daya, dan tujuan tingkat layanan (SLO).

  1. Buat file bernama hpa.yaml. Pilih contoh yang sesuai dengan framework inferensi Anda.

    vLLM

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: llm-inference-hpa
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: StatefulSet
        name: vllm-inference # Ganti dengan nama layanan inferensi vLLM Anda.
      minReplicas: 1
      maxReplicas: 3
      metrics:
      - type: Pods
        pods:
          metric:
            name: vllm:num_requests_waiting
          target:
            type: Value
            averageValue: 5
    

    SGLang

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: llm-inference-hpa
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: StatefulSet
        name: sgl-inference
      minReplicas: 1
      maxReplicas: 3
      metrics:
      - type: Pods
        pods:
          metric:
            name: sglang:num_queue_reqs
          target:
            type: Value
            averageValue: 5

    Terapkan konfigurasi HPA.

    kubectl apply -f hpa.yaml

Langkah 4: Uji konfigurasi penskalaan otomatis

Terapkan beban ke layanan Anda untuk memicu HPA menggunakan alat benchmark.

Untuk detail alat benchmark dan cara menggunakannya, lihat vLLM Benchmark dan SGLang Benchmark.
  1. Buat file bernama benchmark.yaml.

    • Tentukan gambar kontainer yang sesuai dengan framework inferensi yang Anda uji. Pilih salah satu opsi berikut:

      • Untuk vLLM: kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/vllm:v0.10.0

      • Untuk SGLang: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/anolis-docker-images/docker-temp:0.3.4.post2-sglang0.4.10.post2-pytorch2.7.1.8-cuda12.8.1-py312-alinux3.2104

    Templat YAML

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      labels:
        app: llm-benchmark
      name: llm-benchmark
    spec:
      selector:
        matchLabels:
          app: llm-benchmark
      template:
        metadata:
          labels:
            app: llm-benchmark
        spec:
          hostNetwork: true
          dnsPolicy: ClusterFirstWithHostNet
          containers:
          - command:
            - sh
            - -c
            - sleep inf
            image: # Gambar kontainer SGLang atau vLLM yang digunakan untuk menerapkan layanan inferensi
            imagePullPolicy: IfNotPresent
            name: llm-benchmark
            resources:
              limits:
                cpu: "8"
                memory: 40 Gi
              requests:
                cpu: "8"
                memory: 40 Gi
            volumeMounts:
            - mountPath: /models/Qwen3-32B
              name: llm-model
          volumes:
          - name: llm-model
            persistentVolumeClaim:
              claimName: llm-model
  2. Sebarkan pod klien benchmark untuk menghasilkan lalu lintas.

    kubectl create -f benchmark.yaml
  3. Jalankan skrip benchmark dari dalam pod klien untuk menghasilkan beban tinggi pada layanan inferensi Anda.

    vLLM

    python3 $VLLM_ROOT_DIR/benchmarks/benchmark_serving.py \
            --model /models/Qwen3-32B \
            --host inference-service \
            --port 8000 \
            --dataset-name random \
            --random-input-len 1500 \
            --random-output-len 100 \
            --random-range-ratio 1 \
            --num-prompts 400 \
            --max-concurrency 20

    SGLang

    python3 -m sglang.bench_serving --backend sglang \
            --model /models/Qwen3-32B \
            --host inference-service \
            --port 8000 \
            --dataset-name random \
            --random-input-len 1500 \
            --random-output-len 100 \
            --random-range-ratio 1 \
            --num-prompts 400 \
            --max-concurrency 20

Saat pengujian beban berjalan, buka terminal baru dan pantau status HPA.

kubectl describe hpa llm-inference-hpa

Di log event, Anda harus melihat event SuccessfulRescale, yang menunjukkan bahwa HPA telah mendeteksi jumlah permintaan yang menunggu tinggi, dan telah meningkatkan jumlah replika dari 1 menjadi 3.

Name:                                   llm-inference-hpa
Namespace:                              default
Labels:                                 <none>
Annotations:                            <none>
CreationTimestamp:                      Fri, 25 Jul 2025 11:29:20 +0800
Reference:                              StatefulSet/vllm-inference
Metrics:                                ( current / target )
  "vllm:num_requests_waiting" on pods:  11 / 5
Min replicas:                           1
Max replicas:                           3
StatefulSet pods:                       1 current / 3 desired
Conditions:
  Type            Status  Reason              Message
  ----            ------  ------              -------
  AbleToScale     True    SucceededRescale    the HPA controller was able to update the target scale to 3
  ScalingActive   True    ValidMetricFound    the HPA was able to successfully calculate a replica count from pods metric vllm:num_requests_waiting
  ScalingLimited  False   DesiredWithinRange  the desired count is within the acceptable range
Events:
  Type    Reason             Age   From                       Message
  ----    ------             ----  ----                       -------
  Normal  SuccessfulRescale  1s    horizontal-pod-autoscaler  New size: 3; reason: pods metric vllm:num_requests_waiting above target