环境准备:K8s集群搭建与GPU节点配置

说实话,很多人在vLLM部署上栽跟头,不是因为模型本身多复杂,而是环境没搭好。我见过太多人花了两天配环境,最后发现是驱动版本不对——这种坑,咱们今天一次性填平。

这一章,咱们把地基打牢。K8s集群、GPU节点、驱动、CUDA、容器运行时,一个都不能少。

1. K8s集群搭建:Minikube还是K3s?

我个人习惯,本地开发用Minikube,生产环境或者资源受限的机器用K3s。为什么?

  • Minikube:功能完整,跟生产K8s几乎一致。适合你完整模拟部署流程。
  • K3s:轻量,占用内存小。适合单机或者边缘场景。

咱们这次实战,我建议用K3s。原因很简单——vLLM推理本身就很吃显存,你不想让K8s组件再抢走太多内存吧?

我的选择:K3s + containerd。这套组合在资源占用上最友好。

安装K3s(带GPU支持)

curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--docker" sh -

等等,这里有个坑。默认K3s用containerd作为运行时,但如果你后续要装nvidia-container-toolkit,我建议直接用--docker参数。我在项目中遇到过,用containerd时nvidia插件配置起来比docker麻烦不少。

装完后,检查一下:

sudo k3s kubectl get nodes

看到节点Ready,就说明集群起来了。

2. GPU节点配置:驱动与CUDA安装

嗯,这里要注意。GPU节点配置是整个环境准备里最容易出问题的环节。我踩过的坑,今天全告诉你。

2.1 NVIDIA驱动安装

先查你的显卡型号:

lspci | grep -i nvidia

然后去NVIDIA官网下载对应驱动。我个人习惯用runfile安装,因为可控性高。

chmod +x NVIDIA-Linux-x86_64-*.run
sudo ./NVIDIA-Linux-x86_64-*.run

装完后验证:

nvidia-smi

如果看到GPU列表,驱动就装好了。我曾经在一台T4机器上装驱动,死活不识别,最后发现是Secure Boot没关——你想想看,这种问题查起来多浪费时间。

避坑指南:安装驱动前,先关闭Secure Boot。否则驱动加载不了,nvidia-smi会报"No devices were found"。

2.2 CUDA安装

vLLM需要CUDA 11.8以上。我建议装CUDA 12.1,兼容性最好。

wget https://developer.download.nvidia.com/compute/cuda/12.1.0/local_installers/cuda_12.1.0_530.30.02_linux.run
sudo sh cuda_12.1.0_530.30.02_linux.run

安装时注意:不要装驱动(如果你已经装过了),只选CUDA Toolkit。

配环境变量:

export PATH=/usr/local/cuda-12.1/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-12.1/lib64:$LD_LIBRARY_PATH

验证:

nvcc --version

3. Container Runtime配置:让K8s认识GPU

集群有了,驱动有了,但K8s还不知道你的GPU在哪。这一步就是搭桥。

3.1 安装nvidia-container-toolkit

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit

3.2 配置containerd(K3s默认运行时)

如果你用K3s且没加--docker参数,需要手动配置containerd:

sudo nvidia-ctk runtime configure --runtime=containerd
sudo systemctl restart containerd

然后重启K3s:

sudo systemctl restart k3s

3.3 验证GPU是否被K8s识别

kubectl describe node | grep -i nvidia

如果看到类似这样的输出,就说明K8s已经认识你的GPU了:

nvidia.com/gpu: 1
nvidia.com/gpu: 1
小技巧:如果没看到nvidia.com/gpu,检查一下kubelet的日志。我遇到过好几次,都是因为nvidia-container-toolkit版本跟containerd不匹配。

4. 核心逻辑一览

这一整套流程,说白了就是三层递进:

  1. 硬件层:驱动让操作系统认识GPU
  2. 运行时层:nvidia-container-toolkit让容器认识GPU
  3. 编排层:K8s device plugin让调度器认识GPU

下面这张图,帮你理清整个关系:

硬件层 NVIDIA GPU + 驱动 (nvidia-smi) 操作系统识别GPU设备 运行时层 nvidia-container-toolkit 容器运行时(containerd/docker)识别GPU 编排层 K8s Device Plugin + 调度器 Pod申请GPU资源,调度到对应节点 驱动安装 运行时配置 设备注册

5. 验证全链路

最后,跑一个测试Pod,确认GPU能在K8s里正常工作:

cat <

查看日志:

kubectl logs gpu-test

如果看到GPU信息,恭喜你——环境准备全部完成。

总结一下:驱动→CUDA→nvidia-container-toolkit→K8s device plugin。每一步都验证通过,再往下走。别跳步,跳步必踩坑。

好了,环境就绪。接下来就可以真正开始部署vLLM了。

专注资料整理

专注资料整理