Kubernetes的Device Plugin设计解读

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Kubernetes的生态地位已经确立,可扩展性将是其发力的主战场。异构计算作为非常重要的新战场,Kubernetes非常重视。而异构计算需要强大的计算力和高性能网络,需要提供一种统一的方式与GPU、FPGA、NIC、InfiniBand等高性能硬件集成。

Kubernetes的Device Plugin设计解读

最近在调研Kubernetes的GPU调度和运行机制,发现传统的alpha.kubernetes.io/nvidia-gpu即将在1.11版本中下线,和GPU相关的调度和部署的代码将彻底从主干代码中移除。

取而代之的是通过Extended Resource+Device Plugin两个Kubernetes的内置模块,外加由设备提供商实现的相应Device Plugin, 完成从设备的集群级别调度至工作节点,到设备与容器的实际绑定。

首先思考的第一个问题是为什么进入alpha.kubernetes.io/nvidia-gpu主干一年之久的GPU功能彻底移除?

  1. OutOfTree是Kubernetes一个很好的理念,之前的Cloud Provider的重构也是类似的工作。对于Kubernetes来说,不做瑞士军刀,专注于自身核心和通用能力,而将像GPU,InfiniBand,FPGA和公共云能力的工作完全交给社区和领域专家。这样一方面可以降低软件自身使用的复杂度,减小稳定性风险,另外OutOfTree分开迭代也能够更灵活实现的功能升级。
  2. 而开放的软件架构设计和标准也调动了社区参与的积极性,而活跃的社区其实是Kubernetes打赢容器调度框架之战的核心法宝。

先来简要介绍一下kubernetes这两个模块:

  • Extended Resource: 一种自定义资源扩展的方式,将资源的名称和总数量上报给API server,而Scheduler则根据使用该资源pod的创建和删除,做资源可用量的加减法,进而在调度时刻判断是否有满足资源条件的节点。目前这里的Extended Resource的增加和减少单元必须是整数,比如你可以分配1个GPU,但是不能分配0.5个GPU。该功能由于只是替代了Opaque integer resources,做了些更名的工作,所以在1.8已经是稳定的状态了。但是当integer这个关键词被移除,也引发我们的想象,未来会不会有0.5存在的可能性?
  • Device Plugin:通过提供通用设备插件机制和标准的设备API接口。这样设备厂商只需要实现相应的API接口,无需修改Kubelet主干代码,就可以实现支持GPU、FPGA、高性能 NIC、InfiniBand 等各种设备的扩展。该能力在Kubernetes 1.8和1.9版本处于Alpha版本,在1.10会进入Beta版本。

应该说这个功能目前还比较新,需要通过feature gate打开, 即配置 --feature-gates=DevicePlugins=true

Device Plugin的设计:

API设计:

实际上Device plugins实际上是简单的grpc server,需要实现以下两个方法 ListAndWatchAllocate,并监听在/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) {}
}

其中:

  • ListAndWatch: Kubelet会调用该API做设备发现和状态更新(比如设备变得不健康)
  • Allocate: 当Kubelet创建要使用该设备的容器时, Kubelet会调用该API执行设备相应的操作并且通知Kubelet初始化容器所需的device,volume和环境变量的配置。

插件生命周期管理:

  • 插件启动时,以grpc的形式通过/var/lib/kubelet/device-plugins/kubelet.sock向Kubelet注册,同时提供插件的监听Unix Socket,API版本号和设备名称(比如nvidia.com/gpu)。Kubelet将会把这些设备暴露到Node状态中,以Extended Resource的要求发送到API server中,后续Scheduler会根据这些信息进行调度。
  • 插件启动后,Kubelet会建立一个到插件的listAndWatch长连接,当插件检测到某个设备不健康的时候,就会主动通知Kubelet。此时如果这个设备处于空闲状态,Kubelet就会将其挪出可分配列表;如果该设备已经被某个pod使用,Kubelet就会将该Pod杀掉
  • 插件启动后可以利用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体验用户感受。

总结

Kubernetes的生态地位已经确立,可扩展性将是其发力的主战场。异构计算作为非常重要的新战场,Kubernetes非常重视。而异构计算需要强大的计算力和高性能网络,需要提供一种统一的方式与GPU、FPGA、NIC、InfiniBand等高性能硬件集成。而Device Plugin是Kubernetes给出的答案,还是非常简单优雅的,虽然还在演进之中,但是未来可期。阿里云容器服务随后也会推出基于device plugin的Kubernetes GPU 1.9.3集群,敬请期待。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
存储 Kubernetes API
【kubernetes】在 k8s 集群上部署 Minio Operator 和 Minio Plugin
【kubernetes】在 k8s 集群上部署 Minio Operator 和 Minio Plugin
2292 1
【kubernetes】在 k8s 集群上部署 Minio Operator 和 Minio Plugin
|
8月前
|
Kubernetes 开发工具 容器
【kubernetes】解决k8s1.28.4:NotReady message:Network plugin returns error: cni plugin not initia...
【kubernetes】解决k8s1.28.4:NotReady message:Network plugin returns error: cni plugin not initia...
1132 0
|
移动开发 JSON Kubernetes
k8s异常诊断之no space left on device.
某用户反馈,特定节点一直拉不起来pod,提示no space left on device.,手动去docker run也是相同的报错 # docker run --name aestools-perf --cap-add CAP_SYS_ADMIN --privileged -ti --rm registry-vpc.cn-beijing.aliyuncs.com/my-nettools/aestools:onlyperf docker: Error response from daemon: error creating overlay mount to /var/li
2546 3
|
存储 缓存 Kubernetes
K8s源代码解读--plugin
K8s源代码解读--plugin
124 0
|
Prometheus 运维 Kubernetes
扩展 Kubernetes 之 Kubectl Plugin
kubectl 是 重要的 kubernetes 管理/运维工具 kubectl 功能非常强大, 常见的命令使用方式可以参考 kubectl --help,或者这篇文章 这篇文章首先会简单介绍几个 kubectl 你可能不知道的小技巧,主要篇幅介绍 kubectl 的 plugin. kubectl 小技巧
294 0
|
机器学习/深度学习 Kubernetes 并行计算
从零开始入门 K8s | GPU 管理和 Device Plugin 工作机制
2016 年,随着 AlphaGo 的走红和 TensorFlow 项目的异军突起,一场名为 AI 的技术革命迅速从学术圈蔓延到了工业界,所谓 AI 革命从此拉开了帷幕。该热潮的背后推手正是云计算的普及和算力的巨大提升。
从零开始入门 K8s | GPU 管理和 Device Plugin 工作机制
|
Kubernetes 并行计算 Unix
Kubernetes必备知识: Device Plugin的工作机制
通过提供通用设备插件机制和标准的设备API接口。这样设备厂商只需要实现相应的API接口,无需修改Kubelet主干代码,就可以实现支持GPU、FPGA、高性能 NIC、InfiniBand 等各种设备的扩展。该能力在Kubernetes 1.8和1.9版本处于Alpha版本,在1.10会进入Beta版本。
1844 0
Kubernetes必备知识: Device Plugin的工作机制
|
Kubernetes 容器 Perl
Kubernetes源码分析-Device Manager的初始化
Kubernetes引入的Devic Plugin,通过扩展机制实现支持GPU、FPGA、高性能 NIC、InfiniBand等各种设备的集成,而Device Manager正是Kubelet内负责Device Plugin交互和设备生命周期管理的模块,在[了解其基本设计](https://yq.aliyun.com/articles/498185)后,我们需要通过对Device Manager的
1804 0
|
Kubernetes 容器 Perl
Kubernetes的Device Plugin机制源码解析(1)
Kubernetes 1.8 引入的Device Plugin机制,通过扩展的方式实现支持GPU、FPGA、高性能 NIC、InfiniBand等各种设备的集成。而Device Manager正是Kubelet内负责Device Plugin交互和设备生命周期管理的模块,在了解其基本设计后,本文对Device Manager的源码分析,理解其运作方式。
3923 0
|
6天前
|
缓存 容灾 网络协议
ACK One多集群网关:实现高效容灾方案
ACK One多集群网关可以帮助您快速构建同城跨AZ多活容灾系统、混合云同城跨AZ多活容灾系统,以及异地容灾系统。

相关产品

  • 容器服务Kubernetes版