成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

k8s的擴展資源設(shè)計和device-plugin

shiweifu / 2856人閱讀

摘要:如果上的資源耗盡,這類將無法成功調(diào)度。將這個資源及其對應的設(shè)備個數(shù)記錄到更新到。

extended-resources

extended-resources在k8s1.9中是一個stable的特性??梢杂靡痪湓拋砀爬ㄟ@個特性:

通過向apiserver發(fā)送一個patch node 的請求,為這個node增加一個自定義的資源類型,用于以該資源的配額統(tǒng)計和相應的QoS的配置。

patch node 的請求:

舉例:

curl --header "Content-Type: application/json-patch+json" 
--request PATCH 
--data "[{"op": "add", "path": "/status/capacity/example.com~1dongle", "value": "4"}]" 
http://localhost:8001/api/v1/nodes/10.123.123.123/status

如上,我們?yōu)?0.123.123.123這個node增加了一個resource:example.com/dongle (命令中的 ~1 會轉(zhuǎn)化為 / ) ,這個node的capicity/allocable中會展示其有4個example.com/dongle資源:

"capacity": {
  "alpha.kubernetes.io/nvidia-gpu": "0",
  "cpu": "2",
  "memory": "2049008Ki",
  "example.com/dongle": "4",

如果我們要清除這個資源可以使用:

curl --header "Content-Type: application/json-patch+json" 
--request PATCH 
--data "[{"op": "remove", "path": "/status/capacity/example.com~1dongle"}]" 
http://localhost:8001/api/v1/nodes//status
QoS配置:

如果對QoS的含義不了解,可以參考我之前的文章

先假設(shè)整個k8s集群中我們只對10.123.123.123這個node動了手腳,當我們創(chuàng)建pod時,在spec.containers.resources.requests/limits中可以設(shè)置

 "example.com/dongle": "2"

從而讓pod被調(diào)度到10.123.123.123上并消耗其2個example.com/dongle資源。這個資源將與cpu、memory一樣,被調(diào)度器進行統(tǒng)計,并用在pod的調(diào)度算法中。如果node上的example.com/dongle資源耗盡,這類pod將無法成功調(diào)度。

device-plugin插件

設(shè)備插件從1.8版本開始加入,到1.9目前仍是alpha特性,設(shè)備插件的作用是在不更改k8s代碼的情況下,向k8s提供各種資源的統(tǒng)計信息和使用預備工作。這里說的資源如GPU、高性能NIC、FPGA、infiniBand或其他。

device-plugin的注冊和實施

device-plugin功能由DevicePlugins這個參數(shù)控制,默認是禁用的,啟用這個參數(shù)后就可以令kubelet開放Register 的grpc服務。 device-plugin可以通過這個服務向kubelet注冊自己,注冊時要告知kubelet:

本device-plugin的Unix socket 名稱。用于kubelet作為grpc 客戶端向本device-plugin發(fā)請求;

本device-plugin的API版本;

本device-plugin要開放的資源名,此處資源名必須遵循一定格式,形如:nvidia.com/gpu

注冊成功后,kubelet會向device-plugin調(diào)用Listandwatch方法獲取設(shè)備的列表,此處設(shè)備的列表以該資源所有設(shè)備的描述信息(id、健康狀態(tài))組成數(shù)組返回。kubelet將這個資源及其對應的設(shè)備個數(shù)記錄到node.status.capicity/allocable 更新到apiserver。該方法會一直循環(huán)檢查,一旦設(shè)備異?;蛘邚臋C器上拔出,會將最新的設(shè)備列表返回給kubelet。

如此一來,創(chuàng)建pod時,spec.containers.resource.limits/requests 中就可以增加如 "nvidia.com/gpu" : 2 這樣的字段,來告知k8s將pod調(diào)度到有超過2個nvidia.com/gpu資源余量的nodes上(這里與上文的extended-resources中QoS是一個道理)。當node上要運行該pod時,kubelet會向device-plugin調(diào)用Allocate方法,device-plugin在這里可能會做一些初始化的操作,比如GPU清理或QRNG初始化之類。如果初始化成功。該方法會返回分配給該pod使用的設(shè)備在容器創(chuàng)建時需要如何配置,這個配置會被傳遞到container runtime。用于run 容器時作為參數(shù)進行配置。

完整的使用流程如下圖(圖片來源:https://github.com/kubernetes...)

device-plugin 使用的代碼解析

我們從創(chuàng)建pod的整個流程中一步步解析代碼執(zhí)行:

創(chuàng)建帶特殊資源設(shè)備的pod;
調(diào)度器從cache中選擇滿足要求的node;
node收到ADD POD, 對pod執(zhí)行admit方法進行可運行的判斷。

kubelet初始化時增加了一個admitHandler

klet.admitHandlers.AddPodAdmitHandler(lifecycle.NewPredicateAdmitHandler(klet.getNodeAnyWay, criticalPodAdmissionHandler, klet.containerManager.UpdatePluginResources))

其中就包括了klet.containerManager.UpdatePluginResources方法,該方法會執(zhí)行devicepluginManager中的Allocate方法:

func (cm *containerManagerImpl) UpdatePluginResources(node *schedulercache.NodeInfo, attrs *lifecycle.PodAdmitAttributes) error {
      return cm.devicePluginManager.Allocate(node, attrs)
}

上述的Allocate方法,會將kubelet本身緩存記錄的資源可用量進行判斷和計算;
然后選定要使用的設(shè)備,向device-plugin發(fā)送Allocate調(diào)用,device-plugin會針對request中的設(shè)備id,檢查是否可用,并將使用這幾個設(shè)備需要的使用參數(shù)返回給kubelet,返回的格式是:

type AllocateResponse struct {
 // List of environment variable to be set in the container to access one of more devices.
 Envs map[string]string
 // Mounts for the container.
 Mounts []*Mount
 // Devices for the container.
 Devices []*DeviceSpec
}

最后將要這個pod要使用哪幾個資源設(shè)備(設(shè)備id、以及deviceplugin返回的設(shè)備使用參數(shù))記錄在podDevices中,podDevices就是一個從pod到資源設(shè)備詳細信息的映射,是一個多層次的map結(jié)構(gòu)。

kubelet要創(chuàng)建pod的容器時,會調(diào)用到GenerateRunContainerOptions方法,用于生成容器runtime要的參數(shù),該方法中會首先調(diào)用:

opts, err := kl.containerManager.GetResources(pod, container)

containerManagerGetResources會調(diào)用devicePluginManager中的GetDeviceRunContainerOptions方法,最后執(zhí)行deviceRunContainerOptions方法,從podDevices中獲取這個pod相應的容器需要使用的設(shè)備,并組織成容器運行時參數(shù)的對象opts,最終run container時會被用到。比如gpu容器,會在opts中增加devices參數(shù)的指定,最后容器創(chuàng)建時會帶有需要的設(shè)備。

device-plugin的部署

部署device-plugin插件最佳的方法是使用k8s的daemonset,因為daemonset可以在插件失敗是重新啟動之,且會自動分布到滿足條件的所有node節(jié)點上。

社區(qū)參考文檔
https://kubernetes.io/docs/ta...

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/32628.html

相關(guān)文章

  • KubernetesDevice Plugin設(shè)計解讀

    摘要:摘要的生態(tài)地位已經(jīng)確立,可擴展性將是其發(fā)力的主戰(zhàn)場。該功能由于只是替代了做了些更名的工作,所以在已經(jīng)是穩(wěn)定的狀態(tài)了。異構(gòu)計算作為非常重要的新戰(zhàn)場,非常重視。而異構(gòu)計算需要強大的計算力和高性能網(wǎng)絡(luò),需要提供一種統(tǒng)一的方式與等高性能硬件集成。 摘要: Kubernetes的生態(tài)地位已經(jīng)確立,可擴展性將是其發(fā)力的主戰(zhàn)場。異構(gòu)計算作為非常重要的新戰(zhàn)場,Kubernetes非常重視。而異構(gòu)計算需...

    bladefury 評論0 收藏0
  • 【附PPT下載】UCan技術(shù)開放日·上海站活動回顧

    摘要:徐亮厚稱,當前云原生已成為業(yè)務發(fā)展的一個重要引擎,年疫情更是加大了對的需求,拉動了大數(shù)據(jù)數(shù)據(jù)庫中間件人工智能的云原生化發(fā)展。未來英特爾將與一起,共同利用并發(fā)揮云原生的價值,為處在數(shù)字化型中的用戶,提供更加豐富的云化策略。 9月11日,由UCloud優(yōu)刻得主辦的UCan技術(shù)開放日活動上,以構(gòu)建云原生,擁抱新增長為主題,UCloud攜手達達集團、馭勢科技、企源科技以及英特爾等企業(yè)的云原生技術(shù)專...

    levy9527 評論0 收藏0
  • UCan技術(shù)開放日(上海站)——云原生在多行業(yè)場景落地實踐

    摘要:技術(shù)開放日云原生在多行業(yè)場景的落地實踐當前,云計算已成為萬千企業(yè)數(shù)字化轉(zhuǎn)型的基石,隨之而來的是對云計算應用效能的更高要求。UCloud UCan技術(shù)開放日——云原生在多行業(yè)場景的落地實踐當前,云計算已成為萬千企業(yè)數(shù)字化轉(zhuǎn)型的基石,隨之而來的是對云計算應用效能的更高要求。敏捷開發(fā)、彈性架構(gòu)、多集群運維等,讓企業(yè)現(xiàn)有IT架構(gòu)面臨新的挑戰(zhàn)。云原生以其獨特的技術(shù)特點,很好地契合了云計算發(fā)展的本質(zhì)需求...

    Tecode 評論0 收藏0
  • 為什么 kubernetes 天然適合微服務 (3)

    摘要:此文已由作者劉超授權(quán)網(wǎng)易云社區(qū)發(fā)布。五更加適合微服務和的設(shè)計好了,說了本身,接下來說說的理念設(shè)計,為什么這么適合微服務。相關(guān)閱讀為什么天然適合微服務為什么天然適合微服務為什么天然適合微服務文章來源網(wǎng)易云社區(qū) 此文已由作者劉超授權(quán)網(wǎng)易云社區(qū)發(fā)布。 歡迎訪問網(wǎng)易云社區(qū),了解更多網(wǎng)易技術(shù)產(chǎn)品運營經(jīng)驗 四、Kubernetes 本身就是微服務架構(gòu) 基于上面這十個設(shè)計要點,我們再回來看 Kube...

    nicercode 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<