1. 项目背景与目标:理解多租户场景下vLLM服务隔离的必要性
大家好,我是你们这门课的老朋友。今天咱们聊聊一个很现实的问题——多租户场景下,vLLM服务为什么要做隔离?
先说说我自己的经历。去年我在一家AI公司做推理平台,团队同时服务好几个业务线:有做智能客服的,有做代码助手的,还有做内容生成的。一开始大家共用一套GPU集群,结果呢?
- 客服那边流量一上来,代码助手的响应时间直接飙到10秒
- 内容生成那边跑个长文本推理,把显存吃光,其他服务全挂了
- 最要命的是,有一次一个测试脚本写了个死循环,把整个集群的推理服务都拖垮了
嗯,说白了就是“一个租户搞事情,全平台跟着遭殃”。你想想看,这要是生产环境,老板不得把我叫去喝茶?
1.1 为什么需要Namespace隔离?
Kubernetes里的Namespace,说白了就是一个虚拟集群。它能把一个物理集群切分成多个逻辑上独立的“小集群”。每个Namespace里的资源、服务、网络都是隔离的。
我个人习惯,在部署vLLM这类推理服务时,每个租户一个Namespace。这样做有几个好处:
- 资源隔离:每个Namespace可以设置ResourceQuota,限制CPU、内存、GPU的使用量。一个租户吃再多,也不会影响别人。
- 网络隔离:通过NetworkPolicy,可以控制哪些Pod能互相通信。比如客服的推理服务,只能被客服的后端调用,代码助手的服务同理。
- 权限隔离:用RBAC控制,每个租户只能操作自己的Namespace。我曾经见过一个团队,因为权限没隔离,测试环境的人误删了生产环境的Deployment……那叫一个惨。
- 运维隔离:日志、监控、告警都可以按Namespace分开。排查问题的时候,不用在一堆Pod里大海捞针。
核心观点:Namespace隔离不是“锦上添花”,而是多租户场景下的刚需。没有隔离,你就是在赌——赌每个租户都规规矩矩,赌不会出任何意外。但现实是,意外总会来。
1.2 vLLM服务的特殊性
vLLM是个好东西,它用PagedAttention等技术,把大模型推理的吞吐量提上去了。但正因为它是显存密集型服务,隔离问题就更突出。
我记得有一次,一个租户部署了一个70B的模型,显存占用直接拉满。另一个租户的7B模型,明明只需要4GB显存,结果因为GPU被占满,一直Pending。你说冤不冤?
所以,vLLM服务的隔离,核心要解决两个问题:
- 显存隔离:每个vLLM实例能用的显存上限要可控。不能一个模型把整张卡吃了。
- GPU资源隔离:通过K8s的Device Plugin,可以控制每个Pod绑定哪张GPU卡。配合Namespace的ResourceQuota,就能做到“每个租户固定几张卡”。
小技巧:我建议在部署vLLM时,显式设置--gpu-memory-utilization参数,比如0.8。这样即使模型推理有波动,也不会把显存撑爆。我曾经因为没设这个参数,导致一个推理Pod OOM,然后被K8s反复重启……那场面,不忍直视。
1.3 课程最终目标
好,说了这么多背景,咱们这门课到底要干什么?
一句话概括:在K8s中,通过Namespace隔离,部署多个vLLM推理服务,让它们互不干扰、各自安好。
具体来说,我们会做这几件事:
- 搭建一个多租户的K8s集群(当然,我会用minikube或者kind,方便大家本地实验)
- 为每个租户创建独立的Namespace,并配置ResourceQuota和LimitRange
- 在每个Namespace中部署vLLM推理服务,并配置GPU资源绑定
- 通过Service和Ingress,让每个租户的推理服务只能被自己的客户端访问
- 最后,我们会做压力测试,验证隔离效果——看看一个租户的流量高峰,会不会影响另一个租户
注意:这门课不是讲vLLM怎么用的,也不是讲K8s基础操作的。我假设你已经知道怎么用kubectl,知道Pod、Service、Deployment是什么。如果你还不熟,建议先补一下K8s基础。
1.4 整体架构图
下面这张图,是我画的本课程核心架构。你可以看到,每个租户(Tenant A、Tenant B)都有自己的Namespace,里面跑着独立的vLLM推理服务。它们共享同一个K8s集群,但资源、网络、权限都是隔离的。
1.5 你将从这门课学到什么?
学完这一章,你应该能回答这几个问题:
- 为什么多租户场景下,vLLM服务必须做隔离?
- K8s的Namespace能提供哪些隔离能力?
- vLLM服务的隔离,和普通Web服务的隔离有什么不同?
- 我们这门课最终要交付什么?
嗯,说白了,这一章就是“为什么要做”。后面的章节,咱们会一步步教你怎么做。准备好了吗?咱们下一章见。
公众号:蓝海资料掘金营,微信deep3321