9. 老闆2年不加薪,我用篇文章加了2K
1.1 排程器簡介
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
相關文章
- [老闆我可以加薪嗎?]手把手教你加薪怎麼談,絕對乾貨··
- 做完小程式專案、老闆給我加了6k薪資~
- 過年了,如何同老闆談加薪彙總貼
- 工作不到一年,做出了100k系統,老闆給我升職加薪
- 程式設計師該怎樣和老闆談論升職加薪程式設計師
- 邦芒職場:四類職場人讓老闆心甘情願加薪
- 軟體測試員,如何跟老闆談薪資和加薪的事情?
- 老闆畫了個餅,我信了
- 老闆:用float儲存金額為什麼要扣我工資
- 老闆居然讓我在Java專案中“造假”Java
- 一個不像老闆的好老闆
- 老闆說我年紀大,可我正式當打之年!
- 老闆讓我 7 天研究一個 Plausible 統計
- 老闆防止我上班摸魚,給我裝了個chrome外掛Chrome
- 厲害了,我用“深度學習”寫了個老闆探測器(附原始碼)深度學習原始碼
- 如果你的公司還沒有企業級班車應用,把這篇文章轉給你老闆
- 不建議小老闆轉型做短視訊和直播
- 敏捷創業(1)問問自己適不適合當老闆?敏捷創業
- 為什麼工廠老闆們從不「迷信」人工智慧?人工智慧
- 同時在多個 Git 分支上工作,老闆要榨乾我Git
- 如果你是老闆,你會不會踢了這樣的員工?
- 一款上班摸魚神器!還不會被老闆發現
- 老闆說相機APP實現美團功能!聽完我哭了。。。。。。。APP
- 老闆要我開發一個簡單的工作流引擎
- 老闆:小X,我這個Android系統你安排定製下Android
- 我用MRS-ClickHouse構建的使用者畫像系統,讓老闆拍手稱讚
- 效能優化 (六) 老闆問你我們們 APP 耗電量,看完這篇文章不僅能知道還能做出對應優化。優化APP
- 這個網路安全周影片老闆足足讓我看了三遍
- 老闆怎麼辦,我們網站遭到DDoS攻擊又掛了?網站
- 老闆說laravel太慢讓我用rust寫web重構公司幾年前的專案怎麼辦?LaravelRustWeb
- 來自老闆的死亡拷問!
- 孟老闆 BaseAdapter封裝(五) ListAdapterAPT封裝
- 老闆說“把系統升級到https”,我用一個指令碼實現了,而且永久免費!HTTP指令碼
- git加了.gitignore檔案不生效Git
- 15萬預算老闆給我們買了臺工作車,老司機接車後表示真的香
- Hides for Mac(隱藏程式Mac老闆鍵) v5.4.1啟用版IDEMac
- L2-042 老闆的作息表
- 老闆今天問我為什麼公司的資料庫這麼爛,我是這樣回答的......資料庫