全部产品
Search
文档中心

容器服务 Kubernetes 版 ACK:基于vllm自定义指标的多集群HPA实践

更新时间:Dec 29, 2025

大语言模型(LLM)在线服务因流量波动而普遍采用的多集群架构部署,ACK One提供的多集群解决方案可以适配这种场景。本文将演示如何基于ACK One舰队,在云上环境中部署vLLM推理服务,并利用多集群HPA(FederatedHPA)进行跨集群的弹性伸缩。

工作原理

在大规模推理场景中,大语言模型(LLM)在线服务面临流量波动剧烈且难以预测的挑战。多集群架构是应对流量高峰时普遍采用的方案:

  • 自建数据中心用户:通常采用混合云架构,在业务高峰期通过云端集群进行弹性扩容。

  • 云上用户:倾向于在不同地域部署多个集群,以此规避单地域资源供给不足的风险。

ACK One舰队支持同时管理多个集群的资源,并执行跨集群的调度、弹性伸缩等能力,适配以上两种部署模式的需求:

  • 多集群优先级调度:支持配置集群的调度优先级,可以将副本优先调度到高优集群,在资源不足时扩容副本至低优集群,缩容时优先缩容低优集群的副本。

  • 基于库存的智能调度:舰队集群会与子集群的GoatScaler联动结合ECS库存进行副本的智能调度。

  • 统一中心弹性扩缩容:通过创建FederatedHPA进行多集群的统一中心弹性扩缩容,舰队集群的Metrics Adapter会采集子集群的指标并进行聚合(子集群也支持Prometheus-adapter),根据聚合指标对工作负载进行扩缩容。

image.jpeg

适用范围

重要

多集群HPA功能处于邀测阶段,请联系我们提交申请开通白名单后使用。

操作步骤

步骤一:在子集群中配置指标采集

在两个ACK集群中配置ack-alibaba-cloud-metrics-adapter的组件参数。

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  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这两个自定义指标进行弹性伸缩。

将下方示例模板保存到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 .