k8s pod 在節點間排程控制

2021-09-13 13:26:04 字數 3494 閱讀 5509

部落格作為學習筆記記錄,若有理解,表述錯誤,歡迎指出。

k8s起pod時,會通過排程器scheduler選擇某個節點完成排程,選擇在某個節點上完成pod建立。

當需要在指定pod執行在某個節點上時,可以通過以下幾種方式:

1. 在部署pod的yaml中,指定nodename

指定了nodename的pod會直接跳過scheduler的排程邏輯,直接寫入podlist列表,該匹配規則是強制匹配。

eg:

apiversion: extensions/v1beta1

kind: deployment

metadata:

name: tomcat-deploy

spec:

replicas: 1

template:

metadata:

labels:

spec:

nodename: k8s.node1 #指定排程節點為k8s.node1

containers:

- name: tomcat

image: tomcat:8.0

ports:

- containerport: 8080

2. 在部署pod的yaml中,指定nodeselector

通過kubernetes的label-selector機制進行節點擊擇,由scheduler排程策略matchnodeselector進行label匹配,排程pod到目標節點,該匹配規則是強制約束。啟用節點擊擇器的步驟為:

起pod步驟:

i. 先給node打上對應的label

#標記規則:kubectl label nodes =kubectl label nodes k8s.node1 cloudnil.com/role=dev

#確認標記

[email protected]:~# kubectl get nodes k8s.node1 --show-labels

name        status    age       labels

k8s.node1   ready     29d       beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,cloudnil.com/role=dev,kubernetes.io/hostname=k8s.node1

ii. 起pod的時候,在yaml中指定nodeselector

apiversion: extensions/v1beta1

kind: deployment

metadata:

name: tomcat-deploy

spec:

replicas: 1

template:

metadata:

labels:

spec:

nodeselector:

cloudnil.com/role: dev #指定排程節點為帶有label標記為:cloudnil.com/role=dev的node節點

containers:

- name: tomcat

image: tomcat:8.0

ports:

- containerport: 8080

3.  使用汙點(taint)

taint是k8s 1.6版本開始提供的功能,在k8s同樣用於節點排程的,還有乙個容忍(tolerations)功能

汙點的組成為

key=value:effect
effect支援的型別包括一下三類:

noschedule:表示k8s將不會將pod排程到具有該汙點的node上

prefernoschedule:表示k8s將盡量避免將pod排程到具有該汙點的node上

noexecute:表示k8s將不會將pod排程到具有該汙點的node上,同時會將node上已經存在的pod驅逐出去

# 設定汙點

kubectl taint nodes kube-node1 key1=value1:noschedule

# 去除汙點

kubectl taint nodes kube-node1 key1:noschedule-

此汙點可以通過kubectl describe node 檢視

4. 容忍(tolerance)

當參與taint給node打算noschedule的汙點之後,pod無法排程到該節點上執行,但有時我們希望某些pod仍然能執行到該node上時,可以通過在部署pod的yaml中新增tolerance,使pod能跳過汙點,排程到對應節點上:

eg:

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"

其中:

operator為equal時,key, vaule, effect要與node上設定的taint保持一致

operator為exist時,將會忽略value的值

tolerationseconds指當pod需要被驅逐時,仍能在node上保留執行的時間

當tolerance不指定effect時,將容忍汙點的所有作用

tolerations:

- key: "key"

operator: "exists"

5. cordon/uncordon/drain

這幾個命令用於k8s節點維護,用法:

kubectl cordon
此時通過

kubectl get node -o wide
可以看到node的狀態為scheduledisable,即該節點為不可排程狀態。

可以通過uncordon來恢復node狀態:

kubectl uncordon
當cordon node之後,原來執行在node上的pod,當超過保活週期之後,將會重新排程在其他node上執行。如果想讓pod馬上實現遷移,可以使用drain完成。

drain:標記節點為不可排程,並驅逐節點上的pod,用法:

kubectl drain
注意:drain不只是當node被cordon時才適用,其實當node正常執行時,也可以用drain將執行在該node的pod驅趕出去

ref:

k8s pod指定在master節點上執行

在某些場景,例如資源有限或特殊的拓撲結構下,需要將某些服務可以或者指定到k8s的master節點進行執行。這時候就需要通過修改pod的配置,使其可以在任意節點上執行 包括master和node tolerations key node role.kubernetes.io master effect...

k8s pod的yaml檔案詳解

apiversion v1 版本 kind pod 型別,pod metadata 元資料 name string 元資料,pod的名字 namespace string 元資料,pod的命名空間 labels 元資料,標籤列表 name string 元資料,標籤的名字 annotations 元...

k8s pod的狀態為evicted

使用kubectl get pods,發現很多pod的狀態為evicted。原因eviction,即驅趕的意思,意思是當節點出現異常時,kubernetes將有相應的機制驅趕該節點上的pod。多見於資源不足時導致的驅趕。解決方案 排查資源和異常原因,防止新的驅趕產生。使用如下命令刪除舊驅趕的遺留 k...