K8s集群接入边缘GPU算力:从节点准备到任务验证
在K8s集群里调用边缘节点的GPU算力,核心是让节点上的GPU被容器运行时识别,再由device plugin上报给调度器。
本文按零基础可执行的顺序,走一遍从环境检查到跑通测试Pod的完整流程。
先确认硬件和系统条件
边缘节点通常分布在机房外或靠近数据源的位置,网络和供电不如中心机房稳定,操作前先确认以下条件:
- 节点已安装与GPU型号匹配的NVIDIA驱动,执行
nvidia-smi能看到显卡和驱动版本。 - 节点已加入现有K8s集群,
kubectl get nodes状态为Ready。 - 容器运行时使用 containerd 或 Docker,版本需支持
nvidia-container-runtime。 - 边缘节点与集群控制面网络互通,能拉取镜像仓库。
如果 nvidia-smi 报错,先解决驱动问题,不要继续配置K8s。
配置容器运行时识别GPU
以 containerd 为例,先安装 NVIDIA Container Toolkit,然后修改配置文件。
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=containerd
sudo systemctl restart containerd
配置文件路径通常在 /etc/containerd/config.toml,确认其中包含 nvidia runtime 的配置。
完成后用下面的命令验证容器能否看到GPU:
docker run --rm --gpus all nvidia/cuda:12.0-base nvidia-smi
如果使用 containerd 自带命令行,可改用 ctr 运行等价测试。
输出中应显示与宿主机一致的GPU信息。
部署设备插件并调度GPU任务
节点识别GPU后,需要部署 NVIDIA device plugin,让K8s把 nvidia.com/gpu 作为可调度资源上报。
kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.14.0/nvidia-device-plugin.yml
kubectl get pods -n kube-system | grep nvidia
插件Pod运行正常后,查看节点资源:
kubectl describe node <节点名称> | grep nvidia.com/gpu
如果显示 nvidia.com/gpu: 1 或更多,说明资源已注册。
接着创建一个申请GPU的测试Pod:
apiVersion: v1
kind: Pod
metadata:
name: gpu-test
spec:
containers:
- name: cuda
image: nvidia/cuda:12.0-base
command: ["nvidia-smi"]
resources:
limits:
nvidia.com/gpu: 1
restartPolicy: Never
保存为 gpu-test.yaml 后执行 kubectl apply -f gpu-test.yaml,再用 kubectl logs gpu-test 查看输出。
能看到GPU信息即表示边缘GPU算力已接入集群。
常见报错与避坑点
- Pod一直Pending:先检查节点是否有可分配GPU,
kubectl describe pod看事件里是否提示资源不足。 - 驱动版本与CUDA镜像不兼容:镜像内CUDA版本不能高于宿主机驱动支持的上限,选镜像前查兼容表。
- 边缘节点重启后GPU消失:确认驱动和容器运行时随系统自启,必要时写systemd单元。
- 多节点GPU型号不一致:调度时用nodeSelector或污点区分,避免任务跑到算力不足的节点。
- 网络不稳定导致镜像拉取失败:边缘节点可配置本地镜像缓存或私有仓库。
验证与后续建议
跑通测试Pod后,建议再部署一个真实推理任务,观察 kubectl top pod 和 nvidia-smi 的显存占用是否正常。
如果边缘节点数量增加,可以考虑用节点标签和亲和性策略把GPU任务固定到指定边缘机房。
整个流程的关键是驱动、运行时、device plugin三层都正常,缺一层都会导致GPU无法被调度。
常见疑问
GPU节点加入集群后,为什么Pod申请了GPU还是调度失败?
常见原因是device plugin未正常运行,或节点资源未上报。
先查 kubectl get pods -n kube-system 中插件状态,再看节点描述里的GPU数量。
边缘节点断网后GPU任务会怎样?
已运行的Pod通常继续运行,但控制面无法管理该节点。
恢复网络后节点会重新同步状态,期间新任务不会调度到该节点。
是否所有K8s版本都支持GPU调度?
GPU调度依赖device plugin机制,较新的K8s版本普遍支持,但具体兼容性需对照所用K8s版本和插件版本的发布说明。