您好,登錄后才能下訂單哦!
本文小編為大家詳細(xì)介紹“Kubernetes的Device Plugin設(shè)計(jì)是怎樣的”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Kubernetes的Device Plugin設(shè)計(jì)是怎樣的”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。
最近在調(diào)研Kubernetes的GPU調(diào)度和運(yùn)行機(jī)制,發(fā)現(xiàn)傳統(tǒng)的alpha.kubernetes.io/nvidia-gpu
即將在1.11版本中下線,和GPU相關(guān)的調(diào)度和部署的代碼將徹底從主干代碼中移除。
取而代之的是通過Extended Resource+Device Plugin兩個(gè)Kubernetes的內(nèi)置模塊,外加由設(shè)備提供商實(shí)現(xiàn)的相應(yīng)Device Plugin, 完成從設(shè)備的集群級別調(diào)度至工作節(jié)點(diǎn),到設(shè)備與容器的實(shí)際綁定。
首先思考的第一個(gè)問題是為什么進(jìn)入alpha.kubernetes.io/nvidia-gpu
主干一年之久的GPU功能徹底移除?
OutOfTree是Kubernetes一個(gè)很好的理念,之前的Cloud Provider的重構(gòu)也是類似的工作。對于Kubernetes來說,不做瑞士軍刀,專注于自身核心和通用能力,而將像GPU,InfiniBand,FPGA和公共云能力的工作完全交給社區(qū)和領(lǐng)域?qū)<摇_@樣一方面可以降低軟件自身使用的復(fù)雜度,減小穩(wěn)定性風(fēng)險(xiǎn),另外OutOfTree分開迭代也能夠更靈活實(shí)現(xiàn)的功能升級。
而開放的軟件架構(gòu)設(shè)計(jì)和標(biāo)準(zhǔn)也調(diào)動了社區(qū)參與的積極性,而活躍的社區(qū)其實(shí)是Kubernetes打贏容器調(diào)度框架之戰(zhàn)的核心法寶。
先來簡要介紹一下kubernetes這兩個(gè)模塊:
Extended Resource: 一種自定義資源擴(kuò)展的方式,將資源的名稱和總數(shù)量上報(bào)給API server,而Scheduler則根據(jù)使用該資源pod的創(chuàng)建和刪除,做資源可用量的加減法,進(jìn)而在調(diào)度時(shí)刻判斷是否有滿足資源條件的節(jié)點(diǎn)。目前這里的Extended Resource的增加和減少單元必須是整數(shù),比如你可以分配1個(gè)GPU,但是不能分配0.5個(gè)GPU。該功能由于只是替代了Opaque integer resources,做了些更名的工作,所以在1.8已經(jīng)是穩(wěn)定的狀態(tài)了。但是當(dāng)integer這個(gè)關(guān)鍵詞被移除,也引發(fā)我們的想象,未來會不會有0.5存在的可能性?
Device Plugin:通過提供通用設(shè)備插件機(jī)制和標(biāo)準(zhǔn)的設(shè)備API接口。這樣設(shè)備廠商只需要實(shí)現(xiàn)相應(yīng)的API接口,無需修改Kubelet主干代碼,就可以實(shí)現(xiàn)支持GPU、FPGA、高性能 NIC、InfiniBand 等各種設(shè)備的擴(kuò)展。該能力在Kubernetes 1.8和1.9版本處于Alpha版本,在1.10會進(jìn)入Beta版本。
應(yīng)該說這個(gè)功能目前還比較新,需要通過feature gate打開, 即配置 --feature-gates=DevicePlugins=true
實(shí)際上Device plugins實(shí)際上是簡單的grpc server,需要實(shí)現(xiàn)以下兩個(gè)方法 ListAndWatch
和Allocate
,并監(jiān)聽在/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會調(diào)用該API做設(shè)備發(fā)現(xiàn)和狀態(tài)更新(比如設(shè)備變得不健康)
Allocate: 當(dāng)Kubelet創(chuàng)建要使用該設(shè)備的容器時(shí), Kubelet會調(diào)用該API執(zhí)行設(shè)備相應(yīng)的操作并且通知Kubelet初始化容器所需的device,volume和環(huán)境變量的配置。
插件啟動時(shí),以grpc的形式通過/var/lib/kubelet/device-plugins/kubelet.sock
向Kubelet注冊,同時(shí)提供插件的監(jiān)聽Unix Socket,API版本號和設(shè)備名稱(比如nvidia.com/gpu)。Kubelet將會把這些設(shè)備暴露到Node狀態(tài)中,以Extended Resource的要求發(fā)送到API server中,后續(xù)Scheduler會根據(jù)這些信息進(jìn)行調(diào)度。
插件啟動后,Kubelet會建立一個(gè)到插件的listAndWatch長連接,當(dāng)插件檢測到某個(gè)設(shè)備不健康的時(shí)候,就會主動通知Kubelet。此時(shí)如果這個(gè)設(shè)備處于空閑狀態(tài),Kubelet就會將其挪出可分配列表;如果該設(shè)備已經(jīng)被某個(gè)pod使用,Kubelet就會將該P(yáng)od殺掉
插件啟動后可以利用Kubelet的socket持續(xù)檢查Kubelet的狀態(tài),如果Kubelet重啟,插件也會相應(yīng)的重啟,并且重新向Kubelet注冊自己
一般可以支持daemonset和非容器化的部署,目前官方推薦使用deamonset部署。
NVIDIA 提供了一個(gè)基于 Device Plugins 接口的 GPU 設(shè)備插件NVIDIA/k8s-device-plugin, 從用戶角度變得更加簡單了。比起傳統(tǒng)的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
GCP也提供了一個(gè)GPU設(shè)備插件實(shí)現(xiàn),但是只支持運(yùn)行在Google Container Engine的平臺上,可以通過container-engine-accelerators了解
網(wǎng)卡造商Solarflare也實(shí)現(xiàn)了自己的設(shè)備插件sfc-device-plugin, 可以通過demo體驗(yàn)用戶感受。
讀到這里,這篇“Kubernetes的Device Plugin設(shè)計(jì)是怎樣的”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點(diǎn)還需要大家自己動手實(shí)踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。