用途
该技能用于在 Kubernetes 上对 LLM 推理服务进行水平扩缩容,结合 GPU 感知的自动扩缩、请求排队与成本优化的 Spot 实例策略。当 LLM API 流量不可预测、需要自动扩缩,或需要管理一批 vLLM / TGI 推理 Pod、用 Spot/可抢占 GPU 实例降低推理成本、为批处理推理任务实现基于队列的扩缩、构建共享 GPU 资源的多模型服务平台时适用。
前置条件
- 带 GPU 节点的 Kubernetes 集群(已安装 NVIDIA operator)
- 已安装 KEDA(Kubernetes Event-Driven Autoscaler)
- 带 GPU 指标的 Prometheus(dcgm-exporter 或 gpu-operator)
- Helm 3+ 用于部署 chart
主要能力
GPU 节点准备
通过 Helm 安装 NVIDIA GPU Operator,处理驱动、容器工具包与 DCGM:
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
helm repo update
helm install gpu-operator nvidia/gpu-operator \
--namespace gpu-operator \
--create-namespace \
--set driver.enabled=true \
--set dcgm.enabled=true \
--set devicePlugin.enabled=true
kubectl get nodes -l nvidia.com/gpu.present=true
kubectl describe node <gpu-node> | grep nvidia
vLLM 部署(带 GPU 资源)
提供 Deployment 示例,包含 nodeSelector、tolerations、GPU 资源请求与限制、readinessProbe 以及 Hugging Face token 环境变量。示例镜像为 vllm/vllm-openai:latest,模型为 meta-llama/Llama-3.1-8B-Instruct,参数包括 --tensor-parallel-size 1、--gpu-memory-utilization 0.90、--max-num-seqs 128。
基于 Prometheus 指标的 KEDA 扩缩
提供 ScaledObject 示例,设置 minReplicaCount: 1、maxReplicaCount: 8、cooldownPeriod: 300、pollingInterval: 15。触发器使用 Prometheus 指标:
vllm_num_requests_waiting,阈值10(等待请求超过 10 时扩容)vllm_gpu_cache_usage,阈值0.8(KV cache 超过 80% 时扩容)
基于队列的扩缩(Redis + KEDA)
提供 ScaledJob 示例用于异步批处理推理,minReplicaCount: 0、maxReplicaCount: 20、pollingInterval: 5,触发器为 Redis 列表 inference-jobs,listLength: 5(每 5 个排队任务启动 1 个 worker)。
Spot 实例策略
提供混合节点池配置:通过 ConfigMap 设置 cluster-autoscaler 优先级(spot 优先级 10,on-demand 优先级 50),并通过 nodeAffinity 的 preferredDuringSchedulingIgnoredDuringExecution 为 spot 设置权重 80、on-demand 权重 20。
GPU 节点的集群自动扩缩器
提供 AWS EKS 上安装 cluster-autoscaler 的 Helm 命令,包含 autoDiscovery.clusterName、awsRegion、RBAC 注解、skip-nodes-with-local-storage=false、expander=least-waste,以及为 GPU 节点组添加 cluster-autoscaler.kubernetes.io/safe-to-evict="false" 注解。
扩缩监控指标
提供 Prometheus 查询:
- 按模型统计 vLLM 队列等待请求:
sum(vllm:num_requests_waiting) by (model) - 按 Pod 统计 GPU KV cache 利用率(>80% 为瓶颈):
avg(vllm:gpu_cache_usage_perc) by (pod) - 按模型统计每秒 token 吞吐:
sum(rate(vllm:generation_tokens_total[5m])) by (model) - P99 首 token 时间:
histogram_quantile(0.99, rate(vllm:time_to_first_token_seconds_bucket[5m]))
常见问题
- Pod 卡在 Pending:无可用 GPU 节点,检查 cluster autoscaler 日志并确认节点组上限。
- 扩容过慢:cluster autoscaler 延迟加模型加载时间,可预热副本或提高 minReplicaCount。
- GPU 碎片化:大 GPU 上跑多个小模型,可使用 MIG 分区或合并模型规格。
- Spot 驱逐导致错误:Spot 实例回收,可添加 PodDisruptionBudget 并使用优雅关闭。
- KEDA 不扩缩:Prometheus 查询无数据,先在 Prometheus UI 中测试查询。
最佳实践
- 设置
minReplicaCount: 1避免冷启动;仅批处理任务可缩到 0。 - 使用
PodDisruptionBudget且minAvailable: 1以承受 Spot 驱逐。 - 将模型权重预拉到共享 PVC,可将 Pod 启动速度提升 5–10 倍。
- 按模型族划分节点池(7B 用 A10G,70B 用 A100)。
- 使用 Kubernetes VPA 调整 CPU/内存,配合 KEDA 调整副本数。
相关技能
- vllm-server:vLLM 配置与调优
- gpu-server-management:GPU 节点设置
- model-serving-kubernetes:KServe
- kubernetes-ops:核心 Kubernetes
- llm-cost-optimization:成本策略