【云駐共創】華為云原生之Kubernetes高級調度器原理詳解(華為云 kubernetes)

      網友投稿 873 2025-03-31

      前言

      《云原生王者之路集訓營》是華為云云原生團隊精心打磨的云原生學習技術公開課,分為黃金、鉆石、王者三個階段,幫助廣大技術愛好者快速掌握云原生相關技能。本課程為黃金課程的第三課,由容器基礎設施團隊,容器批量計算架構師William Wang主講,為大家深入講解Kubernetes調度流程原理以及典型調度算法。

      目標學員:計算機、軟件工程等專業的大學生,涉及Kubernetes、Istio等技術的應用開發者,其他的云原生技術興趣愛好。學完本課程后,您將能夠:了解Kubernetes調度器的工作原理及典型的調度算法;理解常見的Kubernetes的高級調度特性;理解華為云 Volcano 的典型批量調度算法。

      一 kubernetes scheduling

      1.1 kubernetes調度模式

      調度器是主節點上的組件,該組件監視那些新創建的未指定運行節點的 Pod,并選擇節點讓 Pod 在特定Node上面運行。

      1.2 kubernetes default schedule 特點

      kube-scheduler 是 Kubernetes 集群的默認調度器,并且是集群控制面的一部分,kube-scheduler 在設計上是允許用戶自己編寫調度組件并替換原有的 kube-scheduler。

      對每一個新創建的 Pod 或者是未被調度的 Pod,kube-scheduler 會選擇一個最優的 Node 去運行這個 Pod。然而,Pod 內的每一個容器對資源都有不同的需求,而且 Pod 本身也有不同的資源需求。因此,Pod 在被調度到 Node 上之前,根據這些特定的資源調度需求,需要對集群中的 Node 進行一次過濾。

      在一個集群中,滿足一個 Pod 調度請求的所有 Node 稱之為 可調度節點。如果沒有任何一個 Node 能滿足 Pod 的資源請求,那么這個 Pod 將一直停留在未調度狀態直到調度器能夠找到合適的 Node。

      調度器先在集群中找到一個 Pod 的所有可調度節點,然后根據一系列函數對這些可調度節點打分,然后選出其中得分最高的 Node 來運行 Pod。之后,調度器將這個調度決定通知給 kube-apiserver,這個過程叫做綁定。

      在做調度決定時需要考慮的因素包括:單獨和整體的資源請求、硬件/軟件/策略限制、親和以及反親和要求、數據局域性、負載間的干擾等等。

      1.3 調度框架和調度流程

      Informer list/watch資源變化,更新queue和cache;NextPod()從待調度隊列獲取隊首的Pod;

      從cache中獲取Node列表;

      針對Pod和NodeList執行Predicate算法,過濾掉不合適的節點;

      針對Pod和NodeList執行Priority算法,給節點打分;

      根據打分,計算出得分最高的節點;

      當高優先級的Pod沒有找到合適的節點時,調度器嘗試為其搶占優先級低的Pod;

      當調度器為Pod選擇了一個合適的節點時,通過Bind將Pod和節點進行綁定;

      通過cache機制可以對在進行執行Predicate的時候提升效率。

      在節點綁定bind操作不是這直接操作apiserver的bind,而是在緩存至執行bind操作node的pod信息。之后啟動golang的協程異步向apiserver發請求,這種機制可以大大加快調度器處理pod的速度和效率。

      1.3 調度策略與算法

      Predicates,篩選不合格的節點。

      預選階段:排除完全不符合運行這個 POD 的節點、例如資源最低要求、資源最高限額、端口是否被占用。

      Priorities

      優選階段:基于一系列的算法函數計算出每個節點的優先級,按照優先級排序,取得分最高的 node。

      選中階段:如果優選階段產生多個結果,那么隨機挑選一個節點。

      優選:調度器會為 Pod 從所有可調度節點中選取一個最合適的 Node。根據當前啟用的打分規則,調度器會給每一個可調度節點進行打分。最后,kube-scheduler 會將 Pod 調度到得分最高的 Node 上。如果存在多個得分最高的 Node,kube-scheduler 會從中隨機選取一個。

      優先級選項包括:

      LeastRequestedPriority :通過計算 CPU 和 Memory 的使用率來決定權重,使用率越低權重越高。換句話說,這個優先級指標傾向于資源使用比例更低的節點 ;

      BalancedResourceAllocation :節點上 CPU 和 Memory 使用率越接近,權重越高。這個應該和上面的一起使用,不應該單獨使用;

      ImageLocalityPriority :傾向于已經有要使用鏡像的節點,鏡像總大小值越大,權重越高

      通過算法對所有的優先級項目和權重進行計算,得出最終的結果。

      二 Kubernetes的高級調度特性

      2.1 kubernetes中的Label,selector機制

      kubernetes中的Label,selector機制通常用于對Pod進行過濾,分離和篩選。

      任意的metadata,所有API對象都有Label,通常用來標記“身份”,可以查詢時用selectors過濾

      類似SQL 'select .. where... '

      Label是kubernetes系統中的一個重要概念。它的作用就是在資源上添加標識,用來對它們進行區分和選擇。Label的特點:

      一個Label會以key/value鍵值對的形式附加到各種對象上,如Node、Pod、Service等等。

      一個資源對象可以定義任意數量的Label,同一個Label也可以被添加到任意數量的資源對象上去。

      Label通常在資源對象定義時確定,當然也可以在對象創建后勃態添加或者刪除。

      可以通過Label實現資源的多維度分組,以便靈活、方便地進行資源分配、調度、配置、部署等管理工作。

      Label用于給某個資源對象定義標識

      Label Selector用于查詢和篩選擁有某些標簽的資源對象

      App:標識app的名稱

      Phase:表示運行環境

      Role:表示角色

      可以通過App,Role進行組合進行pod的調度。

      2.2 Node Affinity

      希望pod可以調度到一些特定的節點上,有些node支持gpu或性能比較好。通過selector機制,可以將pod運行在某些選定的節點上。

      2.3 Pod Affinity

      POD 和 POD 出于高效的通信這種需求,所以需要將 POD 和 POD 組織在同一臺機器,同一個機房,例如:LNMT 如果能運行在同一個主機上更好。想把一組 POD 運行在一起,使用節點親和性就可以實現,為了達成這個目的,我們需要:把節點標簽精心編排,希望在一起運行的 POD,就使用同一組標簽選擇器來選擇節點,這種方式需要管理節點標簽和 POD 親和性才能做到。

      想把一組 POD 運行在一起,使用 POD 親和性,我們可以設置 POD 對某個 POD 的親和性,那么比如:LNMT,那么 MySQL 和 Tomcat 可以設置為更加親和 Ngninx 所在的主機或機柜,所以必須有個前提就是 POD 和 POD 怎么才是最近的,這個標準是什么,也就是什么是同一位置,怎么才能知道 node 和 node 是在一個機柜。所以可以為同一個機柜的 node 節點打上相同的標簽。

      MySQL 和 Tomcat 一定不能和 Nginx 運行在一起,這就是反親和性。

      POD 對其他 POD 的親和性,

      詳見:kubectl explain pods.spec.affinity.podAffinity

      podAffinity # POD 對其他 POD 的親和性 preferredDuringSchedulingIgnoredDuringExecution <[]Object> # 軟性親和性,盡量滿足親和性 podAffinityTerm # 親和的 POD 對象 labelSelector # 標簽選擇器對象列表 matchExpressions <[]Object> # 標簽選擇器對象,選 POD 標簽 key # 標簽 operator # 操作:比較 values <[]string> # 值 matchLabels # 集合標簽選擇器 namespaces <[]string> # 名稱空間的列表 topologyKey # 親和判斷條件 weight # 權重 1 - 100 requiredDuringSchedulingIgnoredDuringExecution <[]Object> # 硬性親和性,不滿足則 Pending labelSelector # 標簽選擇器對象列表 matchExpressions <[]Object> # 標簽選擇器對象,選 POD 標簽 key # 標簽 operator # 操作:比較 values <[]string> # 值 matchLabels # 集合標簽選擇器 namespaces <[]string> # 名稱空間的列表 topologyKey # 親和判斷條件

      如上圖,serivce:A需要調度到與service:B相同zone的toplogyKey中,可以看到node2和node3均為zone:central,由于Node2資源不足,所以service:A被調度到Node3上。

      將topologyKey改成hostname,也就是希望service:A運行在與service:B同一個node上面,但是node2由于資源不足,所以service:A也就無法完成調度。

      2.4 Taints-tolerations

      Taint需要與Toleration配合使用,讓pod避開那些不合適的node。在node上設置一個或多個Taint后,除非pod明確聲明能夠容忍這些“污點”,否則無法在這些node上運行。Toleration是pod的屬性,讓pod能夠(注意,只是能夠,而非必須)運行在標注了Taint的node上。Node反親和配置。

      tains

      taints <[]Object> # 污點對象列表 effect # 當 POD 不能容忍這個污點的時候,要采取的行為,也就是排斥不容忍污點的 POD NoSchedule # 影響調度過程,但是已經調度完成 POD 無影響 PreferNoSchedule # 影響調度過程,嘗試驅逐調度已經完成的但不容忍新污點的 POD NoExecute # 新增的污點,影響新的調度過程,且強力驅逐調度已經完成的但不容忍新污點的 POD key # 鍵 timeAdded # value # 值

      ? tolerations

      tolerations <[]Object> # 容忍度對象 effect # 能否容忍 node 上的污點驅逐策略,為空表示容忍任何驅逐策略 NoSchedule # 能容忍 node 污點的 NoSchedule PreferNoSchedule # 能容忍 node 污點的 PreferNoSchedule NoExecute # 能容忍 node 污點的 NoExecute key # 污點的鍵 operator # Exists 污點存在不管什么值,Equal 污點的值必須等值 tolerationSeconds # 容忍時間,即如果被驅逐,可以等多久再走,默認 0 秒,NoExecute 使用 value # 污點的值

      可以看到這個pod可以調度到node1/node2/node3上,假如現在調度到node1上。

      現在再來一個pod,如果需求GPUs,但是node1上已經有pod了。

      該場景就非常適合taint-toleratation,此時可以在node1上面可以打上GPU的PreferBlockScheduling。

      可以在為Node上面配置一個軟性taint,盡量排斥沒有對應toleration的Pod,此時在打分階段可以選擇滿足條件的pod。

      也可以在pod上面打上一個硬性的toleration,能夠容忍key為GPU,effect為NoSchedule,此時就可以pod調度到Node1上。

      三 華為云 Volcano 的典型批量調度算法

      3.1 云計算批量計算面臨的挑戰

      3.1.1 作業管理缺失

      Pod級別調度,無法感知.上層應用

      缺少作業概念、缺少完善的生命周期的管理

      缺少任務依賴、作業依賴支持

      3.1.2 調度策略局限

      不支持Gang-Scheduling、 Fairshaing scheduling

      不支持多場景的Resource reservation, backfill

      不支持CPU/O topology based scheduling

      3.1.3 領域計算框架支持不足

      1:1的operator部署運維復雜

      不同框架對作業管理、并行計算等要求不同

      計算密集,資源波動大,需要高級調度能力

      3.1.4 資源規劃復用、異構計算支持不足

      缺少隊列概念

      不支持集群資源的動態規劃以及資源復用

      對異構資源支持不足

      3.2 Volcano幫助批量計算面對云原生的各種挑戰

      業界首個云原生批量計算平臺.

      2019年6月.上海KubeCon正式開源

      2020年4月成為CNCF官方項目

      2021年3月發布1.2版本

      每3個月一個特性版本,最新版本v1.2.0

      社區活躍度:

      a.1.7k star, 300+ fork, 150+貢獻者

      b.5 Maintainer, 8 Reviewer

      c.30家企業、科研機構

      3.3 Volcano 總體架構和優勢

      3.3.1 總體架構

      3.3.2 優勢

      高性能:提供隊列調度、優先級調度、搶占、裝箱、資源預留、拓撲調度等豐富的調度策略,在多種場景下提升應用性能

      智能混合調度:支持在線、離線混合部署調度,提高整體資源利用效率

      應用感知:感知應用類型和特點,針對大數據、Al、HPC負載提供完善的生命周期

      集群聯邦調度:支持多集群調度和作業分發,滿足效率優先、成本優先等不同的場景訴求

      大規模:支持大規模集群調度,單集群規模支持1w節點,100w容器

      高擴展:插件化算法集成框架,提供兩級插件擴展,方便二次開發,滿足不同場景訴求

      易運維: Volcano作業提供統一 接口,避免過多Operator帶來的繁雜管理

      社區成熟: CNCF首個批量計算平臺,已支持眾多的主流AI、大數據、高性能計算框架,眾多用戶已應用于生產環境

      Volcano是一個基于Kubernetes的批處理平臺,提供了機器學習、深度學習、生物信息學、基因組學及其他大數據應用所需要而Kubernetes當前缺失的一系列特性。

      Volcano源自于華為云高性能批量計算解決方案,在支撐華為云一站式AI開發平臺ModelArts、云容器實例CCI等服務穩定運行中發揮重要作用。Volcano提供了高性能任務調度引擎、高性能異構芯片管理、高性能任務運行管理等通用計算能力,通過接入AI、大數據、基因、渲染等諸多行業計算框架服務終端用戶。(目前Volcano項目已經在Github開源)

      3.4 典型的調度算法

      Gang-scheduling:運行批處理作業(如Tensorflow/MPI)時,必須協調作業的所有任務才能一起啟動;否則,將不會啟動任何任務。如果有足夠的資源并行運行作業的所有任務,則該作業將正確執行; 但是,在大多數情況下,尤其是在prem環境中,情況并非如此。在最壞的情況下,由于死鎖,所有作業都掛起。其中每個作業只成功啟動了部分任務,并等待其余任務啟動。

      SLA:當集群資源不足時候,如果還持續的在集群中提交大作業或者小作業,會導致集群的壓力巨大,SLA調度算法運行用戶為優先級高的作業配置一個最長等待時間,等待時間到了后,系統就會為大作業進行集群資源的預留,直到這個大作業能成功運行,從而解決大作業被餓死的情況。

      TDM:基于時分復用的調度算法,用戶可以配置哪些時間段,或者哪些資源在這個時間段可以去share出來,供批處理任務來使用,可以有效提升資源利用率。

      Preempt & Reclaim:通過公平分享來支持借貸模型,一些作業/隊列在空閑時會過度使用資源。但是,如果有任何進一步的資源請求,資源“所有者”將“收回”。 資源可以在隊列或作業之間共享:回收用于隊列之間的資源平衡,搶占用于作業之間的資源平衡。

      DRF:目前的公平調度是基于DRF,并通過 plugin 插件來實現。在 OpenSession 中會先計算每個作業的 dominant resource和每個作業share的初始值;然后注冊 JobOrderFn回調函數,JobOrderFn 中接收兩個作業對象,并根據對像的 dominant resource 的 share值對作業進行排序;同時注冊EventHandler, 當Pod被分配或搶占資源時,drf根據相應的作業及資源信息動態更新share值。

      FairShare:

      不同namespace的資源可以提交到不同的queue,同一個namespace的資源也可以提交到同一個queue。

      queue中不同job直接的公平調度。

      namespace級別的公平調度。

      queue和queue之間的公平調度。

      Task- Topology:

      3個作業的執行時間總和;每個作業帶2ps + 4workers

      默認調度器執行時間波動較大。

      【云駐共創】華為云原生之Kubernetes高級調度器原理詳解(華為云 kubernetes)

      執行時間的提高量依據數據在作業中的比例而定。

      減少Pod Affinity/Anti- Affinity,提高調度器的整體性能。

      7. MinResource:

      Spark driver和executor pod競爭節點資源,overcommit情況下引發死鎖。

      通過為Driver pod和Executor Pod靜態劃分Dedicated節點解決,存在碎片率問題。

      通過為PodGroup預留minResource,防止OverCommit,合理規劃并行度,解決資源競爭導致的死鎖問題。

      無需靜態規劃專有節點,減少資源碎片,相對于靜態規劃專有節點方案,性能提升30%+。

      總結

      本節課重點介紹kubernetes的調度算法及高級調度特性,以及華為云volcano的典型調度算法。

      未來,華為云也將基于云原生技術持續創新,助力繁榮云原生生態,讓各行各業走向快速智能發展之路。將極大促進Volcano上下游社區生態構建及合作,吸引廣大云原生企業用戶深度參與,Volcano將在企業數字化、云原生轉型過程中發揮越來越重要的作用,華為云也將在云原生領域持續耕耘、持續引領創新、繁榮生態,助力各行業走向快速智能發展之路。

      本文整理自華為云社區【內容共創】活動第13期。

      https://bbs.huaweicloud.com/blogs/330939

      任務20.華為云云原生鉆石課程03:Kubernetes高級調度器原理詳解

      Kubernetes 云原生 容器

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:wps表格怎么切換經典模式(wps如何切換經典模式)
      下一篇:根據多個條件求和
      相關文章
      无码不卡亚洲成?人片| 亚洲第一网站男人都懂| 亚洲国产精品无码AAA片| 亚洲成A人片77777国产| 亚洲人成图片网站| 在线精品亚洲一区二区| 亚洲无mate20pro麻豆| 国产精品亚洲片夜色在线| 亚洲综合一区二区精品久久| 91精品国产亚洲爽啪在线观看| 久久亚洲免费视频| 久久精品亚洲日本佐佐木明希| 国产AV无码专区亚洲Av| 久久精品国产亚洲网站| 亚洲国产成人精品无码区在线观看| 亚洲熟妇丰满多毛XXXX| 亚洲中文字幕无码中文字在线| 不卡精品国产_亚洲人成在线| 久久精品国产亚洲Aⅴ蜜臀色欲| 亚洲中文字幕在线第六区| 国产精品亚洲а∨无码播放 | 亚洲精品无码av人在线观看| 亚洲熟妇无码AV在线播放| 亚洲成AV人片在| 亚洲一区免费观看| 亚洲婷婷天堂在线综合| 亚洲人成在线中文字幕| 久久亚洲精品国产亚洲老地址| 亚洲国产精品99久久久久久| 日韩亚洲人成网站| 久久精品亚洲男人的天堂| 人人狠狠综合久久亚洲婷婷| 亚洲αv久久久噜噜噜噜噜| 亚洲天天做日日做天天欢毛片| 亚洲狠狠狠一区二区三区| 亚洲人配人种jizz| 亚洲AV无码AV男人的天堂不卡| 日韩精品电影一区亚洲| 中文字幕在线亚洲精品| 西西人体44rt高清亚洲| 亚洲一区中文字幕在线电影网|