污點和容忍度


污點:主體是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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM