kubernetes&&基礎學習5

調度器與調度算法

調度說明

簡介

Scheduler是kubernetes的調度器,主要的任務是把定義的pod分配到集羣的節點上,需要注意以下幾點:

  • 公平性:如何保證每個節點都能被分配資源
  • 資源高效利用:集羣所有資源最大化被使用
  • 效率:調度的性能更好,能夠儘快的對大批量的Pod完成調度工作
  • 靈活:允許用戶根據自己的需求控制調度的邏輯

Scheduler是作爲單獨的程序運行的,啓動之後會一直堅挺API Server,獲取pod.spec.NodeName 爲空的pod,對每個Pod都會創建一個binding,表明該pod應該放到哪個節點上

調度過程

調度分爲幾個部分:首先是過濾掉不滿足條件的節點,這個過程稱爲predicate;然後對通過的節點按照優先級排序,這個是priority;最後從中選擇優先級最高的節點。如果中間任何一步驟有錯誤,就直接返回錯誤。

predicate

predicate的算法有哪些:

  • PodFitsResources : 節點上剩餘的資源是否大於pod請求的資源
  • PodFitsHost : 如果Pod指定了NodeName,檢查節點名稱是否和NodeName匹配
  • PodFitsHostPorts : 節點上已經使用的port是否和pod申請的port衝突
  • PodSelectorMatches : 過濾掉和Pod指定的label不匹配的節點
  • NoDiskConflict : 已經mount的volume和Pod指定的volume不衝突,除非他們都是隻讀

如果在predicate過程中沒有合適的節點,Pod就會一直在 pending 狀態,不斷重試調度,直到有節點滿足條件。經過這個步驟,如果有多個節點滿足條件,就繼續priorities過程,即按照優先級大小對節點排序
優先級由一系列鍵值對組成,鍵是該優先級的名稱,值爲他的權重,優先級的選項有如下幾種:

  • LeastRequestedPriority : 通過計算CPU和Memory的使用率來決定權重,使用率越低權重越高,即該優先級指標傾向於資源使用比例更低的節點。
  • BalancedResourceAllocation : 節點上CPU和Memory使用率越接近,權重越高。這個應該和上面的一起使用,不應該單獨使用。
  • ImageLocalityPriority : 傾向於已經有要使用鏡像的節點,鏡像總大小值越大,權重越高

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

自定義調度器

除了kubernetes自帶的調度器,你可以通過 spec:schedulername 的方式指定調度器名稱
在這裏插入圖片描述

調度親和性

節點親和性

pod.spec.nodeAffinity

  • preferredDuringSchedulingIgnoredDuingExecution : 軟策略
  • requiredDuringSchedulingIgnoredDuringExecution : 硬策略

親和性指的是pod資源的分配更傾向於哪個Node節點
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

Pod親和性

pod.spec.affinity.podAffinity/podAntiAffinity

  • preferredDuringSchedulingIgnoredDuringExecution : 軟策略
  • requiredDuringSchedulingIIgnoredDuringExecution : 硬策略

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

污點

Taint 和 Toleration

節點親和性,是Pod的一種屬性(偏好或硬性要求),它使pod被吸引到一類特定的節點。
Taint則相反,它使節點能後排斥一類特定的pod。
Taint和Toleration相互配合,可以用來避免pod被分配到不適合的節點上。
每個節點上都可以應用一個或多個Taint,這表示對於那些不能容忍這些Taint的pod,是不會被該節點接受的。
如果將Toleration應用於Pod上,則表示這些pod可以(但不要求)被調度到具有匹配Taint的節點上

污點

污點(Taint)的組成

使用kubectl taint 命令可以給某個Node節點設置污點,Node被設置上污點之後就和Pod之間存在了一種相斥的關係,可以讓Node拒絕Pod的調度執行,甚至將Node已經存在的Pod驅逐出去

key=value:effect

每個污點有一個key和value作爲污點的標籤,其中value可以爲空,effect描述污點的作用。當前taint effect可以支持如下三個選項:

  • NoSchedule : 表示k8s將不會把Pod調度到具備該污點的Node上
  • PreferNoSchedule : 表示k8s將盡量避免將Pod調度到具備該污點的Node上
  • NoExecute : 表示k8s將不會將Pod調度到具有該污點的Node上,同時會將Node上已經存在的Pod驅逐出去

在這裏插入圖片描述

容忍(Tolerations)

設置了污點的Node將根據Taint的effect:NoSchedule、PreferSchedule、NoExecute和Pod之間產生互斥的關係,Pod將在一定程度上不會被調度到Node上。但我們可以在Pod上設置容忍(Toleration),意思是設置了容忍的Pod將可以容忍污點的存在,可以被調度到存在污點的Node上
在這裏插入圖片描述
在這裏插入圖片描述

固定節點

指定調度節點

Pod.spec.nodeName 將Pod直接調度到指定的Node節點上,會跳過Scheduler的調度策略。該匹配規則是強制匹配。
在這裏插入圖片描述
Pod.spec.nodeSelector:通過kubernetes的label-selector機制選擇節點,由調度器調度策略匹配label,而後調度Pod到目標節點,該匹配規則屬於強制約束

# 指定Node節點(k8s-node1)併爲其設置標籤(鍵值對爲:鍵disk對應值ssd)
kubectl  label  node  k8s-node1  disk=ssd

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章