1. 程式人生 > 實用技巧 >汙點和容忍度

汙點和容忍度

汙點:主體是node,在node上標記特定的鍵值對,以此來標識該node的特殊屬性
容忍度:主體是pod,當pod被排程到有汙點的node時,該pod能否容忍node的汙點標記

在檢視master節點的資訊

~]# kubectl describe node master-node | grep Taints
Taints:     node-role.kubernetes.io/master:NoSchedule

可以看到master的節點叢集在建立時已經被自動標記了taint,保證了建立未經指定容忍度的pod時,不會排程到master節點

節點汙點

三種類型:

  • NoSchedule:不能容忍此汙點的新Pod物件不可排程至當前節點,屬於強制型約束關係,節點上現存的Pod物件不受影響。
  • PreferNoSchedule:NoSchedule的柔性約束版本,即不能容忍此汙點的新Pod物件儘量不要排程至當前節點,不過無其他節點可供排程時也允許接受相應的Pod物件。節點上現存的Pod物件不受影響。
  • NoExecute:不能容忍此汙點的新Pod物件不可排程至當前節點,屬於強制型約束關係,而且節點上現存的Pod物件因節點汙點變動或Pod容忍度變動而不再滿足匹配規則時,Pod物件將被驅逐。

汙點設定:

kubectl taint nodes node2 test=slave:NoSchedule

撤銷汙點:

kubectl taint nodes node2 test:NoSchedule-

pod容忍度

當node已經設定了汙點,通過設定容忍度將pod排程到相應的節點上

示例:

...
tolerations:
  - key: "key"
    operator: "Equal" 
    value: "value"
    effect: "NoScheduale"
...

operator: 沒指定預設為Equal,當為Equal時value必須指定並且key的值和vaule的值匹配才能執行,當為Exists時可以不寫value

此外,空的 key(是指key沒有指定,而不是指key為空字串) 如果再配合operator Exists 就能匹配所有的 key 與 value,也是能容忍所有 node 的所有 Taints,空的 effect 匹配所有的 effect

當配置NoExecute時,pod可以通過設定tolerationSeconds(秒),表示pod可以容忍該節點並在該節點繼續執行指定的時間

比如,一個使用了很多本地狀態的應用程式在網路斷開時,仍然希望停留在當前節點上執行一段較長的時間, 願意等待網路恢復以避免被驅逐。在這種情況下,Pod 的容忍度可能是下面這樣的:

tolerations:
- key: "node.kubernetes.io/unreachable"
  operator: "Exists"
  effect: "NoExecute"
  tolerationSeconds: 6000

在k8s的叢集中,當某種條件為真時,節點控制器會自動給節點新增一個汙點。包括如下:

  • node.kubernetes.io/not-ready:節點未準備好。這相當於節點狀態 Ready 的值為 "False"。
  • node.kubernetes.io/unreachable:節點控制器訪問不到節點. 這相當於節點狀態 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 將刪除這個汙點。

daemonset 容忍度的新增

DaemonSet 控制器自動為所有守護程序新增如下 NoSchedule 容忍度(不同版本有差別)以防 DaemonSet 崩潰:

  • node.kubernetes.io/memory-pressure
  • node.kubernetes.io/disk-pressure
  • node.kubernetes.io/out-of-disk (只適合關鍵 Pod)
  • node.kubernetes.io/unschedulable (1.10 或更高版本)
  • node.kubernetes.io/network-unavailable (只適合主機網路配置)
    新增上述容忍度確保了向後相容,您也可以選擇自由向 DaemonSet 新增容忍度

另外:在叢集執行的過程中當節點由於資源的緊缺,會出現叢集自動將資源緊缺的節點標記汙點,讓無法忍受的pod自動剝離該node