GPU Device-Plugin相关操作

GPU设备插件(GPU Device-Plugin)是Kubernetes集群中用于管理每个节点的GPU的组件,使得Kubernetes能够更方便、高效地利用GPU资源。本文介绍在独占GPU调度场景下,如何对节点的GPU Device-Plugin进行升级、重启、GPU设备隔离、版本查看与更新等操作。

升级GPU Device-Plugin

升级GPU Device-Plugin前,请确保您的集群版本在1.201.31之间。如需升级集群,请参见手动升级集群

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点管理 > 节点

  3. 选中需要批量维护的GPU节点,在节点列表下方单击批量运维,然后在批量运维对话框选择执行shell命令,单击确定

    重要

    建议先选择少量GPU节点进行升级,操作完成验证节点device plugin正常工作后,再大批量操作。

  4. 在自动跳转的OOS界面,选择执行模式失败暂停后,单击下一步:参数设置

  5. 在设置参数页面,选择运行shell脚本,并粘贴如下示例脚本。

    说明

    脚本中RUN_PKG_VERSION参数需修改为集群对应的大版本号(例如:1.30)。请勿填入小版本号(例如:1.30.1),否则会导致脚本报错。

    #!/bin/bash
    set -e
    
    RUN_PKG_VERSION=1.30
    
    function update_device_plugin() {
    	base_dir=/tmp/update_device_plugin
    	rm -rf $base_dir
    	mkdir -p $base_dir
    	cd $base_dir
    	region_id=$(curl -ssL 100.100.100.200/latest/meta-data/region-id  2> /dev/null || echo "")
    	if [[ $region_id == "" ]];then
    		echo "Error: failed to get region id,region id is null"
    		exit 1
    	fi
    	PKG_URL=https://aliacs-k8s-${region_id}.oss-${region_id}.aliyuncs.com/public/pkg/run/run-${RUN_PKG_VERSION}.tar.gz
    	curl -sSL --retry 3 --retry-delay 2 -o run.tar.gz $PKG_URL
    	tar -xf run.tar.gz
    
    	local dir=pkg/run/$RUN_PKG_VERSION/module
    	sed -i "s@registry.cn-hangzhou.aliyuncs.com/acs@registry-${region_id}-vpc.ack.aliyuncs.com/acs@g" $dir/nvidia-device-plugin.yml
    	mkdir -p /etc/kubernetes/device-plugin-backup
    	mkdir -p /etc/kubernetes/manifests
    	mv  /etc/kubernetes/manifests/nvidia-device-plugin.yml /etc/kubernetes/device-plugin-backup/nvidia-device-plugin.yml.$(date +%s)
    	sleep 2
    	cp -a $dir/nvidia-device-plugin.yml /etc/kubernetes/manifests
    	echo "succeeded to update device plugin"
    }
    
    if [ -f /etc/kubernetes/manifests/nvidia-device-plugin.yml ];then
    	update_device_plugin
    else
    	echo "skip to update device plugin"
    fi
  6. 单击下一步:确定,确认信息无误后单击创建

    创建后自动跳转至任务执行管理页面,可查看任务运行状态。查看执行输出succeeded to update device plugin,表明更新成功。

  7. 执行如下命令,查看GPU节点上Device Plugin是否正常工作。

    kubectl get nodes <NODE_NAME> -o jsonpath='{.metadata.name} ==> nvidia.com/gpu: {.status.allocatable.nvidia\.com/gpu}'

    预期输出:

    cn-hangzhou.172.16.XXX.XX ==> nvidia.com/gpu: 1

    GPU节点上报的nvidia.com/gpu扩展资源不为0,说明Device Plugin正常工作。

重启GPU Device-Plugin

ACK的独占GPU调度场景下,节点上GPU的设备上报的Device Plugin默认以一个Static Pod的形式部署,所以重启过程需要在目标节点上进行。

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点管理 > 节点

  3. 选中需要批量维护的GPU节点,在节点列表下方单击批量运维,然后在批量运维对话框选择执行shell命令,单击确定

    重要

    建议先选择少量GPU节点进行重启,操作完成验证节点device plugin正常工作后,再大批量操作。

  4. 在自动跳转的OOS界面,选择执行模式失败暂停后,单击下一步:参数设置

  5. 在设置参数页面,选择运行shell脚本,并粘贴如下示例脚本。

    #!/bin/bash
    set -e
    
    if [ -f /etc/kubernetes/manifests/nvidia-device-plugin.yml ];then
    	cp -a /etc/kubernetes/manifests/nvidia-device-plugin.yml /etc/kubernetes
    	rm -rf /etc/kubernetes/manifests/nvidia-device-plugin.yml
    	sleep 2
    	mv /etc/kubernetes/nvidia-device-plugin.yml /etc/kubernetes/manifests
    	echo "the nvidia device is restarted"
    else
    	echo "no need to restart nvidia device plugin"
    fi
  6. 单击下一步:确定,确认信息无误后单击创建。创建后自动跳转至任务执行管理页面,可查看任务运行状态。

  7. 执行如下命令,查看GPU节点上Device Plugin是否正常工作。

    kubectl get nodes <NODE_NAME> -o jsonpath='{.metadata.name} ==> nvidia.com/gpu: {.status.allocatable.nvidia\.com/gpu}'

    预期输出:

    cn-hangzhou.172.16.XXX.XX ==> nvidia.com/gpu: 1

    GPU节点上报的nvidia.com/gpu扩展资源不为0,说明Device Plugin正常工作。

GPU设备隔离

重要

GPU设备隔离操作仅支持在nvidia-device-pluginv0.9.1及以上版本中使用。您可以参见下文查看GPU Device-Plugin版本

ACK的独占GPU调度场景下,出于某些原因(例如GPU设备故障等),您需要隔离节点上的某个GPU设备,ACK提供了一个机制供您手动对节点上的某个设备进行隔离,以避免新的GPU应用Pod被分配到这张GPU卡。具体的操作方式如下:

在目标节点/etc/nvidia-device-plugin/的目录下操作unhealthyDevices.json这个文件,如果此文件不存在,请新建此文件。unhealthyDevices.json的文件格式请按照以下JSON格式编排。

{
 "index": ["x", "x" ..],
 "uuid": ["xxx", "xxx" ..]
}

您可以根据个人偏好,在JSON中填写目标隔离设备的indexuuid(同一个设备只需填写任意一个),保存文件后即可自动生效。

设置完成后,您可以通过查看Kubernetes Node上报的Resource中的nvidia.com/gpu资源的数量以查看隔离的效果。

查看GPU Device-Plugin版本

您可以在目标节点上/etc/kubernetes/manifests/nvidia-device-plugin.yml文件中查看的device-plugin的镜像Tag,其所代表的版本号即为Device-Plugin的版本。目前ACK所支持的最新的版本为v0.9.3-0dd4d5f5-aliyun

GPU Device-Plugin修改Device CheckpointKey

Device-Plugin在为Pod分配设备时会在节点上创建一份Checkpoint文件,用于记录和保存哪些设备已经被分配,以及它们对应Pod的信息。在NVIDIA GPU Device-Plugin中,Checkpoint文件默认使用GPUUUID作为每个GPU设备的唯一标识符(Key)。您可以参见下文将该Key修改为设备的Index,以解决VM冷迁移导致的UUID丢失等问题。

  1. 在目标节点上的/etc/kubernetes/manifests/nvidia-device-plugin.yml文件中查看Device-Plugin的镜像Tag,其所代表的版本号即为Device-Plugin的版本。如果版本号大于等于0.9.3,则无需修改版本号,否则请将版本号修改为最新的版本号v0.9.3-0dd4d5f5-aliyun

  2. 修改/etc/kubernetes/manifests/nvidia-device-plugin.yml文件中的Static Pod的环境变量,参见以下代码增加一个环境变量CHECKPOINT_DEVICE_ID_STRATEGY

        env:
          - name: CHECKPOINT_DEVICE_ID_STRATEGY
            value: index
  3. 参见本文档中的重启GPU Device-Plugin对该节点上的GPU Device-Plugin进行重启,使得修改内容生效。

相关文档