日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

k8s-scheduler调度规则

發布時間:2023/12/16 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 k8s-scheduler调度规则 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 一、預選階段
    • 1、第一種類型,叫作 GeneralPredicates。
    • 2、第二種類型,是與 Volume 相關的過濾規則。
    • 3、第三種類型,是宿主機相關的過濾規則。
    • 4、第四種類型,是 Pod 相關的過濾規則。
  • 二、優選階段
  • 三、調度源碼
  • 總結


在 Kubernetes 項目中,默認調度器的主要職責,就是為一個新創建出來的 Pod,尋找一個最合適的節點(Node)。

  • 從集群所有的節點中,根據調度算法挑選出所有可以運行該 Pod 的節點
  • 從第一步的結果中,再根據調度算法挑選一個最符合條件的節點作為最終結果。
    預選,優選,綁定三個階段
  • 一、預選階段

    Kubernetes 中,默認的調度策略有如下三種:

    1、第一種類型,叫作 GeneralPredicates。

  • PodFitsResources 計算的就是宿主機的 CPU 和內存資源等是否夠用,PodFitsResources 檢查的只是 Pod 的 requests 字段
  • PodFitsHost 檢查的是,宿主機的名字是否跟 Pod 的 spec.nodeName 一致。這里應該指的是pod中已指定的spec.nodeName
  • PodFitsHostPorts 檢查的是,Pod 申請的宿主機端口(spec.nodePort)是不是跟已經被使用的端口有沖突。
  • PodMatchNodeSelector 檢查的是,Pod 的 nodeSelector 或者 nodeAffinity 指定的節點,是否與待考察節點匹配,等等。
  • 2、第二種類型,是與 Volume 相關的過濾規則。

  • NoDiskConflict 檢查的條件,是多個 Pod 聲明掛載的持久化 Volume 是否有沖突
  • MaxPDVolumeCountPredicate 檢查的條件,則是一個節點上某種類型的持久化 Volume 是不是已經超過了一定數目
  • VolumeZonePredicate,則是檢查持久化 Volume 的 Zone(高可用域)標簽,是否與待考察節點的 Zone 標簽相匹配。
  • VolumeBindingPredicate 的規則。它負責檢查的,是該 Pod 對應的 PV 的 nodeAffinity 字段,是否跟某個節點的標簽相匹配。
  • 3、第三種類型,是宿主機相關的過濾規則。

  • PodToleratesNodeTaints,負責檢查的就是我們前面經常用到的 Node 的“污點”機制。
  • NodeMemoryPressurePredicate,檢查的是當前節點的內存是不是已經不夠充足,如果是的話,那么待調度 Pod 就不能被調度到該節點上。
  • 4、第四種類型,是 Pod 相關的過濾規則。

  • 這一組規則,跟 GeneralPredicates 大多數是重合的。而比較特殊的,是 PodAffinityPredicate。這個規則的作用,是檢查待調度 Pod 與 Node 上的已有 Pod 之間的親密(affinity)和反親密(anti-affinity)關系

  • 上面這四種類型的 Predicates,就構成了調度器確定一個 Node 可以運行待調度 Pod 的基本策略。在具體執行的時候, 當開始調度一個 Pod 時,Kubernetes 調度器會同時啟動 16 個 Goroutine,來并發地為集群里的所有 Node 計算 Predicates,最后返回可以運行這個 Pod 的宿主機列表。


    二、優選階段

    在 預選 階段完成了節點的“過濾”之后,Priorities 階段的工作就是為這些節點打分。這里打分的范圍是 0-10 分,得分最高的節點就是最后被 Pod 綁定的最佳節點。
    1、最常用到的一個打分規則,是 LeastRequestedPriority。它的計算方法,可以簡單地總結為如下所示的公式:

    score = (cpu((capacity-sum(requested))10/capacity) + memory((capacity-sum(requested))10/capacity))/2

    2、LeastRequestedPriority 一起發揮作用的,還有 BalancedResourceAllocation。它的計算公式如下所示:

    score = 10 -variance(cpuFraction,memoryFraction,volumeFraction)*10

    其中,每種資源的 Fraction 的定義是 :Pod 請求的資源 / 節點上的可用資源。而 variance 算法的作用,則是計算每兩種資源 Fraction 之間的“距離”。而最后選擇的,則是資源 Fraction 差距最小的節點。所以說,BalancedResourceAllocation 選擇的,其實是調度完成后,所有節點里各種資源分配最均衡的那個節點,從而避免一個節點上 CPU 被大量分配、而 Memory 大量剩余的情況。

    3、NodeAffinityPriority、TaintTolerationPriority 和 InterPodAffinityPriority 這三種 Priority。顧名思義,它們與前面的 PodMatchNodeSelector、PodToleratesNodeTaints 和 PodAffinityPredicate 這三個 Predicate 的含義和計算方法是類似的。但是作為 Priority,一個 Node 滿足上述規則的字段數目越多,它的得分就會越高。

    4、在默認 Priorities 里,還有一個叫作 ImageLocalityPriority 的策略。它是在 Kubernetes v1.12 里新開啟的調度規則,即:如果待調度 Pod 需要使用的鏡像很大,并且已經存在于某些 Node 上,那么這些 Node 的得分就會比較高。當然,為了避免這個算法引發調度堆疊,調度器在計算得分的時候還會根據鏡像的分布進行優化,即:如果大鏡像分布的節點數目很少,那么這些節點的權重就會被調低,從而“對沖”掉引起調度堆疊的風險。


    三、調度源碼


    1、UpdateNodeNameToInfoMap根據node的cache更新信息,如果node已被移除,則將map的對應節點信息刪掉,如果map中不存在節點的信息,將該節點的信息集合加入map中,這些信息集合運用于后期的pod調度的邏輯判斷,對于么個節點,這些信息包括:

    a、節點的node資源信息;
    b、在該節點上的pod請求和可分配的資源總和,包括cpu、內存、gpu、容許的pod總數、存儲等;
    c、內存、磁盤壓力情況;
    d、節點上的占用端口;
    e、Pod的親和性;
    f、節點taints容忍性;

    2、findNodesThatFit是schedule的預選,該函數根據配置的 Predicates Policies會返回一組符合Policies的nodes,最后將這組nodes作為優選的輸入。如果經過預選后返回的節點只有一個,那么直接將該節點的名稱返回,如果多余1個,將繼續優選。
    priorityMetaProducer獲取pod effect為空或者為PreferNoSchedule,將toleration加入toleration列表,獲取selector與pod相關的rc、rs、service加入到selector列表。獲取pod中container請求的cpu、內存大小綜合,如果container未設定,cpu默認為100,內存默認為209715200。
    獲取pod的親和性。
    關于PreferNoSchedule、NoSchedule、NoExecute的介紹如下:
    對比一個 node 上所有的 taints,忽略掉和 pod 中 toleration 匹配的 taints,遺留下來未被忽略掉的所有 taints 將對 pod 產生 effect。
    a、至少有 1 個未被忽略的 taint 且 effect 是 NoSchedule 時,則 k8s 不會將該 pod 調度到這個 node 上
    b、不滿足上述場景,但至少有 1 個未被忽略的 taint 且 effect 是 PreferNoSchedule 時,則 k8s 將嘗試不把該 pod 調度到這個 node 上
    c、至少有 1 個未被忽略的 taint 且 effect 是 NoExecute 時,則 k8s 會立即將該 pod 從該 node 上驅逐(如果已經在該 node 上運行),或著不會將該 pod 調度到這個 node 上(如果還沒在這個 node 上運行)

    總結

    調度會獲取pod中container請求的cpu、內存大小,如果container未設定,cpu默認為100,內存默認為209715200,建議合理設置resource request/limit,防止調度不均,節點熱度不同的問題

    總結

    以上是生活随笔為你收集整理的k8s-scheduler调度规则的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。