摘要:如果上的資源耗盡,這類將無法成功調度。將這個資源及其對應的設備個數記錄到更新到。
extended-resources
extended-resources在k8s1.9中是一個stable的特性??梢杂靡痪湓拋砀爬ㄟ@個特性:
通過向apiserver發送一個patch node 的請求,為這個node增加一個自定義的資源類型,用于以該資源的配額統計和相應的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
如上,我們為10.123.123.123這個node增加了一個resource:example.com/dongle (命令中的 ~1 會轉化為 / ) ,這個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/QoS配置:/status
如果對QoS的含義不了解,可以參考我之前的文章
先假設整個k8s集群中我們只對10.123.123.123這個node動了手腳,當我們創建pod時,在spec.containers.resources.requests/limits中可以設置
"example.com/dongle": "2"
從而讓pod被調度到10.123.123.123上并消耗其2個example.com/dongle資源。這個資源將與cpu、memory一樣,被調度器進行統計,并用在pod的調度算法中。如果node上的example.com/dongle資源耗盡,這類pod將無法成功調度。
device-plugin插件設備插件從1.8版本開始加入,到1.9目前仍是alpha特性,設備插件的作用是在不更改k8s代碼的情況下,向k8s提供各種資源的統計信息和使用預備工作。這里說的資源如GPU、高性能NIC、FPGA、infiniBand或其他。
device-plugin的注冊和實施device-plugin功能由DevicePlugins這個參數控制,默認是禁用的,啟用這個參數后就可以令kubelet開放Register 的grpc服務。 device-plugin可以通過這個服務向kubelet注冊自己,注冊時要告知kubelet:
本device-plugin的Unix socket 名稱。用于kubelet作為grpc 客戶端向本device-plugin發請求;
本device-plugin的API版本;
本device-plugin要開放的資源名,此處資源名必須遵循一定格式,形如:nvidia.com/gpu
注冊成功后,kubelet會向device-plugin調用Listandwatch方法獲取設備的列表,此處設備的列表以該資源所有設備的描述信息(id、健康狀態)組成數組返回。kubelet將這個資源及其對應的設備個數記錄到node.status.capicity/allocable 更新到apiserver。該方法會一直循環檢查,一旦設備異?;蛘邚臋C器上拔出,會將最新的設備列表返回給kubelet。
如此一來,創建pod時,spec.containers.resource.limits/requests 中就可以增加如 "nvidia.com/gpu" : 2 這樣的字段,來告知k8s將pod調度到有超過2個nvidia.com/gpu資源余量的nodes上(這里與上文的extended-resources中QoS是一個道理)。當node上要運行該pod時,kubelet會向device-plugin調用Allocate方法,device-plugin在這里可能會做一些初始化的操作,比如GPU清理或QRNG初始化之類。如果初始化成功。該方法會返回分配給該pod使用的設備在容器創建時需要如何配置,這個配置會被傳遞到container runtime。用于run 容器時作為參數進行配置。
完整的使用流程如下圖(圖片來源:https://github.com/kubernetes...)
device-plugin 使用的代碼解析我們從創建pod的整個流程中一步步解析代碼執行:
創建帶特殊資源設備的pod;
調度器從cache中選擇滿足要求的node;
node收到ADD POD, 對pod執行admit方法進行可運行的判斷。
kubelet初始化時增加了一個admitHandler:
klet.admitHandlers.AddPodAdmitHandler(lifecycle.NewPredicateAdmitHandler(klet.getNodeAnyWay, criticalPodAdmissionHandler, klet.containerManager.UpdatePluginResources))
其中就包括了klet.containerManager.UpdatePluginResources方法,該方法會執行devicepluginManager中的Allocate方法:
func (cm *containerManagerImpl) UpdatePluginResources(node *schedulercache.NodeInfo, attrs *lifecycle.PodAdmitAttributes) error { return cm.devicePluginManager.Allocate(node, attrs) }
上述的Allocate方法,會將kubelet本身緩存記錄的資源可用量進行判斷和計算;
然后選定要使用的設備,向device-plugin發送Allocate調用,device-plugin會針對request中的設備id,檢查是否可用,并將使用這幾個設備需要的使用參數返回給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要使用哪幾個資源設備(設備id、以及deviceplugin返回的設備使用參數)記錄在podDevices中,podDevices就是一個從pod到資源設備詳細信息的映射,是一個多層次的map結構。
kubelet要創建pod的容器時,會調用到GenerateRunContainerOptions方法,用于生成容器runtime要的參數,該方法中會首先調用:
opts, err := kl.containerManager.GetResources(pod, container)
而containerManager中GetResources會調用devicePluginManager中的GetDeviceRunContainerOptions方法,最后執行deviceRunContainerOptions方法,從podDevices中獲取這個pod相應的容器需要使用的設備,并組織成容器運行時參數的對象opts,最終run container時會被用到。比如gpu容器,會在opts中增加devices參數的指定,最后容器創建時會帶有需要的設備。
device-plugin的部署部署device-plugin插件最佳的方法是使用k8s的daemonset,因為daemonset可以在插件失敗是重新啟動之,且會自動分布到滿足條件的所有node節點上。
社區參考文檔
https://kubernetes.io/docs/ta...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/32628.html
摘要:摘要的生態地位已經確立,可擴展性將是其發力的主戰場。該功能由于只是替代了做了些更名的工作,所以在已經是穩定的狀態了。異構計算作為非常重要的新戰場,非常重視。而異構計算需要強大的計算力和高性能網絡,需要提供一種統一的方式與等高性能硬件集成。 摘要: Kubernetes的生態地位已經確立,可擴展性將是其發力的主戰場。異構計算作為非常重要的新戰場,Kubernetes非常重視。而異構計算需...
摘要:徐亮厚稱,當前云原生已成為業務發展的一個重要引擎,年疫情更是加大了對的需求,拉動了大數據數據庫中間件人工智能的云原生化發展。未來英特爾將與一起,共同利用并發揮云原生的價值,為處在數字化型中的用戶,提供更加豐富的云化策略。 9月11日,由UCloud優刻得主辦的UCan技術開放日活動上,以構建云原生,擁抱新增長為主題,UCloud攜手達達集團、馭勢科技、企源科技以及英特爾等企業的云原生技術專...
摘要:技術開放日云原生在多行業場景的落地實踐當前,云計算已成為萬千企業數字化轉型的基石,隨之而來的是對云計算應用效能的更高要求。UCloud UCan技術開放日——云原生在多行業場景的落地實踐當前,云計算已成為萬千企業數字化轉型的基石,隨之而來的是對云計算應用效能的更高要求。敏捷開發、彈性架構、多集群運維等,讓企業現有IT架構面臨新的挑戰。云原生以其獨特的技術特點,很好地契合了云計算發展的本質需求...
摘要:此文已由作者劉超授權網易云社區發布。五更加適合微服務和的設計好了,說了本身,接下來說說的理念設計,為什么這么適合微服務。相關閱讀為什么天然適合微服務為什么天然適合微服務為什么天然適合微服務文章來源網易云社區 此文已由作者劉超授權網易云社區發布。 歡迎訪問網易云社區,了解更多網易技術產品運營經驗 四、Kubernetes 本身就是微服務架構 基于上面這十個設計要點,我們再回來看 Kube...
閱讀 2054·2021-10-08 10:04
閱讀 3079·2021-09-22 10:02
閱讀 2225·2019-08-30 15:56
閱讀 825·2019-08-30 15:54
閱讀 921·2019-08-30 15:54
閱讀 1275·2019-08-30 15:53
閱讀 2508·2019-08-30 11:21
閱讀 3556·2019-08-30 10:56