CH05 集群排程 kube scheduler

2021-10-04 06:02:34 字數 4100 閱讀 7710

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 高效能計算集群 ...