所属技术领域:
Kubernetes
|名词定义|
通过提供通用设备插件机制和标准的设备API接口。这样设备厂商只需要实现相应的API接口,无需修改Kubelet主干代码,就可以实现支持GPU、FPGA、高性能 NIC、InfiniBand 等各种设备的扩展。该能力在Kubernetes 1.8和1.9版本处于Alpha版本,在1.10会进入Beta版本。
|技术特点|
Device Plugin 的工作流程
介绍一下 Device Plugin 的工作机制,整个 Device Plugin 的工作流程可以分成两个部分:
1.一个是启动时刻的资源上报;
2.另一个是用户使用时刻的调度和运行。
Device Plugin 的开发非常简单。主要包括最关注与最核心的两个事件方法:
1.其中 ListAndWatch 对应资源的上报,同时还提供健康检查的机制。当设备不健康的时候,可以上报给 Kubernetes 不健康设备的 ID,让 Device Plugin Framework 将这个设备从可调度设备中移除;
2.而 Allocate 会被 Device Plugin 在部署容器时调用,传入的参数核心就是容器会使用的设备 ID,返回的参数是容器启动时,需要的设备、数据卷以及环境变量。
Device Plugin的设计
API设计:
实际上Device plugins实际上是简单的grpc server,需要实现以下两个方法 ListAndWatch和Allocate,并监听在/var/lib/kubelet/device-plugins/目录下的Unix Socket,比如/var/lib/kubelet/device-plugins/nvidia.sock
service DevicePlugin {
// returns a stream of []Device
rpc ListAndWatch(Empty) returns (stream ListAndWatchResponse) {}
rpc Allocate(AllocateRequest) returns (AllocateResponse) {}
}
其中:
1.ListAndWatch: Kubelet会调用该API做设备发现和状态更新(比如设备变得不健康)
2.Allocate: 当Kubelet创建要使用该设备的容器时, Kubelet会调用该API执行设备相应的操作并且通知Kubelet初始化容器所需的device,volume和环境变量的配置。
插件生命周期管理
1.插件启动时,以grpc的形式通过/var/lib/kubelet/device-plugins/kubelet.sock向Kubelet注册,同时提供插件的监听Unix Socket,API版本号和设备名称(比如nvidia.com/gpu)。Kubelet将会把这些设备暴露到Node状态中,以Extended Resource的要求发送到API server中,后续Scheduler会根据这些信息进行调度。
2.插件启动后,Kubelet会建立一个到插件的listAndWatch长连接,当插件检测到某个设备不健康的时候,就会主动通知Kubelet。此时如果这个设备处于空闲状态,Kubelet就会将其挪出可分配列表;如果该设备已经被某个pod使用,Kubelet就会将该Pod杀掉
3.插件启动后可以利用Kubelet的socket持续检查Kubelet的状态,如果Kubelet重启,插件也会相应的重启,并且重新向Kubelet注册自己
部署方式
一般可以支持daemonset和非容器化的部署,目前官方推荐使用deamonset部署。
实现样例
Nvidia 的官方GPU插件
NVIDIA 提供了一个基于 Device Plugins 接口的 GPU 设备插件NVIDIA/k8s-device-plugin, 从用户角度变得更加简单了。比起传统的alpha.kubernetes.io/nvidia-gpu, 不再需要使用volumes指定CUDA需要使用的库。
apiVersion: apps/v1
kind: Deployment
metadata:
name: tf-notebook
labels:
app: tf-notebook
spec:
template: # define the pods specifications
metadata:
labels:
app: tf-notebook
spec:
containers:
- name: tf-notebook
image: tensorflow/tensorflow:1.4.1-gpu-py3
resources:
limits:
nvidia.com/gpu: 1
Google GCP GPU插件
GCP也提供了一个GPU设备插件实现,但是只支持运行在Google Container Engine的平台上,可以通过container-engine-accelerators了解
Solarflare NIC 插件
网卡造商Solarflare也实现了自己的设备插件sfc-device-plugin, 可以通过demo体验用户感受。
|资料来源|
名词定义:https://yq.aliyun.com/articles/498185
技术特点:https://yq.aliyun.com/articles/498185