vLLM + Kubernetes:构建可伸缩的大模型推理集群

你有没有经历过这样的场景?线上大模型服务突然涌入一波流量高峰,GPU 显存瞬间飙红,请求排队到“天荒地老”——用户抱怨响应慢,运维疯狂扩容,而模型还在一个个串行解码……😅 这不是科幻片,是很多团队在部署 LLaMA、Qwen 或 ChatGLM 时的真实写照。

传统推理框架面对长上下文和高并发,往往力不从心。显存不够?只能降并发。吞吐上不去?加机器硬扛。结果就是成本飙升、资源浪费、体验拉胯。

但今天我们要聊的这套组合拳——vLLM + Kubernetes——正是为解决这些问题而生。它不只是“跑得更快”,而是从底层机制到系统架构,彻底重构了大模型推理的玩法。🚀


想象一下:一个 80GB 的 A100 显卡,原本只能支撑几十个并发请求,现在轻松承载数百个;突发流量来袭,系统自动在几分钟内扩容出 10 个新实例;多个模型共存于同一集群,互不干扰还能按需调度……这一切,并非遥不可及。

核心秘密就在于两个关键技术的融合:

  • vLLM:用操作系统级别的内存管理思维,重新设计注意力机制;
  • Kubernetes:把推理服务当作标准容器来编排,实现自动化运维与弹性伸缩。

它们一内一外,一个负责“跑得快”,一个负责“管得好”。合体之后,就成了生产级大模型服务的理想底座。


先来看那个让性能起飞的“内核引擎”——vLLM。

我们知道,在自回归生成中,每个新 token 都依赖前面所有 token 的 Key-Value 缓存(KV Cache)。随着序列增长,这些缓存像滚雪球一样越积越多,很快就把 GPU 显存塞满。更糟的是,不同长度的请求混合时,还得 padding 对齐,白白浪费计算资源。

而 vLLM 的杀手锏,叫 PagedAttention ——听名字是不是有点眼熟?没错,它借鉴的就是操作系统的分页内存管理!

传统的 KV Cache 是一块连续内存,一旦分配就不能拆。但 PagedAttention 把这块缓存切成了一个个固定大小的“页面”(默认 16~32 个 token),就像文件系统里的数据块。每个请求的缓存可以分散存储,甚至部分换出到 CPU 内存。这样一来,显存使用变得离散且灵活,极大缓解了碎片问题。

💡 小知识:这就好比你写文档时不用非得找一张完整的大桌子,而是可以把段落放在不同的小桌上,只要知道编号就能快速访问。

配合这个机制,vLLM 还实现了真正的 连续批处理(Continuous Batching)。不同于 HuggingFace Transformers 中静态 batching 必须等整批填满,vLLM 动态聚合处于不同解码阶段的请求,只要有 GPU 空闲周期就塞进去新任务。就像高铁站的智能检票口,不停放人进站,而不是等到凑够一列车才发车。

官方基准测试显示:吞吐量提升可达 5–10 倍,尤其是在长文本和高并发场景下优势更为明显。实测中,同样的 A100 卡,原来跑 7B 模型最多支持 30 并发,用了 vLLM 后轻松突破 200+。

而且对开发者极其友好——它提供了完全兼容 OpenAI API 的接口 /v1/completions/v1/chat/completions。这意味着你现有的前端、SDK、LangChain 工具链几乎不用改一行代码,就能切换到这个高性能后端。

from vllm import LLM, SamplingParams

# 初始化模型,支持多卡并行
llm = LLM(
    model="meta-llama/Llama-2-7b-chat-hf",
    tensor_parallel_size=2,
    max_num_seqs=256,  # 控制最大并发数
    gpu_memory_utilization=0.9
)

sampling_params = SamplingParams(temperature=0.7, top_p=0.95, max_tokens=512)

prompts = [
    "请解释量子计算的基本原理。",
    "写一首关于春天的五言绝句。",
    "如何用 Python 实现快速排序?"
]

outputs = llm.generate(prompts, sampling_params)
for output in outputs:
    print(f"Prompt: {output.prompt}")
    print(f"Generated text: {output.outputs[0].text}\n")

这段代码看起来简洁得不像话,但它背后藏着高度优化的并行策略和内存调度逻辑。你可以把它封装成一个微服务,扔进 Kubernetes 集群里跑起来。


接下来,轮到 Kubernetes 登场了。

如果说 vLLM 解决了“单点性能”的问题,那 K8s 就解决了“全局治理”的难题。

试想:如果只跑一个 vLLM 实例,那还停留在“玩具阶段”。真正的挑战在于——如何让几十个甚至上百个实例协同工作?如何应对流量波峰波谷?如何保证故障自动恢复?

这时候,裸机部署的局限性就暴露无遗了:手动启停、配置混乱、扩缩容延迟高、资源利用率低……

而 K8s 提供了一套声明式的自动化体系。我们只需要写几个 YAML 文件,剩下的交给控制器去搞定。

比如这个典型的 Deployment 定义:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: vllm-inference
spec:
  replicas: 2
  template:
    spec:
      containers:
      - name: vllm-server
        image: your-registry/vllm-kserve:latest
        args:
        - python
        - -m
        - vllm.entrypoints.openai.api_server
        - --model
        - meta-llama/Llama-2-7b-chat-hf
        - --tensor-parallel-size
        - "2"
        ports:
        - containerPort: 8000
        resources:
          limits:
            nvidia.com/gpu: 2
            memory: 48Gi
          requests:
            nvidia.com/gpu: 2
            memory: 32Gi
---
apiVersion: v1
kind: Service
metadata:
  name: vllm-service
spec:
  selector:
    app: vllm
  ports:
    - port: 80
      targetPort: 8000
  type: ClusterIP

短短几十行,就定义了一个具备以下能力的服务:
- 使用专用镜像启动 vLLM OpenAI API Server;
- 绑定 2 张 GPU,确保模型能加载进显存;
- 通过 Service 提供统一入口,内部负载均衡;
- 支持滚动更新、健康检查、日志采集等现代运维特性。

但这还不够“智能”。真正的亮点是 弹性伸缩

我们可以借助 HorizontalPodAutoscaler(HPA)+ KEDA 实现基于 GPU 利用率的动态扩缩容:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: vllm-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: vllm-inference
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Pods
    pods:
      metric:
        name: gpu_utilization
      target:
        type: AverageValue
        averageValue: 70

当 Prometheus 监控到 GPU 平均利用率持续超过 70%,HPA 会自动创建新的 Pod 副本。新实例启动后从镜像加载模型(或挂载远程模型存储),迅速加入服务池。流量回落时再自动缩容,节省成本。

🌟 实际案例:某教育平台在上课高峰期前 5 分钟自动扩容至 8 个副本,课后 10 分钟内回收闲置资源,月度 GPU 成本下降 40%。


整个系统的架构也相当清晰:

+------------------+       +----------------------------+
|   Client Apps    |<----->|   Ingress Controller       |
+------------------+       +-------------+--------------+
                                          |
                  +-----------------------v------------------------+
                  |               Kubernetes Cluster               |
                  |                                                |
                  |  +--------------------+     +----------------+ |
                  |  | vLLM Pod (Replica 1)| ... | vLLM Pod (N)   | |
                  |  | - GPU: 2           |     | - GPU: 2       | |
                  |  | - Model: LLaMA-7B   |     | - Model: Qwen  | |
                  |  +---------+----------+     +----------------+ |
                  |            |                                   |
                  |  +---------v----------+                        |
                  |  | Prometheus + GPU   |<-----------------------+
                  |  | Exporter + KEDA    |     监控与扩缩信号反馈
                  |  +--------------------+                        |
                  +------------------------------------------------+

前端通过 Ingress 接入,请求被路由到 Service,再由 kube-proxy 分发到健康的 Pod。每个 Pod 独立运行 vLLM 实例,利用 PagedAttention 处理高并发请求。Prometheus 实时采集 GPU 利用率、请求延迟、QPS 等指标,KEDA 转化为扩缩信号驱动 HPA。

更进一步,还可以在同一集群中部署多种模型。例如:

  • 客服机器人 → Qwen-7B
  • 代码生成 → CodeLlama-13B
  • 智能写作 → ChatGLM3-6B

通过命名空间(Namespace)和标签(Label)进行逻辑隔离,结合 Istio 或 Ambassador 做精细化路由,比如 /api/qwen 走一组 Pod,/api/codellama 走另一组。既共享基础设施,又避免相互影响。


当然,落地过程中也有一些关键设计考量需要特别注意:

🔧 GPU 资源规划
7B 模型通常 1~2 卡足够,但 70B 模型必须启用张量并行(tensor parallelism),建议至少 4 卡起步。记得在 --tensor-parallel-size 中正确设置。

📦 镜像优化
把模型权重打包进 Docker 镜像虽然冷启动快,但镜像体积动辄几十 GB,拉取耗时。更优方案是挂载远程存储(如 S3/NFS),配合缓存层加速首次加载。

🩺 健康检查
一定要配置 readinessProbelivenessProbe,否则未完成初始化的实例可能接收请求,导致超时或崩溃。

📊 可观测性
集成 Fluentd + Elasticsearch + Grafana + Jaeger,实现日志、指标、链路追踪三位一体监控,快速定位性能瓶颈。

🔒 安全策略
开启 RBAC 权限控制,限制谁可以部署模型;使用 NetworkPolicy 禁止跨命名空间直接访问,防止横向渗透。


回头看看这套架构到底解决了哪些痛点:

🧠 显存不足?
PagedAttention 让多个请求共享显存空间,实测在相同硬件下并发能力提升 3~5 倍。

吞吐低下?
连续批处理消除 padding 浪费,GPU 利用率常年保持在 80%+,告别“空转”。

📈 突发流量扛不住?
HPA + KEDA 秒级响应负载变化,高峰期自动扩容,稳如老狗。

🧩 多模型难管理?
K8s 的标签、命名空间、Ingress 路由让你轻松玩转“一集群多模型”。

💰 运维成本太高?
自动缩容 + 混部调度,让 GPU 资源利用率从“看天吃饭”变成“精打细算”。


这套“vLLM + Kubernetes”组合已经在多个真实场景中验证了其价值:

  • 某金融机构用它支撑千人级并发的智能投研问答系统,平均响应时间 <800ms;
  • 教育公司低成本运行上百种个性化教学助手,按学科自动路由;
  • 云服务商将其作为 MaaS(Model-as-a-Service)产品的技术底座,对外提供标准化 API。

未来,随着 MoE 架构普及、动态卸载技术成熟、异构计算(CPU+GPU+NPU)协同发展,这套架构还将继续进化——比如根据请求类型动态选择专家模型,或将部分计算卸载到边缘节点。

但无论如何演进,“高性能推理内核 + 可编程分布式底盘”这一核心理念不会变。而 vLLM 与 Kubernetes 的结合,正引领着 AI 基础设施走向更高效、更智能的新阶段。✨

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐