Ubuntu 18.04部署K8s集群后nvidia/k8s-device-plugin:1.9报错求助
看你遇到的报错,核心问题是插件版本和Kubernetes版本不兼容。Kubernetes 1.15.x使用的是Device Plugin API v1beta1,而你用的nvidia/k8s-device-plugin:1.9是针对API v1版本的(这个版本是在K8s 1.16+才引入的),所以会出现unknown service deviceplugin.Registration的错误。下面是具体的解决步骤:
1. 替换为兼容的设备插件版本
针对K8s 1.15.x,你需要使用支持v1beta1 API的插件版本,比如nvidia/k8s-device-plugin:1.0.0-beta6。执行以下命令测试:
docker run --security-opt=no-new-privileges --cap-drop=ALL --network=none -it -v /var/lib/kubelet/device-plugins:/var/lib/kubelet/device-plugins nvidia/k8s-device-plugin:1.0.0-beta6
如果成功的话,你会看到类似Starting to serve on /var/lib/kubelet/device-plugins/nvidia.sock和Registered device plugin with Kubelet的日志。
2. 确认Kubelet的Device Plugin特性门控
虽然K8s 1.10之后Device Plugin特性默认启用,但还是建议检查一下kubelet的启动参数:
- 查看kubelet配置文件(通常在
/etc/systemd/system/kubelet.service.d/10-kubeadm.conf),确认是否包含--feature-gates=DevicePlugins=true - 如果没有,添加这个参数后重启kubelet:
systemctl daemon-reload systemctl restart kubelet
3. 验证nvidia-container-runtime配置
你的/etc/docker/daemon.json配置看起来没问题,但要确保Docker已经重启过,并且默认runtime生效:
docker info | grep Runtime
输出应该包含Default Runtime: nvidia,如果不是的话,重启Docker服务:
systemctl restart docker
4. 用DaemonSet规范部署设备插件
手动运行容器只是临时测试,正式环境推荐用DaemonSet部署,这样插件会自动在所有GPU节点上运行。创建一个yaml文件(比如nvidia-device-plugin.yaml),内容如下:
apiVersion: extensions/v1beta1 kind: DaemonSet metadata: name: nvidia-device-plugin-daemonset namespace: kube-system spec: template: metadata: annotations: scheduler.alpha.kubernetes.io/critical-pod: "" labels: name: nvidia-device-plugin-ds spec: tolerations: - key: node-role.kubernetes.io/master effect: NoSchedule - key: nvidia.com/gpu operator: Exists effect: NoSchedule containers: - image: nvidia/k8s-device-plugin:1.0.0-beta6 name: nvidia-device-plugin-ctr securityContext: allowPrivilegeEscalation: false capabilities: drop: ["ALL"] volumeMounts: - name: device-plugin mountPath: /var/lib/kubelet/device-plugins volumes: - name: device-plugin hostPath: path: /var/lib/kubelet/device-plugins
然后部署:
kubectl apply -f nvidia-device-plugin.yaml
5. 验证GPU可用性
部署完成后,先检查插件pod的状态:
kubectl get pods -n kube-system | grep nvidia
然后创建一个测试pod验证GPU是否能被调度:
apiVersion: v1 kind: Pod metadata: name: gpu-test spec: containers: - name: cuda-container image: nvidia/cuda:10.2-base command: ["nvidia-smi"] resources: limits: nvidia.com/gpu: 1
创建并查看日志:
kubectl create -f gpu-test.yaml kubectl logs gpu-test
如果能正常输出NVIDIA-SMI的信息,说明GPU设备插件已经正常工作了。
内容的提问来源于stack exchange,提问作者Wallace

