2、环境准备:K8s集群搭建(Minikube/K3s)、GPU节点配置、NVIDIA驱动与CUDA安装

说实话,很多人在vLLM热加载这条路上翻车,十有八九是环境没搭好。我见过太多人花了两天时间调模型,最后发现是驱动版本不对——那种感觉,嗯,挺崩溃的。

这一章,咱们就把地基打牢。你跟着我的节奏走,保证不踩坑。

2.1 选择你的K8s集群:Minikube还是K3s?

先别急着装。你得想清楚,你的实验环境是什么?

  • 本地笔记本或单机开发:选Minikube。它模拟一个完整的K8s集群,调试方便。
  • 边缘节点或资源受限的服务器:选K3s。它轻量,启动快,占内存少。
  • 生产环境:直接上Kubeadm或云厂商托管集群。但咱们教程主要讲实验,所以重点说前两个。

我个人习惯,在本地开发时用Minikube,因为它自带dashboard,看Pod状态一目了然。但如果你机器只有4G内存,我建议你换K3s——Minikube默认就要2G内存,加上vLLM模型加载,很容易OOM。

我的经验: 有一次我在一台2C4G的旧笔记本上跑Minikube,启动后直接卡死。换成K3s后,不仅跑起来了,还能同时跑两个小模型。所以,资源不够时别硬撑。

2.2 安装Minikube(推荐方案)

咱们直接上命令。我假设你用的是Ubuntu 22.04,其他发行版大同小异。

# 1. 安装Docker(Minikube依赖)
sudo apt update
sudo apt install -y docker.io
sudo systemctl enable docker
sudo systemctl start docker

# 2. 下载Minikube二进制
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

# 3. 启动集群(指定驱动为docker)
minikube start --driver=docker --cpus=4 --memory=8192

# 4. 验证
kubectl get nodes

这里有个坑——--cpus--memory参数一定要给够。vLLM加载模型时,CPU要处理tokenizer,GPU要跑推理,内存不够会直接OOM Kill。我建议至少4核8G。

注意: 如果你用的是Windows或macOS,Minikube默认用Hyper-V或HyperKit。但为了GPU透传方便,我强烈建议你在Linux上操作。我曾经在macOS上折腾了三天,最后发现NVIDIA驱动根本过不去——白费功夫。

2.3 安装K3s(轻量备选)

如果你决定用K3s,安装更简单:

curl -sfL https://get.k3s.io | sh -
sudo kubectl get nodes

就两行命令。K3s默认用containerd,不需要额外装Docker。但要注意,K3s默认没有GPU支持,需要手动配置。

我个人觉得,K3s更适合做边缘推理节点。比如你在工厂里部署一个模型,用K3s管理,既轻量又稳定。

2.4 GPU节点配置:核心中的核心

好了,集群起来了。但如果没有GPU,vLLM就是个摆设。接下来咱们配置GPU节点。

先确认你的机器有NVIDIA显卡:

lspci | grep -i nvidia

如果没输出,说明显卡没识别到。检查一下BIOS里是不是禁用了独立显卡。我遇到过一台戴尔工作站,默认用集显,折腾了半天才发现。

2.5 安装NVIDIA驱动

驱动版本很重要。vLLM官方推荐CUDA 12.1以上,所以驱动版本至少要到535。我建议直接用最新的稳定版。

# 1. 添加NVIDIA驱动源
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update

# 2. 查看可用驱动版本
ubuntu-drivers devices

# 3. 安装推荐版本(一般是nvidia-driver-550)
sudo apt install -y nvidia-driver-550

# 4. 重启
sudo reboot

# 5. 验证
nvidia-smi

看到类似下面的输出,就说明驱动装好了:

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 550.54.15    Driver Version: 550.54.15    CUDA Version: 12.4     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  NVIDIA A100 80GB    Off  | 00000000:00:04.0 Off |                    0 |
|  0%   35C    P0    42W / 300W |      0MiB / 81920MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
避坑指南: 我曾经在Ubuntu 20.04上装了nvidia-driver-470,结果vLLM报错说CUDA版本太低。后来换成550,一切正常。所以,别用太老的驱动,至少535起步。

2.6 安装CUDA Toolkit

驱动装好了,但CUDA工具链还没装。vLLM需要CUDA runtime来编译算子。

# 下载CUDA 12.4(推荐)
wget https://developer.download.nvidia.com/compute/cuda/12.4.0/local_installers/cuda_12.4.0_550.54.15_linux.run
sudo sh cuda_12.4.0_550.54.15_linux.run

# 安装时注意:不要勾选Driver(我们已经装过了)
# 只选CUDA Toolkit和CUDA Samples

# 配置环境变量
echo 'export PATH=/usr/local/cuda-12.4/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-12.4/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc

# 验证
nvcc --version

输出应该类似:

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2024 NVIDIA Corporation
Built on Wed_Feb_28_21:13:10_PST_2024
Cuda compilation tools, release 12.4, V12.4.99

2.7 安装NVIDIA Container Toolkit

这一步很多人会忘。K8s里的Pod要访问GPU,必须通过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 update
sudo apt install -y nvidia-container-toolkit

# 配置Docker运行时
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

# 验证(在容器里跑nvidia-smi)
sudo docker run --rm --gpus all nvidia/cuda:12.4.0-base-ubuntu22.04 nvidia-smi

如果看到GPU信息,说明容器能访问GPU了。这一步过了,K8s那边就顺了。

2.8 在K8s中启用GPU支持

最后一步,让K8s认识GPU。我们需要安装NVIDIA Device Plugin。

# 创建DaemonSet
kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.15.0/nvidia-device-plugin.yml

# 验证
kubectl get pods -n kube-system | grep nvidia
kubectl describe node | grep nvidia.com/gpu

如果看到类似nvidia.com/gpu: 1,说明节点上有一个GPU可用。恭喜,环境准备完毕!

我的小技巧: 装完Device Plugin后,可以跑一个测试Pod看看:
kubectl run gpu-test --image=nvidia/cuda:12.4.0-base-ubuntu22.04 -- nvidia-smi
如果日志里能看到GPU信息,就稳了。

2.9 本章知识体系总览

下面这张图,帮你理清整个环境准备的逻辑链条:

环境准备核心流程 选择K8s集群 Minikube / K3s 安装并启动集群 GPU节点配置:安装NVIDIA驱动 + CUDA Toolkit 安装NVIDIA Container Toolkit(容器GPU支持) 部署NVIDIA Device Plugin(K8s识别GPU) ✅ 环境就绪,可以部署vLLM

这张图从左到右,从上到下,就是咱们这一章的全部工作。你按这个顺序来,不会乱。

2.10 验证清单

最后,给你一个自检清单。每完成一项,打个勾:

步骤 命令 预期结果
K8s集群运行 kubectl get nodes 节点状态为Ready
NVIDIA驱动 nvidia-smi 显示GPU型号和驱动版本
CUDA Toolkit nvcc --version 显示CUDA 12.x
容器GPU访问 docker run --gpus all nvidia/cuda nvidia-smi 容器内能识别GPU
K8s GPU资源 kubectl describe node | grep gpu 显示nvidia.com/gpu: 1

全部打勾?好,那咱们的环境就彻底准备好了。下一章,我会带你部署vLLM,并实现模型的热加载。到时候你会发现,前面这些准备工作,每一分钟都值。


公众号:蓝海资料掘金营,微信deep3321