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资源
相关推荐
gs801401 小时前
记一次多 Agent 架构在单节点 K8s 触发的 PID 耗尽与 Pod 驱逐(Evicted)大摸排
容器·架构·kubernetes
bukeyiwanshui1 小时前
20260701 k8s Metric Server
容器·贪心算法·kubernetes
江湖有缘2 小时前
基于Docker环境部署tillywork开源工作管理工具
docker·容器·开源
鸿儒5174 小时前
MR-50国产化GPU docker配置方法
docker·容器·mr
Zhu7585 小时前
在k8s集群部署ApacheHadoop单节点单数据副本
云原生·容器·kubernetes
Akamai中国5 小时前
Akamai收购安全企业浏览器提供商LayerX
人工智能·云原生·云计算·云服务
摇滚侠6 小时前
云原生 Java 架构师的第一课 K8s+Docker+KubeSphere+DevOps 51-60
java·云原生·kubernetes
bukeyiwanshui6 小时前
20260703 K8s ECShop商城项目
云原生·容器·kubernetes
糖果店的幽灵6 小时前
混沌测试从入门到精通(容器与K8s)
云原生·容器·kubernetes