K8s部署LLM保姆级教程:从零搭建推理环境
为什么要用K8s部署LLM?
大语言模型(LLM)推理服务对GPU资源需求高,传统单机部署扩容困难。
通过K8s部署LLM,你可以利用容器编排轻松管理GPU节点,实现弹性伸缩、故障自愈和资源隔离。
本文面向零基础用户,用最简洁的步骤在K8s集群中跑通一个LLM推理服务,无需理解底层复杂原理,跟着做就能用。
迈出第一步:你需要准备什么
在开始K8s部署LLM之前,请确保满足以下条件:
- K8s集群:已有可用的K8s集群(版本1.21+),可以用Minikube测试,但生产环境建议使用云厂商托管集群(如ACK、EKS、GKE)或自建集群。
- GPU节点:至少一台装有NVIDIA GPU的节点(如V100、A100、A10等),并安装了NVIDIA驱动(建议>=470)以及
nvidia-docker运行时。 - Kubectl:已安装并配置好
kubectl连接你的集群。 - Helm(可选但推荐):用于快速安装LLM推理框架。
如果你没有K8s集群,可以参考官方文档先搭建一个单节点集群(例如使用kubeadm或minikube)。
下面我们将聚焦在已有集群的基础上,聚焦核心部署步骤。
动手部署:用Helm快速拉起LLM服务
推荐使用Helm Chart来部署当前主流的LLM推理框架,比如vLLM或Ollama。
这里以vLLM为例,因为它适配HuggingFace模型,支持PagedAttention优化显存。
1. 添加Helm仓库并部署vLLM
helm repo add vllm https://vllm.github.io/helm-charts
helm repo update
helm install my-llm vllm/vllm \
--set modelName=Qwen/Qwen2.5-7B-Instruct \
--set resources.requests.gpu=1 \
--set resources.limits.gpu=1
modelName:指定要加载的模型(从HuggingFace拉取),此处以Qwen2.5-7B为例,可根据自己GPU显存调整(7B模型需要约16GB显存)。- GPU资源请求与限制均设为1,确保Pod绑定一张GPU卡。
2. 暴露服务以便外部访问
默认Helm Chart会创建一个ClusterIP服务,你可以通过kubectl port-forward本地测试,或用Ingress/NodePort暴露。
下面是NodePort方式:
kubectl expose deployment my-llm-vllm --type=NodePort --port=8000 --name=llm-service
kubectl get svc | grep llm-service # 查看NodePort映射的端口(如3xxxx)
3. 测试推理API
vLLM启动后提供兼容OpenAI的API,用curl简单测试:
curl http://:/v1/completions \
-H "Content-Type: application/json" \
-d '{"model": "Qwen/Qwen2.5-7B-Instruct", "prompt": "Hello, who are you?", "max_tokens": 50}'
如果返回包含choices的JSON,说明K8s部署LLM成功!
踩坑经验:GPU资源调度常见问题
模型加载OOM(显存不足)
- 表现:Pod启动后一直
CrashLoopBackOff,查看日志提示CUDA out of memory。 - 解决:显式指定更小的模型或设置
--gpu-memory-utilization(vLLM参数),例如在Helm安装时添加--set extraArgs='--gpu-memory-utilization=0.8'。同时确认Pod绑定的GPU卡实际显存足够(7B模型建议>=16GB)。
GPU节点标签未设置
- 问题:Pod调度到无GPU的节点,报
nvidia.com/gpu资源不可用。 - 检查:运行
kubectl describe nodes | grep nvidia查看GPU节点是否有nvidia.com/gpu标签。如果没有,手动打标签:
kubectl label nodes nvidia.com/gpu=present
镜像拉取超时或失败
- 如果部署在中国区,建议添加镜像加速器或拉取国内镜像。vLLM官方镜像较大(约8GB),耐心等待或提前在节点上
docker pull。
跑一轮验证:确认推理服务正常
除了上面的curl测试,还要检查Pod资源使用情况和日志:
kubectl logs -f deployment/my-llm-vllm # 观察模型加载进度
kubectl top pod -l app=my-llm-vllm # 查看GPU显存占用(需要metrics-server)
如果看到类似Starting vLLM server on 0.0.0.0:8000的日志,且每秒响应用户请求,说明K8s部署LLM已稳定运行。
如果你正在处理K8s部署LLM,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分,多数GPU相关报错都能在标签或资源限制里找到原因。
Enjoy your LLM on K8s!