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