K8S节点GPU插件plugin检测GPU排查问题办法

文章目录

  • [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资源识别问题修复报告)

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. 总结

  1. GPU资源识别流程

    • 通过在Pod中明确请求GPU资源(nvidia.com/gpu: 1
    • 确认Pod能够成功调度并运行
    • 在Pod内执行nvidia-smi验证GPU可用性
  2. 常见问题排查

    • 检查节点污点是否阻碍调度
    • 确认nvidia-device-plugin正常运行
    • 验证kubelet与containerd的集成配置
    • 确保GPU设备文件权限正确
  3. 最佳实践

    • 使用长时间运行的Pod进行验证(sleep命令)
    • 始终使用正确的kubeconfig路径
    • 在生产环境中保持节点标签和污点配置的一致性

现在您的Kubernetes集群已经完全准备好运行GPU工作负载了!

K8S GPU资源识别问题修复报告

一、问题背景

在Kubernetes集群中,GPU资源未被正确识别和调度,导致GPU工作负载无法正常运行。具体表现为:

  • 节点上的GPU资源未被Kubernetes集群发现
  • 尝试创建使用GPU资源的Pod时无法正常调度或运行
  • 需要验证GPU驱动、容器运行时和Kubernetes插件的正确配置

二、问题原因分析

通过排查,发现问题由多个因素共同导致:

  1. 基础环境配置不完整

    • NVIDIA驱动和CUDA可能存在版本兼容性问题
    • containerd运行时配置中缺少对NVIDIA容器的支持
  2. Kubernetes配置问题

    • kubelet配置中未正确启用GPU资源监控
    • 缺少必要的NVIDIA设备插件部署或插件配置不当
  3. 节点调度限制

    • 节点上可能存在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识别问题的关键措施包括:

  1. 配置containerd支持NVIDIA容器:通过修改containerd配置文件,添加nvidia-container-runtime支持,确保容器可以访问宿主机的GPU资源。

  2. 更新kubelet配置:修正kubelet的container-runtime-endpoint配置,确保kubelet能够正确与containerd通信并发现GPU资源。

  3. 部署特权模式的NVIDIA设备插件:应用特权模式的nvidia-device-plugin-daemonset,使Kubernetes能够识别和管理节点上的GPU资源。

  4. 处理节点调度限制:检查并移除可能影响Pod调度的节点污点,确保GPU工作负载能够正常调度到GPU节点上。

  5. 验证与测试:通过创建测试Pod并在其中运行nvidia-smi命令,确认GPU资源已被正确识别和使用。

五、验证结果

修复完成后,系统成功识别了节点上的NVIDIA A800 80GB PCIe GPU资源,并能够在Kubernetes Pod中正确使用。nvidia-smi命令成功返回GPU信息,显示驱动版本580.95.05,CUDA版本13.0,显存使用正常。

六、最佳实践建议

  1. 在创建使用GPU的Pod时,始终在resources.limits中指定nvidia.com/gpu的数量
  2. 定期检查NVIDIA驱动、CUDA和Kubernetes插件的版本兼容性
  3. 监控节点上的磁盘空间,避免出现disk-pressure污点
  4. 对于生产环境,考虑使用节点亲和性规则将GPU工作负载定向到具有GPU的节点
  5. 定期验证GPU资源的可用性,确保Kubernetes集群能够持续正确识别和管理GPU资源
相关推荐
究極の法則に通じた野犬1 小时前
K8S定位POD启动失败问题- status Unknown
云原生·容器·kubernetes
5***o5003 小时前
JavaScript云原生
开发语言·javascript·云原生
mr_orange_klj4 小时前
K8S多环境配置的AI问答
云原生·容器·kubernetes
幻灭行度4 小时前
docker镜像导入到K8S的containerd中
java·docker·kubernetes
腾讯数据架构师4 小时前
海光dcu 虚拟化适配
云原生·kubernetes·mlops·dcu·海光·cube studio·vdcu
1***Q7845 小时前
MCP在分布式计算中的任务调度
贪心算法·kubernetes·mojo
iru7 小时前
kubectl cp详解,k8s集群与本地环境文件拷贝
运维·容器·k8s
victory043116 小时前
K8S containerd 打包镜像和部署流程和注意事项
云原生·容器·kubernetes
醇氧16 小时前
Mac 安装 Docker Desktop
macos·docker·容器