Device插件
v1.8开始增加了Device插件,用来支持GPU、FPGA、高性能NIC、InfiniBand等各种设备。这样,设备厂商只需要根据Device Plugin的接口实现一个特定设备的插件,而不需要修改Kubernetes代码。
Device插件原理
使用Device插件之前,首先要开启DevicePlugins功能,即配置--feature-gates=DevicePlugins=true(默认是关闭的)。
Device插件实际上是一个gPRC接口,需要实现ListAndWatch()和Allocate()等方法,并监听 gRPC Server 的 Unix Socket 在/var/lib/kubelet/device-plugins/目录中,如/var/lib/kubelet/device-plugins/nvidiaGPU.sock。在实现Device插件时需要注意
- 插件启动时,需要通过
/var/lib/kubelet/device-plugins/kubelet.sock向 Kubelet 注册,同时提供插件的 Unix Socket 名称、API的版本号和插件名称(格式为vendor-domain/resource,如nvidia.com/gpu)。Kubelet会将这些设备暴露到Node状态中,方便后续调度器使用 - 插件启动后向 Kubelet 发送插件列表、按需分配设备并持续监控设备的实时状态
- 插件启动后要持续监控 Kubelet 的状态,并在 Kubelet 重启后重新注册自己。比如,Kubelet 刚启动后会清空
/var/lib/kubelet/device-plugins/目录,所以插件作者可以监控自己监听的unix socket是否被删除了,并根据此事件重新注册自己

Device插件一般推荐使用DaemonSet的方式部署,并将/var/lib/kubelet/device-plugins以Volume的形式挂载到容器中。当然,也可以手动运行的方式来部署,但这样就没有失败自动恢复的功能了。
NVIDIA GPU插件
NVIDIA 提供了一个基于 Device Plugins 接口的 GPU 设备插件 NVIDIA/k8s-device-plugin。
编译
git clone https://github.com/NVIDIA/k8s-device-plugin
cd k8s-device-plugin
docker build -t nvidia-device-plugin:1.0.0 .
部署
kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/master/nvidia-device-plugin.yml
创建Pod时请求 GPU 资源
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
restartPolicy: OnFailure
containers:
- image: nvidia/cuda
name: pod1-ctr
command: ["sleep"]
args: ["100000"]
resources:
limits:
nvidia.com/gpu: 1
注意:使用该插件时需要配置 nvidia-docker 2.0,并配置 nvidia 为默认运行时 (即配置docker daemon 的选项 --default-runtime=nvidia)。nvidia-docker 2.0 的安装方法为(以Ubuntu Xenial为例,其他系统的安装方法可以参考这里):
# Configure repository
curl -L https://nvidia.github.io/nvidia-docker/gpgkey | \
sudo apt-key add -
sudo tee /etc/apt/sources.list.d/nvidia-docker.list <<< \
"deb https://nvidia.github.io/libnvidia-container/ubuntu16.04/amd64 /
deb https://nvidia.github.io/nvidia-container-runtime/ubuntu16.04/amd64 /
deb https://nvidia.github.io/nvidia-docker/ubuntu16.04/amd64 /"
sudo apt-get update
# Install nvidia-docker 2.0
sudo apt-get install nvidia-docker2
sudo pkill -SIGHUP dockerd
# Check installation
docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi
GCP GPU插件
GCP 也提供了一个 GPU 设备的插件,仅适用于Google Container Engine,可以访问 GoogleCloudPlatform/container-engine-accelerators 查看。