scheduler是kubernetes的排程器,主要任務是把定義的pod分配到集群的節點上。排程要考慮以下幾點:
公平:保證每個節點都能被分配資源
資源高效利用:集群所有資源最大化被使用
排程效率:盡快地完成大批量的pod的排程工作
靈活:允許使用者根據自己的需求控制排程的邏輯
scheduler是作為單獨的程式執行的,啟動之後會一直連線api server,獲取podspec.nodename為空的pod,為每個pod都會建立乙個binding,表明該pod應該放到哪個節點上
排程分為兩個步驟:
predicate:預選,過濾掉不滿足條件的節點。
priority:優選,對符合條件的節點按照優先順序排序,從中選擇優先順序最高的節點
如果中間任何一步驟有錯誤,就直接返回錯誤
預選步驟:
podfitsresources:節點剩餘資源是否大於 pod請求資源
podfitshost:如果pod指定了nodename,檢查節點名稱是否與nodename匹配
podfitshostports:節點上已經使用的port是否和pod申請的port衝突
podselectormatches:過濾掉和pod指定的label不匹配的節點
nodiskconflict:已經mount的volume和pod指定的volume不能衝突,都是唯讀不衝突readonlymany
如果沒通過以上預選條件,pod會一直pending狀態,不斷重試排程,直到有節點滿足條件。
經過預選,如果有多個節點滿足條件,就會開始優選過程:按照優先順序大小進行排序
優先順序專案由一系列鍵值對組成,鍵--優先順序項的名稱,值---優先順序項的權重。優先順序常見演算法包括:
leastrequestpriority:通過cpu和memory的使用率來決定權重。使用率越低權重越高。傾向於選擇資源使用率更低的節點
balancedresourceallocation:節點上cpu和memory使用率越接近,權重越高。配合leastrequestpriority一起使用,不單獨使用
imagelocaltiypriority:節點要使用映象的總大小值越大,權重越高
根據優先順序專案和權重對節點進行計算排序,得出結果。
自定義排程器實質上是根據需要定義 優選 這個過程。
示例:
apiversion: v1
- k8s-node02
1)檢視節點標籤:
# kubectl get node --show-labels
2)鍵值運算子:
in:label的值在某個列表中
notin:label的值不在某個列表中
gt:label的值大於指定值
lt:label的值小於指定值
exists:指定label存在
doesnotexist:指定label不存在
示例:
apiversion: v1
kind: pod
metadata:
name: podaffinity1test
namespace: default
labels:
version: v1
spec:
containers:
- name: podaffinity-pod01
image: nginx:latest
imagepullpolicy: ifnotpresent
affinity:
podaffinity:
requiredduringschedulingignoredduringexecution:
- labelselector:
matchexpressions:
operator: in
values:
- nodeaffinitytest
topologykey: kubernetes.io/hostname
preferredduringschedulingignoredduringexecution:
- weight: 1
podaffinityterm:
labelselector:
matchexpressions:
- key: version
operator: in
values:
- v1
topologykey: kubernetes.io/hostname
汙點使用:
汙點型別:
noschedule(不排程)
prefernoschedule(盡量不排程)
noexecute(不排程,並且驅離節點上已存在但不能容忍該汙點的pod)
容忍使用:
定義位置 pod.spec.tolerations
示例
apiversion: v1
effect: "noexecute"
說明:
operator選項為:equal、exists
equal要求容忍的 key、value、effect 與 汙點指定完全一致
exists: 預設都容忍
- operations:"exists" 容忍所有汙點
- key: "key1"
operator: "exists"
容忍key1的所有值和所有 effect
不能容忍noexecute的情況下,tolerationseconds 指定被驅離前可以繼續執行的時間
和nodeaffinity 硬策略required功能重複,這裡簡單介紹
方式一:打noexecute型別的汙點驅離pod
方式二:
使用cordon命令將node1標記為不可排程
kubectl cordon ip-172-35-88-242
執行drain命令,將執行在node1上執行的pod平滑的趕到其他節點上
kubectl drain ip-172-35-88-242
使用uncordon命令解鎖node1,使其重新變得可排程
kubectl uncordon ip-172-35-88-242
3 集群容錯
invoker 封裝了provider位址和service介面資訊 directory 相當於是invoker的集合,它的值是可變化的,比如註冊中心推送的變更資料。cluster 將directory裡的多個invoker偽裝成乙個invoker,偽裝過程包含了容錯邏輯,預設是failover,呼叫...
2021資料結構CH05 樹與二叉樹
include include define maxsize 5 define elemtype int 假設元素型別為int typedef struct bitreebitnode,bitree typedef structstk void initstk stk s 入棧操作 bool pus...
(一)集群介紹
一 集群的種類 集群系統主要分為 1 ha 高可用集群,又叫雙機熱備。a 2臺機器a,b,正常是a提供服務,b待命閒置,當a宕機或服務宕掉,會切換至b繼續提供服務 b 常用的高可用開源軟體 heartbeat和keepalived 可以做負載均衡 2 lb 負載均衡集群 3 hpc 高效能計算集群 ...