大家好,我是讯享网,大家多多关注。
摘要:Kubernetes的生态地位已经确立,其拓展性将是其主战场。作为一个非常重要的新战场,Kubernetes非常重视异构计算。然而,异构计算需要强大的计算能力和高性能网络,需要提供统一的方式与GPU、FPGA、NIC、InfiniBand等高性能硬件集成。
Kubernetes的Device Plugin设计解读
近日,在调查了Kubernetes的GPU调度和运行机制后发现,传统的alpha.kubernetes.io/nvidia-gpu将在1.11版本下线,与GPU相关的调度和部署代码将被完全从主代码中移除。
而是通过Kubernetes的两个内置模块,扩展资源+设备插件,以及设备提供者实现的相应设备插件,来完成从设备的集群级到工作节点的调度,以及设备与容器的实际绑定。
首先要思考的第一个问题是,为什么进入alpha.kubernetes.io/nvidia-gpu主干网一年的GPU功能被完全移除了?
OutOfTree是Kubernetes的一个好主意,对之前云提供商的改造也类似。对于Kubernetes来说,他们不是做瑞士军刀,而是专注于自己的核心和通用能力,把GPU、InfiniBand、FPGA和公有云能力之类的工作留给社区和领域专家。一方面可以降低软件本身的复杂度和稳定性风险;另一方面,通过OutOfTree的单独迭代,可以更加灵活地实现功能升级。
开放的软件架构设计和标准也调动了社区参与的积极性,活跃的社区其实是Kubernetes打赢容器调度框架之战的核心法宝。
下面简单介绍一下kubernetes的这两个模块:
扩展资源(Extended Resource):一种自定义的资源扩展方式,向API服务器上报资源的名称和总量,调度器根据使用该资源的pod的创建和删除来加减可用资源,然后判断在调度时是否有满足资源条件的节点。目前,扩展资源的增量和减量单位必须是整数。比如你可以分配1个GPU,但是不能分配0.5个GPU。这个函数在1.8中一直处于稳定状态,因为它只替换了不透明的整数资源,做了一些重命名工作。但去掉整数这个关键词,也引发了我们的想象。未来会有0.5的可能吗?
设备插件:通过提供通用的设备插件机制和标准的设备API接口。这样设备厂商只需要实现相应的API接口,就可以实现支持GPU、FPGA、高性能NIC、InfiniBand等设备的扩展,而无需修改Kubelet主干代码。这个能力在Kubernetes和1.9版本中是Alpha版本,1.10将进入Beta版本。
应该说这个功能是目前比较新的,需要通过feature gate开启,即配置-功能-gates =设备插件=真。
Device Plugin的设计:
API设计:
其实设备插件其实就是一个简单的grpc服务器,它需要实现以下两个方法:ListAndWatch
和Allocate,并监控/var/lib/ku delet/Device-plugins/目录下的Unix Socket,比如
/var/lib/kube let/device-plugins/NVIDIA . sock
其中包括:
ListAndWatch: Kubelet将调用这个API进行设备发现和状态更新(例如,设备变得不健康)
Allocate:当Kubelet创建一个容器来使用这个设备时,Kubelet会调用这个API来执行设备的相应操作,并通知Kubelet初始化容器所需的设备、卷和环境变量的配置。
插件生命周期管理:
插件启动时,通过/var/lib/Kubelet/device-plugins/kube let . sock以grpc的形式向kube let注册,同时提供插件的监控Unix套接字、API版本号和设备名(如nvidia.com/gpu)。Kubelet会将这些设备暴露在节点状态下,按照扩展资源的要求发送给API服务器,后续的调度器会根据这些信息进行调度。
插件启动后,Kubelet会与插件listAndWatch建立长连接,当插件检测到某个设备不健康时,会主动通知Kubelet。此时,如果该设备处于空空闲状态,Kubelet会将其移出可分配列表;如果这个装置被一个吊舱使用过,库波利特会杀死这个吊舱。
插件启动后,可以使用Kubelet的socket连续检查Kubelet的状态。如果Kubelet重新启动,插件将相应地重新启动,并再次向Kubelet注册自己。
部署模式
通常,可以支持daemonset和非容器化部署。目前,官方推荐部署deamonset。
实现示例
Nvidia 的官方GPU插件
英伟达提供了一个基于设备插件接口的GPU设备插件NVIDIA/k8s-device-plugin,从用户的角度来看变得更简单。与传统的alpha.kubernetes.io/nvidia-gpu,相比,不再需要使用卷来指定CUDA需要使用的库。
API version:apps/v1 kind:deployment metadata:name:TF-notebook labels: app: tf-notebook spec:template:# define pods规格元数据:labels:app:TF-notebook规格:containers:-name:TF-notebook image:tensor flow/tensor flow:1 . 4 . 1-GPU-py3 resources:Limits:nvidia.com/gpu: 1 Google GCP GPU插件GCP也提供了一个GPU设备插件实现,但只支持在Google容器引擎的平台上运行,可以通过
Solarflare NIC 插件
网卡厂商Solarflare也实现了自己的设备插件sfc-device-plugin,可以通过demo体验用户的体验。
总结
Kubernetes的生态地位已经确立,其扩展性将是其主战场。作为一个非常重要的新战场,Kubernetes非常重视异构计算。然而,异构计算需要强大的计算能力和高性能网络,需要提供统一的方式与GPU、FPGA、NIC、InfiniBand等高性能硬件集成。而设备插件是Kubernetes给出的答案,还是很简洁优雅的。虽然还在进化,但未来可期。阿里云容器服务也将推出基于设备插件的Kubernetes GPU 1.9.3集群,敬请期待。
作者:毕岱
本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://51itzy.com/39311.html