1.1 調度器簡介

來個小劉一起 裝逼吧,今天我們來學習 K8的調度器
Scheduler是 Kubernetes的調度器,主要的任務是把定義的 pod分配到集群的節點上,需要考慮以下問題:
- 公平:如何保證每個節點都能被分配資源
- 資源高效利用:集群所有資源最大化被使用
- 效率:調度的性能要好,能夠盡快地對大批量的
pod完成調度作業 - 靈活:允許用戶根據自己的需求控制調度的邏輯
Scheduler是作為單獨的程式運行的,啟動之后會一直連接 apiserver獲取 PodSpec.NodeName為空的 pod,對每個 pod都會創建一個 binding,表明該 pod應該放到哪個節點上,
1.2 調度程序

調度分為幾個部分:
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:傾向于已經有要使用鏡像的節點,鏡像總大小值越大,權重越高
通過演算法對所有的優先級專案和權重進行計算,得出最終的結果,
1.3 自定義調度器
除了 K8S自帶的調度器,可以自定義調度器,通過 spec:schedulername引數指定調度器的名字,可以為 pod選擇某個調度器進行調度,比如下面的 pod選擇 my-scheduler進行調度,而不是默認的 default-scheduler:
apiVersion: v1
kind: Pod
metadata:
name: annotation-second-scheduler
labels:
name: multischeduler-example
spec:
schedulername: my-scheduler
containers:
- name: pod-with-second-annotation-container
image: gcr.io/google_containers/pause:2.0
2.1 Node 親和性
spec.affinity.nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution(優先執行計劃):軟策略requiredDuringSchedulingIgnoredDuringExecution(要求執行計劃):硬策略
鍵值運算關系:
鍵說明Inlabel 的值在某個串列中NotInlabel 的值不在某個串列中Gtlabel 的值大于某個值Ltlabel 的值小于某個值Exists某個 label 存在DoesNotExist某個 label 不存在
軟策略:
[root@master schedule]
apiVersion: v1
kind: Pod
metadata:
name: affinity
labels:
app: node-affinity-pod
spec:
containers:
- name: with-node-affinity
image: hub.hc.com/library/myapp:v1
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- worker3
[root@master schedule]
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
affinity 1/1 Running 0 39s 10.244.2.92 worker2 <none> <none>
硬策略:
[root@master schedule]
apiVersion: v1
kind: Pod
metadata:
name: affinity2
labels:
app: node-affinity-pod
spec:
containers:
- name: with-node-affinity
image: hub.hc.com/library/myapp:v1
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- worker3
[root@master schedule]
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
affinity2 0/1 Pending 0 23s <none> <none> <none> <none>
[root@master schedule]
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 49s default-scheduler 0/3 nodes are available: 3 node(s) didn't match node selector.
2.2 Pod 親和性
spec.affinity.podAffinity/podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution(優先執行計劃):軟策略requiredDuringSchedulingIgnoredDuringExecution(要求執行計劃):硬策略
[root@master schedule]
apiVersion: v1
kind: Pod
metadata:
name: pod-2
labels:
app: pod-2
spec:
containers:
- name: pod-2
image: hub.hc.com/library/myapp:v1
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- pod-1
topologyKey: kubernetes.io/hostname
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- pod-2
topologyKey: kubernetes.io/hostname
[root@master schedule]
pod-2 0/1 Pending 0 4s <none> <none> <none> <none>
[root@master schedule]
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-1 1/1 Running 0 5s 10.244.2.94 worker2 <none> <none>
親和性/反親和性調度策略比較如下:
調度策略匹配標簽運算子拓撲域支持調度目標nodeAffinity主機In, NotIn, Exists,DoesNotExist, Gt, Lt否指定主機podAffinityPODIn, NotIn, Exists,DoesNotExist是POD與指定POD同一拓撲域podAnitAffinityPODIn, NotIn, Exists,DoesNotExist是POD與指定POD不在同一拓撲域
2.3 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驅逐出去
② 污點的設定、查看和去除
kubectl describe node node-name
kubectl taint nodes node1 key1=value1:effect
kubectl taint nodes node1 key1=value1:effect
設定了污點的 Node將根據 taint的 effect和 Pod之間產生互斥的關系, Pod將在一定程度上不會被調度到 Node上,但我們可以在 Pod上設定容忍 (Toleration) ,設定了容忍的 Pod將可以容忍污點的存在,可以被調度到存在污點的 Node上,
** toleration 的配置:**
spec:
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
tolerationSeconds: 3600
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoExecute"
- key: "key2"
operator: "Exists"
effect: "NoSchedule"
說明:
- 其中
key、vaule、effect要與Node上設定的taint保持一致 operator的值為Exists將會忽略value值tolerationSeconds:當Pod需要被驅逐時可以在Pod上繼續保留運行的時間
① 當不指定 key值時,表示容忍所有的污點 key
tolerations:
- operator: "Exists"
② 當不指定 effect值時,表示容忍所有的污點作用
tolerations:
- key: "key"
operator: "Exists"
③ 有多個 Master存在時,防止資源浪費,可以如下設定
kubectl taint nodes Node-Name node-role.kubernetes.io/master=:PreferNoSchedule
2.4 指定調度節點
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: myweb
spec:
replicas: 7
template:
metadata:
labels:
app: myweb
spec:
nodeName: worker1
nodeSelector:
type: theSelected
containers:
- name: myweb
image: hub.hc.com/library/myapp:v1
ports:
- containerPort: 80
說明:
spec.nodeName:將Pod直接調度到指定的Node節點上,會跳過Scheduler的調度策略,該匹配規則是強制匹配spec.nodeSelector:通過K8S的label-selector機制選擇節點,由調度器調度策略匹配label,而后調度Pod到目標節點,該匹配規則屬于強制約束- 給
Node打標簽:kubect; label node worker1 type=theSelected

小劉,先走一步

微信搜一搜 : 全堆疊小劉 ,獲取文章 pdf 版本
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/187011.html
標籤:Java
上一篇:手擼了一個HTTP框架:支持Spring MVC、IOC、AOP,攔截器,組態檔讀取...
下一篇:Helm 帶你飛

