汙點taints和容忍toleration_v1
汙點taints和容忍toleration
檢視taints
root@node81[14:12:09]:/home/k8s_conf/saas# kubectl describe nodes node81
...
CreationTimestamp: Tue, 10 May 2022 17:31:08 +0800
Taints: node-role.kubernetes.io/master:NoSchedule
Unschedulable: false
分別對應
effect可以取值:
- PreferNoSchedule: 儘量不要排程。
- NoSchedule: 一定不能被排程。
- NoExecute: 不僅不會排程, 還會驅逐 Node 上已有的 Pod。
- 設定taints
kubectl taint node node81 node-role.kubernetes.io/master:PreferNoSchedule
刪除taints
#root@node81[14:41:26]:/home/k8s_conf/saas# kubectl taint node node81 node-role.kubernetes.io/master:NoSchedule- node/node81 untainted #root@node81[14:41:33]:/home/k8s_conf/saas# kubectl describe nodes node81 ... CreationTimestamp: Tue, 10 May 2022 17:31:08 +0800 Taints: <none> Unschedulable: false ...
容忍
一個 Node 可以有多個汙點,一個 Pod 可以有多個容忍。
想要pod排程到有汙點node,需要pod容忍包含該node所有汙點(PreferNoShedule除外)
設定容忍tolerations
apiVersion: apps/vl kind: Deployment metadata: name: example spec: replicas: 3 template: spec: ...... tolerations: - key: "key" operator: "Equal" value: "value" effect: "NoSchedule" tolerationSeconds: 3600
tolerationSeconds用於設定多長時間以後再踢掉pod,單位秒
operator:可選值Equal 和 Exists
Exists: 匹配容忍在已有條件下的所有汙點
key為空,則匹配所有key
tolerations:
- operator: "Exists"
key不為空,effect為空,則匹配該key的所有值
tolerations:
- key: "key"
operator: "Exists"
Equal
Node 和 Pod 的 key 為 key1、value1 與 effect 相同則能排程
#汙點
key1=value1:NoSchedule
#Pod設定
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
Node 的汙點的 key、value、effect 和 Pod 容忍都相同則能排程
# 設定汙點
key1=value1:NoSchedule
key2=value2:NoExecute
# Pod設定容忍
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
- key: "key2"
operator: "Equal"
value: "value2"
effect: "NoExecute"
Node 的汙點和 Pod 的大部分都相同,不同的是 Node 汙點 effect 為 PreferNoSchedule 的,可能會排程
# 汙點
key1=value1:NoSchedule
key2=value2:NoExecute
key3=value3:PreferNoSchedule
# Pod設定容忍
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
- key: "key2"
operator: "Equal"
value: "value2"
effect: "NoExecute"
Node 的汙點和 Pod 的大部分都相同,不同的是 Node 汙點 effect 為 NoSchedule 和 NoExecute 的,不會被排程
# 汙點
key1=value1:NoSchedule
key2=value2:NoExecute
key3=value3:PreferNoSchedule
# Pod設定容忍
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
- key: "key3"
operator: "Equal"
value: "value3"
effect: "PreferNoSchedule"
驅逐
汙點的 effect
可以設定為 NoExecute時
- 立即將沒有配置容忍的 Pod 逐出。
- 設定容忍但是沒有指定 tolerationSeconds 引數的,那麼該容忍永久生效。
- 設定容忍但是有指定 tolerationSeconds 引數的,那麼在指定的時間內容忍有效,超過指定時間後將被剔除。
當某些條件為 true 時,節點控制器會自動汙染節點。內建以下汙點:
- node.kubernetes.io/not-ready: 節點尚未準備好。這對應於 NodeCondition Ready 為 false。
- node.kubernetes.io/unreachable: 無法從節點控制器訪問節點。這對應於 NodeCondition Ready 為 Unknown。
- node.kubernetes.io/out-of-disk: 節點磁碟不足。
- node.kubernetes.io/memory-pressure: 節點有記憶體壓力。
- node.kubernetes.io/disk-pressure: 節點有磁碟壓力。
- node.kubernetes.io/network-unavailable: 節點的網路不可用。
- node.kubernetes.io/unschedulable: 節點不可排程。
- node.cloudprovider.kubernetes.io/uninitialized: 當 kubelet 從 "外部" 雲提供程式開始時,此汙點在節點上設定為將其標記為不可用。來自 cloud-controller-manager 的控制器初始化此節點後,kubelet 刪除此汙點。
節點失效 pod轉移等待時間
當某個 Pod
執行所在的 Node
變成 unready
或者 unreachable
不可用狀態時,Kubernetes
可以等待該 Pod
被排程到其他節點的最長等待時間
tolerations:
- effect: NoExecutekey: node.alpha.kubernetes.io/notReady
operator: Exists
tolerationSeconds: 300
- effect: NoExecutekey: node.alpha.kubernetes.io/unreachable
key: operator: Exists
tolerationSeconds: 300
這兩個容忍度表示,該 Pod
將容忍所在節點處於 notReady
或者 unreachable
狀態維持 300
秒。 當 Kubernetes
控制器檢測到有節點處 notReady
或者 unreachable
狀態時, 將會等待 300
秒,如果超過指定時間的話 Kubernetes
將會把該 Pod
重新排程到其他節點上。