使用 KEDA 进行自动扩缩容#

本教程将向您展示如何使用 KEDA 和基于 Prometheus 的指标自动扩缩容 vLLM 部署。您将配置 KEDA 来监控队列长度并根据负载动态调整副本数量。

目录#

先决条件#

  • 在 Kubernetes 上运行的 vLLM 部署(请参阅 快速入门

  • 可以访问至少具有 2 个 GPU 的 Kubernetes 集群

  • kubectlhelm 已安装

  • 对 Kubernetes 和 Prometheus 指标有基本了解

步骤#

1. 安装 vLLM 生产堆栈#

按照 Helm Chart 部署 中的说明,使用单个 Pod 安装生产堆栈。

2. 部署可观察性堆栈#

此堆栈包括 Prometheus、Grafana 和必要的导出器。

cd observability
bash install.sh

3. 安装 KEDA#

kubectl create namespace keda
helm repo add kedacore https://kedacore.github.io/charts
helm repo update
helm install keda kedacore/keda --namespace keda

4. 验证指标导出#

检查 Prometheus 是否正在抓取队列长度指标 vllm:num_requests_waiting

kubectl port-forward svc/prometheus-operated -n monitoring 9090:9090

在单独的终端中

curl -G 'https://:9090/api/v1/query' --data-urlencode 'query=vllm:num_requests_waiting'

示例输出

{
  "status": "success",
  "data": {
    "result": [
      {
        "metric": {
          "__name__": "vllm:num_requests_waiting",
          "pod": "vllm-llama3-deployment-vllm-xxxxx"
        },
        "value": [ 1749077215.034, "0" ]
      }
    ]
  }
}

这意味着在给定的时间戳,队列中有 0 个待处理请求。

5. 配置 ScaledObject#

以下 ScaledObject 配置在 tutorials/assets/values-19-keda.yaml 中提供。请查看其内容

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: vllm-scaledobject
  namespace: default
spec:
  scaleTargetRef:
    name: vllm-llama3-deployment-vllm
  minReplicaCount: 1
  maxReplicaCount: 2
  pollingInterval: 15
  cooldownPeriod: 30
  triggers:
    - type: prometheus
      metadata:
        serverAddress: http://prometheus-operated.monitoring.svc:9090
        metricName: vllm:num_requests_waiting
        query: vllm:num_requests_waiting
        threshold: '5'

应用 ScaledObject

cd ../tutorials
kubectl apply -f assets/values-19-keda.yaml

这告诉 KEDA:

  • 监控 vllm:num_requests_waiting

  • 在 1 到 2 个副本之间进行扩缩容

  • 当队列超过 5 个请求时向上扩容

6. 测试自动扩缩容#

观看部署

kubectl get hpa -n default -w

您最初应该看到

NAME                         REFERENCE                                TARGETS     MINPODS   MAXPODS   REPLICAS
keda-hpa-vllm-scaledobject   Deployment/vllm-llama3-deployment-vllm   0/5 (avg)   1         2         1

TARGETS 显示当前指标值与目标阈值。 0/5 (avg) 表示 vllm:num_requests_waiting 的当前值为 0,阈值为 5。

生成负载

kubectl port-forward svc/vllm-router-service 30080:80

在单独的终端中

python3 assets/example-10-load-generator.py --num-requests 100 --prompt-len 3000

几分钟后,REPLICAS 值应增加到 2。

7. 清理#

要删除 KEDA 配置和可观察性组件

kubectl delete -f assets/values-19-keda.yaml
helm uninstall keda -n keda
kubectl delete namespace keda

cd ../observability
bash uninstall.sh

附加资源#