广告推广营销网站,word可以做网站链接吗,长安英文网站建设,电子商务网站开发形式有摘要#xff1a; Kubernetes的生态地位已经确立#xff0c;可扩展性将是其发力的主战场。异构计算作为非常重要的新战场#xff0c;Kubernetes非常重视。而异构计算需要强大的计算力和高性能网络#xff0c;需要提供一种统一的方式与GPU、FPGA、NIC、InfiniBand等高性能硬件…摘要 Kubernetes的生态地位已经确立可扩展性将是其发力的主战场。异构计算作为非常重要的新战场Kubernetes非常重视。而异构计算需要强大的计算力和高性能网络需要提供一种统一的方式与GPU、FPGA、NIC、InfiniBand等高性能硬件集成。
点此查看原文http://click.aliyun.com/m/43607/
Kubernetes的Device Plugin设计解读
最近在调研Kubernetes的GPU调度和运行机制发现传统的alpha.kubernetes.io/nvidia-gpu即将在1.11版本中下线和GPU相关的调度和部署的代码将彻底从主干代码中移除。
取而代之的是通过Extended ResourceDevice Plugin两个Kubernetes的内置模块外加由设备提供商实现的相应Device Plugin, 完成从设备的集群级别调度至工作节点到设备与容器的实际绑定。
首先思考的第一个问题是为什么进入alpha.kubernetes.io/nvidia-gpu主干一年之久的GPU功能彻底移除
1.OutOfTree是Kubernetes一个很好的理念之前的Cloud Provider的重构也是类似的工作。对于Kubernetes来说不做瑞士军刀专注于自身核心和通用能力而将像GPUInfiniBand,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-gatesDevicePluginstrue
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 []Devicerpc ListAndWatch(Empty) returns (stream ListAndWatchResponse) {}rpc Allocate(AllocateRequest) returns (AllocateResponse) {}
}
其中
ListAndWatch: Kubelet会调用该API做设备发现和状态更新比如设备变得不健康 Allocate: 当Kubelet创建要使用该设备的容器时 Kubelet会调用该API执行设备相应的操作并且通知Kubelet初始化容器所需的devicevolume和环境变量的配置。
插件生命周期管理 1.插件启动时以grpc的形式通过/var/lib/kubelet/device-plugins/kubelet.sock向Kubelet注册同时提供插件的监听Unix SocketAPI版本号和设备名称比如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: Deploymentmetadata:name: tf-notebooklabels:app: tf-notebookspec:template: # define the pods specificationsmetadata:labels:app: tf-notebookspec:containers:- name: tf-notebookimage: tensorflow/tensorflow:1.4.1-gpu-py3resources: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集群敬请期待。
识别以下二维码干货