第一章:vLLM与K8s基础

大家好,我是你们的运维老手。今天咱们聊聊vLLM和K8s怎么搭伙过日子。

说实话,我第一次接触vLLM时,心里还挺没底的。那时候公司要上线一个大模型推理服务,GPU资源紧张得要命,每次部署都像在刀尖上跳舞。后来发现vLLM+K8s这套组合拳,才算是找到了方向。

1.1 vLLM是什么?

vLLM,全称是Virtual Large Language Model,说白了就是一个专门为LLM推理加速设计的开源库。它最牛的地方在于——显存管理

你想想看,大模型推理时最头疼的是什么?显存爆炸。一个70B的模型,光参数就得占140GB显存。vLLM通过PagedAttention技术,把显存利用率从40%直接拉到95%以上。我在项目中遇到过,同样的硬件,用vLLM能多塞2-3个模型实例。

核心特性一览:

  • PagedAttention:像操作系统的虚拟内存一样管理显存
  • 连续批处理:动态合并请求,吞吐量提升10倍
  • 量化支持:FP16、INT8、INT4,按需选择
  • OpenAI兼容API:无缝对接现有工具链

嗯,这里要注意:vLLM不是万能的。它主要优化的是推理阶段的显存和吞吐,对训练场景不适用。我见过有人拿vLLM做微调,结果踩坑踩得怀疑人生。

1.2 K8s核心概念速览

Kubernetes,简称K8s,是Google开源的容器编排平台。说白了,它就是一群服务器的管家,帮你管着容器怎么跑、跑在哪、挂了怎么办。

我个人习惯把K8s的核心概念分成三层:

层级 核心对象 一句话解释
工作负载层 Pod、Deployment、StatefulSet 管你的应用怎么跑
网络层 Service、Ingress、Endpoint 管流量怎么进来
存储层 PV、PVC、ConfigMap、Secret 管数据和配置

对于vLLM部署,你最需要关注的是PodService。Pod是跑模型的最小单元,Service负责把流量分发给这些Pod。

我的小建议:刚开始学K8s时,别急着搞太复杂。先把Pod和Service玩明白,后面再慢慢加Ingress、HPA这些。我曾经带过一个新人,上来就搞Istio,结果三天没睡好觉。

1.3 为什么需要负载均衡?

这个问题问得好。你想想,如果只有一个vLLM实例,那流量来了它扛得住吗?扛不住。如果搞多个实例,流量怎么分?这就是负载均衡要解决的问题。

具体来说,有三大痛点:

  1. 单点故障:一个实例挂了,整个服务就瘫了。我经历过一次,半夜三点被叫起来,那滋味...嗯,你懂的。
  2. 资源不均:有的GPU卡忙死,有的闲死。负载均衡能把请求均匀分配,让每张卡都物尽其用。
  3. 弹性伸缩:流量高峰时自动加实例,低谷时自动减。没有负载均衡,伸缩就是个笑话。

避坑指南:我曾经在项目中只用了一个vLLM实例,结果用户量一上来,显存直接爆了,所有请求都返回502。后来加了负载均衡和自动伸缩,再也没出过类似问题。

1.4 vLLM+K8s架构概览

好了,前面铺垫了这么多,咱们来看看整体架构长什么样。我画了一张图,帮你快速理解:

vLLM + K8s 架构概览 用户请求 K8s Service (负载均衡) Round Robin / 最小连接数 vLLM Pod 1 GPU 0 (A100 80G) 模型: LLaMA-70B vLLM Pod 2 GPU 1 (A100 80G) 模型: LLaMA-70B vLLM Pod 3 GPU 2 (A100 80G) 模型: LLaMA-70B 共享存储 (PV/PVC) Prometheus 监控 & 告警 用户层 负载均衡 vLLM实例 共享存储 监控

从这张图你能看到,整个架构分四层:

  • 用户层:所有请求先打到K8s Service上
  • 负载均衡层:Service根据策略(比如Round Robin)把请求分给后端的vLLM Pod
  • 推理层:每个Pod跑一个vLLM实例,独占一张GPU卡
  • 存储层:模型权重、配置文件通过PV/PVC共享

我个人习惯在架构里再加一个监控层,用Prometheus盯着每个Pod的GPU利用率、请求延迟、显存占用。这样一旦哪个Pod出问题,能第一时间发现。

关键设计原则:

  • 每个vLLM Pod绑定一张GPU,避免资源争抢
  • Service用ClusterIP模式,内部负载均衡
  • 模型权重放在共享存储,方便滚动更新
  • 监控指标暴露给Prometheus,配置告警规则

好了,第一章的内容就到这里。记住这个架构图,后面我们会一步步把它落地成真正的K8s YAML文件。


专注资料整理