文章目录
- [contianerd 排查办法](#contianerd 排查办法)
- [K8S GPU 识别检测](#K8S GPU 识别检测)
-
- Kubernetes集群GPU资源验证与配置报告
-
- [1. GPU可用性验证结果](#1. GPU可用性验证结果)
- [2. POD检测GPU可用情况的通用路径](#2. POD检测GPU可用情况的通用路径)
-
- [步骤1: 创建测试Pod配置文件](#步骤1: 创建测试Pod配置文件)
- [步骤2: 应用Pod配置](#步骤2: 应用Pod配置)
- [步骤3: 等待Pod启动并验证状态](#步骤3: 等待Pod启动并验证状态)
- [步骤4: 在Pod中执行nvidia-smi命令验证GPU](#步骤4: 在Pod中执行nvidia-smi命令验证GPU)
- [3. 节点污点管理与解除方式](#3. 节点污点管理与解除方式)
-
- [3.1 查看节点污点](#3.1 查看节点污点)
- [3.2 解除特定污点](#3.2 解除特定污点)
- [3.3 常见污点类型及处理](#3.3 常见污点类型及处理)
- [4. 确保GPU资源正确识别的关键配置](#4. 确保GPU资源正确识别的关键配置)
-
- [4.1 确保nvidia-device-plugin正常运行](#4.1 确保nvidia-device-plugin正常运行)
- [4.2 验证kubelet配置正确](#4.2 验证kubelet配置正确)
- [5. 总结](#5. 总结)
- [K8S GPU资源识别问题修复报告](#K8S GPU资源识别问题修复报告)
-
- 一、问题背景
- 二、问题原因分析
- 三、解决思路与实施步骤
-
- [1. 基础环境验证与修复](#1. 基础环境验证与修复)
- [2. Kubernetes配置修复](#2. Kubernetes配置修复)
- [3. NVIDIA设备插件部署](#3. NVIDIA设备插件部署)
- [4. 节点调度问题处理](#4. 节点调度问题处理)
- [5. 验证GPU资源识别与使用](#5. 验证GPU资源识别与使用)
- 四、关键修复措施总结
- 五、验证结果
- 六、最佳实践建议
contianerd 排查办法
运行命令
containerd 容器检测命令
bash
sudo ctr run --rm --gpus 0 swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nvidia/cuda:12.1.1-base-ubuntu22.04 gpu-test nvidia-smi
若输出GPU状态表格说明containerd 的GPU插件nvidia-contianerd-toolkit层可以正确识别到GPU。然后开始上层K8S能否识别的GPU的检测。
K8S GPU 识别检测
让我更新测试pod的镜像并重新应用配置,然后进入pod验证GPU可用性。
toolName: edit_file_update
status: success
filePath: /home/user/gpu-test-pod.yaml
changes:
newStr: image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nvidia/cuda:11.1.1-base
oldStr: image: nvidia/cuda:11.4.0-base
已更新镜像。现在让我应用这个配置并查看pod状态。
toolName: run_command
status: success
command: sudo kubectl --kubeconfig=/etc/kubernetes/admin.conf apply -f /home/user/gpu-test-pod.yaml undefined
已应用配置。让我等待一下,然后查看pod的状态,确认它是否成功运行。
toolName: run_command
status: success
command: sleep 10 && sudo kubectl --kubeconfig=/etc/kubernetes/admin.conf get pod gpu-test -o wide undefined
Pod已完成运行。我需要修改pod配置,让它保持运行状态以便我们进入其中。
toolName: edit_file_update
status: success
filePath: /home/user/gpu-test-pod.yaml
changes:
newStr: command: ["sleep"]
args: ["3600"]
oldStr: command: ["nvidia-smi"]
已修改pod配置为长时间运行。现在重新应用配置并等待pod启动。
toolName: run_command
status: success
command: sudo kubectl --kubeconfig=/etc/kubernetes/admin.conf apply -f /home/user/gpu-test-pod.yaml && sleep 10 && sudo kubectl --kubeconfig=/etc/kubernetes/admin.conf get pod gpu-test -o wide undefined
Pod更新失败,因为Kubernetes不允许直接修改command和args。让我先删除旧pod,然后重新创建。
toolName: run_command
status: success
command: sudo kubectl --kubeconfig=/etc/kubernetes/admin.conf delete pod gpu-test && sudo kubectl --kubeconfig=/etc/kubernetes/admin.conf apply -f /home/user/gpu-test-pod.yaml undefined
Pod已重新创建。让我等待pod启动,然后进入其中运行nvidia-smi命令。
toolName: run_command
status: success
command: sleep 15 && sudo kubectl --kubeconfig=/etc/kubernetes/admin.conf get pod gpu-test -o wide && echo '=== RUNNING NVIDIA-SMI ===' && sudo kubectl --kubeconfig=/etc/kubernetes/admin.conf exec -it gpu-test -- nvidia-smi undefined
Kubernetes集群GPU资源验证与配置报告
1. GPU可用性验证结果
✅ GPU资源识别成功! 通过在Pod中运行nvidia-smi命令,我们成功验证了GPU资源在Kubernetes集群中可用:
- GPU型号: NVIDIA A800 80GB PCIe
- 驱动版本: 580.95.05
- CUDA版本: 13.0
- 内存容量: 81920MiB (80GB)
- 当前状态: 正常运行,GPU利用率0%
2. POD检测GPU可用情况的通用路径
步骤1: 创建测试Pod配置文件
yaml
apiVersion: v1
kind: Pod
metadata:
name: gpu-test
spec:
containers:
- name: cuda-container
image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nvidia/cuda:11.1.1-base
command: ["sleep"]
args: ["3600"] # 保持Pod运行1小时
resources:
limits:
nvidia.com/gpu: 1 # 请求1个GPU
restartPolicy: OnFailure
步骤2: 应用Pod配置
bash
# 使用正确的kubeconfig路径应用配置
sudo kubectl --kubeconfig=/etc/kubernetes/admin.conf apply -f gpu-test-pod.yaml
步骤3: 等待Pod启动并验证状态
bash
# 检查Pod状态,确保Running状态
sudo kubectl --kubeconfig=/etc/kubernetes/admin.conf get pod gpu-test -o wide
步骤4: 在Pod中执行nvidia-smi命令验证GPU
bash
# 进入Pod执行nvidia-smi
sudo kubectl --kubeconfig=/etc/kubernetes/admin.conf exec -it gpu-test -- nvidia-smi
3. 节点污点管理与解除方式
3.1 查看节点污点
bash
# 检查节点上的污点配置
sudo kubectl --kubeconfig=/etc/kubernetes/admin.conf describe node <node-name> | grep -A 5 Taints
3.2 解除特定污点
bash
# 解除disk-pressure污点示例
sudo kubectl --kubeconfig=/etc/kubernetes/admin.conf taint nodes <node-name> node.kubernetes.io/disk-pressure:NoSchedule-
3.3 常见污点类型及处理
| 污点类型 | 说明 | 处理方法 |
|---|---|---|
node.kubernetes.io/disk-pressure |
磁盘压力 | 清理磁盘空间或临时解除污点 |
node.kubernetes.io/memory-pressure |
内存压力 | 释放内存资源或临时解除污点 |
node.kubernetes.io/not-ready |
节点未就绪 | 检查节点状态,修复后自动解除 |
nvidia.com/gpu |
GPU专用污点 | 通常用于确保只有GPU工作负载调度到该节点 |
4. 确保GPU资源正确识别的关键配置
4.1 确保nvidia-device-plugin正常运行
bash
# 检查nvidia-device-plugin状态
sudo kubectl --kubeconfig=/etc/kubernetes/admin.conf get pods -n kube-system | grep nvidia
4.2 验证kubelet配置正确
bash
# 检查kubelet配置中的容器运行时端点
sudo cat /var/lib/kubelet/config.yaml | grep containerRuntimeEndpoint
确保配置为:
yaml
containerRuntimeEndpoint: unix:///run/containerd/containerd.sock
5. 总结
-
GPU资源识别流程:
- 通过在Pod中明确请求GPU资源(
nvidia.com/gpu: 1) - 确认Pod能够成功调度并运行
- 在Pod内执行
nvidia-smi验证GPU可用性
- 通过在Pod中明确请求GPU资源(
-
常见问题排查:
- 检查节点污点是否阻碍调度
- 确认nvidia-device-plugin正常运行
- 验证kubelet与containerd的集成配置
- 确保GPU设备文件权限正确
-
最佳实践:
- 使用长时间运行的Pod进行验证(sleep命令)
- 始终使用正确的kubeconfig路径
- 在生产环境中保持节点标签和污点配置的一致性
现在您的Kubernetes集群已经完全准备好运行GPU工作负载了!
K8S GPU资源识别问题修复报告
一、问题背景
在Kubernetes集群中,GPU资源未被正确识别和调度,导致GPU工作负载无法正常运行。具体表现为:
- 节点上的GPU资源未被Kubernetes集群发现
- 尝试创建使用GPU资源的Pod时无法正常调度或运行
- 需要验证GPU驱动、容器运行时和Kubernetes插件的正确配置
二、问题原因分析
通过排查,发现问题由多个因素共同导致:
-
基础环境配置不完整:
- NVIDIA驱动和CUDA可能存在版本兼容性问题
- containerd运行时配置中缺少对NVIDIA容器的支持
-
Kubernetes配置问题:
- kubelet配置中未正确启用GPU资源监控
- 缺少必要的NVIDIA设备插件部署或插件配置不当
-
节点调度限制:
- 节点上可能存在disk-pressure污点影响Pod调度
三、解决思路与实施步骤
1. 基础环境验证与修复
首先验证NVIDIA驱动和相关组件的安装状态:
bash
# 验证NVIDIA驱动安装
nvidia-smi
# 验证CUDA版本
nvcc --version
# 验证nvidia-container-runtime安装
dpkg -l | grep nvidia-container
修复containerd配置以支持GPU容器:
bash
# 检查并修改containerd配置
cat /etc/containerd/config.toml
# 确保配置包含NVIDIA运行时
sudo tee /etc/containerd/config.toml > /dev/null <<EOF
version = 2
debug = false
gRPC = {
address = "/run/containerd/containerd.sock"
}
[runtimes]
[runtimes.runc]
runtime_type = "io.containerd.runc.v2"
[runtimes.nvidia]
runtime_type = "io.containerd.runc.v2"
[runtimes.nvidia.options]
BinaryName = "/usr/bin/nvidia-container-runtime"
EOF
# 重启containerd服务
sudo systemctl restart containerd
2. Kubernetes配置修复
更新kubelet配置以正确识别GPU资源:
bash
# 检查kubelet配置
sudo systemctl status kubelet
# 修复kubelet配置,添加对GPU资源的支持
sudo cp /etc/kubernetes/kubelet.conf /etc/kubernetes/kubelet.conf.bak
sudo sed -i 's/--container-runtime=remote/--container-runtime=remote --container-runtime-endpoint=unix:\/\/\/run\/containerd\/containerd.sock/g' /var/lib/kubelet/kubeadm-flags.env
# 重启kubelet服务
sudo systemctl daemon-reload
sudo systemctl restart kubelet
3. NVIDIA设备插件部署
应用特权模式的NVIDIA设备插件配置:
bash
# 创建并应用NVIDIA设备插件YAML
sudo tee /home/user/nvidia-device-plugin.yaml > /dev/null <<EOF
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nvidia-device-plugin-daemonset
namespace: kube-system
spec:
selector:
matchLabels:
name: nvidia-device-plugin-ds
updateStrategy:
type: RollingUpdate
template:
metadata:
labels:
name: nvidia-device-plugin-ds
spec:
tolerations:
- key: nvidia.com/gpu
operator: Exists
effect: NoSchedule
containers:
- image: nvidia/k8s-device-plugin:v0.9.0
name: nvidia-device-plugin-ctr
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: ["ALL"]
privileged: true
volumeMounts:
- name: device-plugin
mountPath: /var/lib/kubelet/device-plugins
- name: dev
mountPath: /dev
- name: nvidia
mountPath: /var/lib/nvidia
volumes:
- name: device-plugin
hostPath:
path: /var/lib/kubelet/device-plugins
- name: dev
hostPath:
path: /dev
- name: nvidia
hostPath:
path: /var/lib/nvidia
EOF
# 应用设备插件配置
sudo kubectl --kubeconfig=/etc/kubernetes/admin.conf apply -f /home/user/nvidia-device-plugin.yaml
4. 节点调度问题处理
检查并修复节点上的污点,确保Pod可以正常调度:
bash
# 检查节点状态
sudo kubectl --kubeconfig=/etc/kubernetes/admin.conf get nodes
# 检查节点详细信息,包括污点和资源
sudo kubectl --kubeconfig=/etc/kubernetes/admin.conf describe node 10-16-233-177
# 检查节点污点
sudo kubectl --kubeconfig=/etc/kubernetes/admin.conf describe node 10-16-233-177 | grep -A 5 Taints
# 尝试解除disk-pressure污点(如果存在)
sudo kubectl --kubeconfig=/etc/kubernetes/admin.conf taint nodes 10-16-233-177 node.kubernetes.io/disk-pressure:NoSchedule-
5. 验证GPU资源识别与使用
创建GPU测试Pod并验证GPU是否可用:
yaml
# GPU测试Pod配置 (/home/user/gpu-test-pod.yaml)
apiVersion: v1
kind: Pod
metadata:
name: gpu-test
spec:
containers:
- name: cuda-container
image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nvidia/cuda:11.1.1-base
command: ["sleep"]
args: ["3600"]
resources:
limits:
nvidia.com/gpu: 1
restartPolicy: OnFailure
应用并验证:
bash
# 应用GPU测试Pod
sudo kubectl --kubeconfig=/etc/kubernetes/admin.conf apply -f /home/user/gpu-test-pod.yaml
# 检查Pod状态
sudo kubectl --kubeconfig=/etc/kubernetes/admin.conf get pod gpu-test -o wide
# 在Pod中运行nvidia-smi验证GPU可用性
sudo kubectl --kubeconfig=/etc/kubernetes/admin.conf exec -it gpu-test -- nvidia-smi
四、关键修复措施总结
成功修复K8S GPU识别问题的关键措施包括:
-
配置containerd支持NVIDIA容器:通过修改containerd配置文件,添加nvidia-container-runtime支持,确保容器可以访问宿主机的GPU资源。
-
更新kubelet配置:修正kubelet的container-runtime-endpoint配置,确保kubelet能够正确与containerd通信并发现GPU资源。
-
部署特权模式的NVIDIA设备插件:应用特权模式的nvidia-device-plugin-daemonset,使Kubernetes能够识别和管理节点上的GPU资源。
-
处理节点调度限制:检查并移除可能影响Pod调度的节点污点,确保GPU工作负载能够正常调度到GPU节点上。
-
验证与测试:通过创建测试Pod并在其中运行nvidia-smi命令,确认GPU资源已被正确识别和使用。
五、验证结果
修复完成后,系统成功识别了节点上的NVIDIA A800 80GB PCIe GPU资源,并能够在Kubernetes Pod中正确使用。nvidia-smi命令成功返回GPU信息,显示驱动版本580.95.05,CUDA版本13.0,显存使用正常。
六、最佳实践建议
- 在创建使用GPU的Pod时,始终在resources.limits中指定nvidia.com/gpu的数量
- 定期检查NVIDIA驱动、CUDA和Kubernetes插件的版本兼容性
- 监控节点上的磁盘空间,避免出现disk-pressure污点
- 对于生产环境,考虑使用节点亲和性规则将GPU工作负载定向到具有GPU的节点
- 定期验证GPU资源的可用性,确保Kubernetes集群能够持续正确识别和管理GPU资源