摘要:對應的又給新增了配套屬性容忍,用于表示這些可以但不強制要求被調度到具有相應的上。的默認值有幾個特殊情況為空并且等于,表示匹配了所有的,和。用來指定在添加了的后,能容忍該的可停留在上的時間。目的是確保在出現或的問題時,永遠不會被驅逐。
一、概述
前一篇文章講解了 Kubernetes 親和性調度, 所涉及的內容都是描述 pod 的屬性,來聲明此 pod 希望調度到哪類 nodes。而本文介紹的 Taint(污點) 剛好相反,它是node 的一個屬性,允許 node 主動排斥 pod 的調度。
對應的 k8s 又給 pod 新增了配套屬性 toleration(容忍) ,用于表示這些 pod 可以(但不強制要求)被調度到具有相應 taints 的 nodes 上。
這兩者經常一起搭配,來確保不將 pod 調度到不合適的 nodes。
看下 taint & toleration 結構體,下面足點介紹時會涉及相關字段。
type Taint struct { Key string Value string Effect TaintEffect // add taint 的時間點 // 只有 Effect = NoExecute, 該值才會被 nodeController 寫入 TimeAdded *metav1.Time } type Toleration struct { Key string Operator TolerationOperator Value string Effect TaintEffect // 容忍時間 TolerationSeconds *int64 } type TaintEffect string const ( TaintEffectNoSchedule TaintEffect = "NoSchedule" TaintEffectPreferNoSchedule TaintEffect = "PreferNoSchedule" TaintEffectNoExecute TaintEffect = "NoExecute" ) type TolerationOperator string const ( TolerationOpExists TolerationOperator = "Exists" TolerationOpEqual TolerationOperator = "Equal" )二、Taint
我們可以對 node 設置多個 taints,當然也可以在 pod 配置相同個數的 tolerations。影響調度和運行的具體行為,我們可以分為以下幾類:
如果至少有一個 effect == NoSchedule 的 taint 沒有被 pod toleration,那么 pod 不會被調度到該節點上。
如果所有 effect == NoSchedule 的 taints 都被 pod toleration,但是至少有一個 effect == PreferNoSchedule 沒有被 pod toleration,那么 k8s 將努力嘗試不把 pod 調度到該節點上。
如果至少有一個 effect == NoExecute 的 taint 沒有被 pod toleration,那么不僅這個 pod 不會被調度到該節點,甚至這個節點上已經運行但是也沒有設置容忍該污點的 pods,都將被驅逐。
三、Toleration再看下 PodSpec 配置 Tolerations,其中的 key、value、effect 與 Node Taint 設置需要保持一致,operator 支持兩類:
Exists: 這個配置下,不需要指定 value。
Equal: 需要配置 value 值。(operator 的默認值)
有幾個特殊情況:
key 為空并且 operator 等于 Exists,表示匹配了所有的 keys,values 和 effects。換句話說就是容忍了所有的 taints。
tolerations: - operator: "Exists"
effect 為空,則表示匹配所有的 effects(NoSchedule、PreferNoSchedule、NoExecute)
tolerations: - key: "key" operator: "Exists"
還有一個 TolerationSeconds,該值與 effect 為 NoExecute 配套使用。用來指定在 node 添加了 effect = NoExecute 的 taint 后,能容忍該 taint 的 pods 可停留在 node 上的時間。
例如:
tolerations: - key: "key1" operator: "Equal" value: "value1" effect: "NoExecute" tolerationSeconds: 3600
表示如果這個 pod 已經運行在 node 上并且該 node 添加了一個對應的 taint,那么這個 pod 將會在 node 上停留 3600 秒后才會被驅逐。但是如果 taint 在這個時間前被移除,那么這個 pod 也就不會被驅逐了。
來個比較形象的圖,描述下:
該圖參考: Taints and tolerations, pod and node affinities demystified · Banzai Cloud四、內置行為
kubernetes 1.6 版本,node controller 會跟進系統情況自動設置 node taint 屬性。
內置 taint key 如下:
node.kubernetes.io/not-ready: 節點尚未就緒
node.kubernetes.io/unreachable: 節點無法被訪問
node.kubernetes.io/unschedulable: 節點不可調度
node.kubernetes.io/out-of-disk: 節點磁盤不足
node.kubernetes.io/memory-pressure: 節點有內存壓力
node.kubernetes.io/disk-pressure: 節點有磁盤壓力
node.kubernetes.io/network-unavailable: 節點網絡不可用
node.kubernetes.io/pid-pressure: 節點有 pid 壓力
node.cloudprovider.kubernetes.io/uninitialized: 云節點未初始化
node.cloudprovider.kubernetes.io/shutdown: 云節點已下線
kubernetes 會通過 DefaultTolerationSeconds admission controller 為創建的 pod 添加兩個默認的 toleration: node.kubernetes.io/not-ready 和 node.kubernetes.io/unreachable,并且設置 tolerationSeconds = 300。當然這個默認配置,用戶可以自行覆蓋。
這些自動添加的默認配置,確保 node 出現問題后,pod 可以繼續在 node 上停留 5 分鐘。
DefaultTolerationSeconds admission controller 設置的 tolerationSeconds 值,也可以由用戶指定。
具體參考: https://github.com/kubernetes...
還有一個默認行為,就是 DaemonSet。
所有 DaemonSet 創建的 pod 都會添加兩個 toleration: node.alpha.kubernetes.io/unreachable 和 node.alpha.kubernetes.io/notReady。設置 effect = NoExecute,并且不指定 tolerationSeconds。
目的是確保在 node 出現 unreachable 或 notReady 的問題時,DaemonSet Pods 永遠不會被驅逐。
專用節點
如果你希望將一組節點專用于特定的用戶,那可以將這些節點設置 taints: kubectl taint nodes nodename dedicated=groupName:NoSchedule, 然后為 pods 設置對應的 tolerations。
如果你希望節點被專用并且確保服務僅使用這批節點,那么你還應該向這批節點設置 labels (dedicated=groupName),并且為對應的 pods 設置 NodeAffinity,以控制 pods 只能跑到這批節點上。
具有特殊硬件的節點
有部分帶有特殊硬件的節點,比如 GPU、FPGA 等,要確保不將不需要專用硬件的 pods 調度到這些節點。也可以和 專有節點 一樣的方式設置 taints:kubectl taint nodes nodename special=true:NoSchedule 或 kubectl taint nodes nodename special=true:PreferNoSchedule。建議還可以通過 Extended Resources 和 ExtendedResourceToleration admission controller 來更方便的調度依賴特殊硬件的 pods,而不需要手動添加容器的 toleration
基于 taint 的驅逐
前面也提到了,可以通過 NoExecute taint 來驅逐節點上已經運行的 pods。
五、參考資料community/taint-toleration-dedicated.md at master · kubernetes/community · GitHub
community/taint-node-by-condition.md at master · kubernetes/community · GitHub
Taints and Tolerations
Taints and tolerations, pod and node affinities demystified · Banzai Cloud
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/32906.html
摘要:對應的可以給設置容忍讓能夠對有污點的節點設置容忍,將調度到該節點。一般是配合使用的。能容忍的污點。 - -作者:[SRE運維博客](https://www.cnsre.cn/ )博客地址:[https://www.cnsre.cn/](https://www.cnsre.cn/) 文章地址:??https://www.c...
摘要:的調度機制組件調度器會將調度到資源滿足要求并且評分最高的上。這個特性的設計初衷是為了替代,并擴展更強大的調度策略。和完全相同,以進行強制的約束。軟規則除了,,還有一條軟規則配置后,沒有相關污點策略的會盡量避免調度到該上。 k8s的調度機制 scheduler組件 k8s調度器會將pod調度到資源滿足要求并且評分最高的node上。我們可以使用多種規則比如:1.設置cpu、內存的使用要求;...
摘要:的坑和解決方法鏡像被墻,需要自己的鏡像,然后改。解決辦法是清空目錄,然后將拷貝過來安裝對應版本的。默認不允許往節點裝東西,強行設置下允許自己的無視沒權限 k8s 1.12.1 的坑和解決方法 pull 鏡像: gcr.io 被墻,需要 pull 自己的鏡像,然后改 tag。具體需要 pull 哪些鏡像呢,kubeadm config images 可查看我自己 build 的都放到了 ...
摘要:的坑和解決方法鏡像被墻,需要自己的鏡像,然后改。解決辦法是清空目錄,然后將拷貝過來安裝對應版本的。默認不允許往節點裝東西,強行設置下允許自己的無視沒權限 k8s 1.12.1 的坑和解決方法 pull 鏡像: gcr.io 被墻,需要 pull 自己的鏡像,然后改 tag。具體需要 pull 哪些鏡像呢,kubeadm config images 可查看我自己 build 的都放到了 ...
摘要:的坑和解決方法鏡像被墻,需要自己的鏡像,然后改。解決辦法是清空目錄,然后將拷貝過來安裝對應版本的。默認不允許往節點裝東西,強行設置下允許自己的無視沒權限 k8s 1.12.1 的坑和解決方法 pull 鏡像: gcr.io 被墻,需要 pull 自己的鏡像,然后改 tag。具體需要 pull 哪些鏡像呢,kubeadm config images 可查看我自己 build 的都放到了 ...
閱讀 2003·2021-11-23 10:08
閱讀 2336·2021-11-22 15:25
閱讀 3275·2021-11-11 16:55
閱讀 771·2021-11-04 16:05
閱讀 2600·2021-09-10 10:51
閱讀 712·2019-08-29 15:38
閱讀 1583·2019-08-29 14:11
閱讀 3486·2019-08-29 12:42