Nvidia Device PLugin工作原理机制

我们在k8s使用英伟达GPU时想让POD自动挂载我们需要部署nvidia-device-plugin组件,如何部署使用可以查看我之前的笔记:https://sulao.cn/post/978.html

英伟达的device plugin组件主要在整个工作过程中做了如下工作

1.device server的启动和注册

device server在启动的时候会检测/var/lib/kubelet/device-plugins/kubelet.sock文件,如果该文件存在,那么device server会通过该sock文件向kubelet注册信息。

2.device的分配

kubelet接收到被调度到本节点的pods后,lifecycle.PodAdmitHandler会对pods做一些判断,如evictionAdmitHandler:当节点有内存压力时,拒绝创建best effort的pod,还有其它条件先略过;TopologyPodAdmitHandler:拒绝创建因为Topology locality冲突而无法分配资源的pod。

3.device的使用

在kubelet的GetResource中,会调用DeviceManager的GetDeviceRunContainerOptions,并将这些options添加到kubecontainer.RunContainerOptions中。RunContainerOptions包括Envs、Mounts、Devices、PortMappings、Annotations等信息。

4.device状态的管理

device的状态管理涉及到以下3个部分:

1).node上的device状态管理当kubelet更新node status时会调用GetCapacity更新device plugins对应的Resource信息。

2).kubelet_node_status.go调用deviceManager的GetCapacity()获取device的状态,将device状态添加到node info并通过kube-apiserver存入etcd,GetCapacity()返回device server含有的所有device、已经分配给pod使用的device、pod不能使用的device即no-active的device kubelet_node_status.go根据返回的数据更新node info

3).kubelet deviceManager服务的device状态管理其实在device的注册、device分配中都有讲解,即使用checkpoint机制默认是将podDevices以 PodDevicesEntry的格式存入/var/lib/kubelet/device-plugins/kubelet_internal_checkpoint文件。

微信图片_20240523144121.png

原文链接:https://cloud.tencent.com/developer/article/1592800

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/986.html