1. 程式人生 > 其它 >汙點taints和容忍toleration_v1

汙點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

分別對應=:

=node-role.kubernetes.io/master

= 空

=NoSchedule

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 重新排程到其他節點上。

參考:http://www.mydlq.club/article/69/#