Kubernetes集群中vLLM与SGLang多模型推理服务实战指南

1. 生产级多模型推理架构设计

在Kubernetes集群中部署多模型推理服务需要解决三个核心问题:动态路由资源隔离弹性扩展。与单机部署不同,分布式环境需要考虑网络延迟、GPU资源调度和故障恢复等复杂因素。

典型架构拓扑

Client → Ingress → Router Service → Model Pods (vLLM/SGLang) → Persistent Storage

关键组件选型建议:

  • 路由层:采用Nginx+OpenResty或Traefik实现动态路由
  • 编排层:使用Kubernetes原生LeaderWorkerSet管理分布式工作负载
  • 监控体系:Prometheus-Operator采集GPU利用率/请求延迟指标

资源分配策略对比

策略类型适用场景优势劣势
静态分区模型规模固定隔离性好资源利用率低
动态共享流量波动大弹性高存在干扰风险
混合模式生产推荐方案平衡性能与隔离配置复杂

提示:实际部署时应根据模型显存需求预留20%缓冲,避免OOM导致Pod重启

2. 基于ACK的分布式部署实践

2.1 基础设施准备

首先创建持久化存储卷,以阿里云OSS为例:

# pv-oss.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: llm-model-pv
spec:
  capacity:
    storage: 100Gi
  accessModes:
    - ReadOnlyMany
  csi:
    driver: ossplugin.csi.alibabacloud.com
    volumeHandle: model-storage
    volumeAttributes:
      bucket: "your-bucket"
      url: "oss-cn-hangzhou-internal.aliyuncs.com"
      path: "/Qwen3-32B/"

挂载模型到容器时需注意:

  • 使用ReadOnlyMany访问模式
  • 设置sizeLimit限制内存盘大小
  • 配置emptyDir作为共享内存缓存

2.2 vLLM多机部署配置

使用LeaderWorkerSet实现张量并行:

# vllm-leader-workerset.yaml
apiVersion: leaderworkerset.x-k8s.io/v1
kind: LeaderWorkerSet
metadata:
  name: vllm-32b
spec:
  replicas: 2  # 两个计算组
  leaderWorkerTemplate:
    size: 2    # 每组2个Pod(TP=2)
    leaderTemplate:
      spec:
        containers:
        - name: vllm
          image: vllm/vllm-openai:v0.3.0
          command:
            - sh
            - -c
            - |
              vllm serve /models/Qwen3-32B \
                --tensor-parallel-size=2 \
                --gpu-memory-utilization=0.8 \
                --max-num-batched-tokens=4096
          resources:
            limits:
              nvidia.com/gpu: "1"

关键参数说明:

  • --tensor-parallel-size:必须与组内Pod数一致
  • --gpu-memory-utilization:建议设为0.7-0.9
  • --max-num-batched-tokens:根据显存调整

2.3 SGLang动态路由方案

SGLang原生支持多模型路由,部署示例如下:

# 启动路由服务
python -m sglang_router.launch_router --port 30000

# 启动模型实例(不同节点)
python -m sglang.launch_server \
  --model-path /models/Qwen3-32B \
  --tp 2 \
  --nnodes 2 \
  --node-rank 0  # 另一节点设为1

对应的Kubernetes Service配置:

apiVersion: v1
kind: Service
metadata:
  name: sglang-router
spec:
  ports:
  - port: 30000
    targetPort: 30000
  selector:
    app: sglang-router

3. 性能优化技巧

3.1 GPU参数调优

关键指标监控

# 查看GPU利用率
nvidia-smi --query-gpu=utilization.gpu,memory.used \
           --format=csv -l 5

推荐启动参数组合:

场景vLLM参数SGLang参数
高吞吐--max-parallel-loading 4--max-concurrency 32
低延迟--disable-log-stats--prefetch-factor 1
长文本--max-model-len 8192--context-length 8192

3.2 自适应批处理配置

动态批处理能显著提升吞吐量,建议:

# 客户端请求示例
import openai
client = openai.Client(base_url="http://router:30000")
response = client.chat.completions.create(
    model="Qwen3-32B",
    messages=[...],
    extra_body={
        "batch_size": "auto",  # 启用动态批处理
        "priority": "high"     # 关键请求优先
    }
)

4. 完整部署示例

4.1 组合部署YAML

# multi-model-deployment.yaml
apiVersion: apps/v1/v1
kind: Deployment
metadata:
  name: model-router
spec:
  template:
    spec:
      containers:
      - name: router
        image: nginx:1.25
        volumeMounts:
        - mountPath: /etc/nginx/conf.d
          name: config
      volumes:
      - name: config
        configMap:
          name: routing-rules

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: routing-rules
data:
  model-router.conf: |
    server {
      location /v1/completions {
        set $target "";
        if ($arg_model = "Qwen") {
          set $target "vllm-service:8000";
        }
        if ($arg_model = "DeepSeek") {
          set $target "sglang-service:30000";
        }
        proxy_pass http://$target;
      }
    }

4.2 自动化扩缩容策略

配置HPA实现基于GPU利用率的自动扩缩:

# 创建HPA规则
kubectl autoscale deployment vllm-deploy \
  --min=2 --max=10 \
  --cpu-percent=60 \
  --metrics=nvidia.com/gpu:60%

5. 故障排查指南

常见问题及解决方案:

  1. OOM错误

    • 检查--gpu-memory-utilization设置
    • 减少--max-num-batched-tokens
    • 启用--swap-space参数
  2. 路由失败

    • 验证Service的selector标签
    • 检查Nginx的$arg_model变量传递
  3. 性能下降

    • 使用nsys profile进行GPU内核分析
    • 检查PCIe带宽是否成为瓶颈
# 诊断命令示例
kubectl exec -it pod/vllm-pod -- \
  nsys profile --stats=true python -m vllm.entrypoints.api_server

更多推荐