一、项目全景与架构设计:vLLM推理服务在K8s上的整体架构、组件介绍、技术选型分析

说实话,我第一次在K8s上部署大模型推理服务时,踩了不少坑。那时候vLLM还没这么火,我用的是Triton Inference Server,配置起来那叫一个复杂。后来vLLM出来了,我第一时间就试了——嗯,真香。今天咱们就来聊聊,怎么把vLLM推理服务稳稳地跑在K8s上。

1.1 整体架构:一张图看懂

先别急着看代码,咱们先把架构理清楚。我个人习惯,做任何项目前先画架构图。下面这张图,就是我总结的vLLM推理服务在K8s上的标准架构。

Kubernetes 集群 用户层 客户端 / API 调用 / Web UI 入口层 Ingress / Service (LoadBalancer) / API Gateway 服务层 vLLM Service (ClusterIP) / 模型管理 / 请求路由 自动扩缩容 (HPA) / 健康检查 (Liveness/Readiness) 计算层 (Pod) vLLM 容器 PagedAttention 引擎 GPU 加速推理 模型存储 HuggingFace 模型 本地缓存 / PVC 监控 & 日志 Prometheus / Grafana Fluentd / ELK 用户层 入口层 服务层 计算层

你看,整个架构分四层。用户层负责接收请求,入口层做负载均衡,服务层管理Pod的生命周期,计算层才是真正跑模型的地方。说白了,这就是一个标准的微服务架构,只不过计算层换成了GPU推理。

1.2 核心组件介绍

咱们一个一个来看这些组件。我挑几个重点讲,其他的你查文档就行。

1.2.1 vLLM推理引擎

vLLM的核心优势是什么?PagedAttention。这玩意儿解决了大模型推理时显存碎片化的问题。我在项目中遇到过,用普通的HuggingFace Transformers跑LLaMA-13B,显存占用直接飙到40GB+,但换成vLLM后,同样的模型只用了28GB。你想想看,这省下来的显存能多跑多少个并发请求?

vLLM关键特性:

  • PagedAttention 显存管理:动态分配KV Cache,显存利用率提升4倍
  • 连续批处理:同一个GPU上同时处理多个请求,吞吐量翻倍
  • 支持多种量化:GPTQ、AWQ、SqueezeLLM,显存不够时用4bit量化
  • 兼容OpenAI API格式:客户端迁移成本几乎为零

1.2.2 Kubernetes核心组件

在K8s上跑vLLM,有几个组件是绕不开的:

组件 作用 我的建议
Deployment 管理Pod副本,保证服务高可用 别用StatefulSet,vLLM是无状态的
Service 提供稳定的网络入口 用ClusterIP就行,外面套一层Ingress
HPA 根据CPU/GPU利用率自动扩缩容 建议用自定义指标,比如请求排队长度
PVC 持久化存储模型文件 模型文件大,用ReadWriteMany的NFS或Ceph
GPU Operator 管理GPU资源分配 NVIDIA的,别用社区的,坑多

⚠️ 注意:我曾经在生产环境吃过亏——HPA只配了CPU指标,结果GPU都跑满了CPU才30%,HPA死活不扩容。后来加了GPU利用率指标才解决。所以,GPU推理服务的HPA一定要配GPU相关指标。

1.3 技术选型分析

选型这事儿,说白了就是权衡。我给你列个对比表,你就明白了。

1.3.1 推理引擎选型

特性 vLLM Triton Inference Server Text Generation Inference (TGI)
显存效率 ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐
吞吐量 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐
部署复杂度 ⭐⭐(简单) ⭐⭐⭐⭐(复杂) ⭐⭐⭐(中等)
模型支持 LLaMA、Mistral、Qwen等主流模型 几乎所有框架 HuggingFace生态
社区活跃度 极高(UC Berkeley) 高(NVIDIA) 高(HuggingFace)

我个人习惯,新项目直接上vLLM。为什么?因为它简单、快、省显存。Triton虽然功能强大,但配置起来太折腾了。我记得有一次配Triton的模型仓库,搞了整整两天才跑通——后来换成vLLM,半小时搞定。

1.3.2 GPU资源管理选型

GPU在K8s上的管理,目前主流就两种方案:

  • NVIDIA GPU Operator:自动管理GPU驱动、容器运行时、设备插件。我推荐这个,省心。
  • 手动部署:自己装驱动、配nvidia-docker、部署device plugin。适合对K8s很熟的老手。

💡 小技巧:如果你用的是A100或H100,记得开启MIG(多实例GPU)。一块A100可以切成7个1g.10gb的实例,跑小模型时性价比超高。我有个项目就是这么干的,GPU利用率从30%提到了85%。

1.3.3 存储选型

模型文件动不动就几十GB,存储选型很重要:

  • 本地存储:速度快,但Pod漂移后模型得重新下载。适合测试环境。
  • NFS:共享存储,所有节点都能访问。我生产环境用的就是NFS,配合模型预热脚本,效果不错。
  • 对象存储(S3/MinIO):适合大规模集群,但延迟比NFS高一些。

嗯,这里要注意:模型文件下载很慢。我曾经在AWS上从S3拉一个70GB的模型,等了快20分钟。后来我用了initContainers做模型预热,Pod启动前先把模型拉到本地,启动时间从20分钟降到了2分钟。

1.4 架构设计要点总结

说了这么多,我总结几个关键点:

  1. 分层设计:用户层、入口层、服务层、计算层,各层职责清晰,方便独立扩缩容。
  2. 无状态设计:vLLM Pod本身不保存状态,所有状态都在模型文件和KV Cache里。这样HPA扩缩容时不用担心数据丢失。
  3. GPU资源隔离:每个Pod独占GPU,避免资源争抢。别想着多个Pod共享一块GPU,vLLM不支持。
  4. 监控先行:Prometheus + Grafana 必须配好。我见过太多人服务上线了才发现没有监控,出了故障两眼一抹黑。

核心架构决策:

  • 推理引擎:vLLM(首选)
  • GPU管理:NVIDIA GPU Operator
  • 存储方案:NFS + initContainers预热
  • 扩缩容:HPA + 自定义GPU指标
  • 监控:Prometheus + Grafana + Loki

好了,架构设计这块就聊到这儿。下一章咱们会动手搭建环境,把vLLM真正跑起来。到时候我会带着你一步步操作,包括那些我踩过的坑,都会一一告诉你。


专注资料整理