天天看点

Kubernetes必备知识: Device Plugin的工作机制

所属技术领域:

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.另一个是用户使用时刻的调度和运行。

Kubernetes必备知识: Device Plugin的工作机制

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

技术特点:

继续阅读