K8S之Taints(污點(diǎn))和Tolerations(容忍)--初探;-創(chuàng)新互聯(lián)

Taint 和 Toleration

節(jié)點(diǎn)親和性(詳見這里),是 pod 的一種屬性(偏好或硬性要求),它使 pod 被吸引到一類特定的節(jié)點(diǎn)。Taint 則相反,它使 節(jié)點(diǎn) 能夠 排斥 一類特定的 pod。

創(chuàng)新互聯(lián)主營會(huì)同網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,app軟件開發(fā)公司,會(huì)同h5成都小程序開發(fā)搭建,會(huì)同網(wǎng)站營銷推廣歡迎會(huì)同等地區(qū)企業(yè)咨詢

Taint 和 toleration 相互配合,可以用來避免 pod 被分配到不合適的節(jié)點(diǎn)上。每個(gè)節(jié)點(diǎn)上都可以應(yīng)用一個(gè)或多個(gè) taint ,這表示對于那些不能容忍這些 taint 的 pod,是不會(huì)被該節(jié)點(diǎn)接受的。如果將 toleration 應(yīng)用于 pod 上,則表示這些 pod 可以(但不要求)被調(diào)度到具有匹配 taint 的節(jié)點(diǎn)上。

概念

使用例子

基于 taint 的驅(qū)逐

基于節(jié)點(diǎn)狀態(tài)添加 taint

概念

您可以使用命令 kubectl taint 給節(jié)點(diǎn)增加一個(gè) taint。比如,

kubectl taint nodes node1 key=value:NoSchedule

給節(jié)點(diǎn) node1 增加一個(gè) taint,它的 key 是 key,value 是 value,effect 是 NoSchedule。這表示只有擁有和這個(gè) taint 相匹配的 toleration 的 pod 才能夠被分配到 node1 這個(gè)節(jié)點(diǎn)。您可以在 PodSpec 中定義 pod 的 toleration。下面兩個(gè) toleration 均與上面例子中使用 kubectl taint 命令創(chuàng)建的 taint 相匹配,因此如果一個(gè) pod 擁有其中的任何一個(gè) toleration 都能夠被分配到 node1 :

想刪除上述命令添加的 taint ,您可以運(yùn)行:

kubectl taint nodes node1 key:NoSchedule-

您可以在PodSpec中為容器設(shè)定容忍標(biāo)簽。以下兩個(gè)容忍標(biāo)簽都與上面的 kubectl taint 創(chuàng)建的污點(diǎn)“匹配”, 因此具有任一容忍標(biāo)簽的Pod都可以將其調(diào)度到“ node1”上:

tolerations:

- key: "key"

operator: "Equal"

value: "value"

effect: "NoSchedule"

tolerations:

- key: "key"

operator: "Exists"

effect: "NoSchedule"

一個(gè) toleration 和一個(gè) taint 相“匹配”是指它們有一樣的 key 和 effect ,并且:

如果 operator 是 Exists (此時(shí) toleration 不能指定 value),或者

如果 operator 是 Equal ,則它們的 value 應(yīng)該相等

注意:

存在兩種特殊情況:

如果一個(gè) toleration 的 key 為空且 operator 為 Exists ,表示這個(gè) toleration 與任意的 key 、 value 和 effect 都匹配,即這個(gè) toleration 能容忍任意 taint。

tolerations:

- operator: "Exists"

如果一個(gè) toleration 的 effect 為空,則 key 值與之相同的相匹配 taint 的 effect 可以是任意值。

tolerations:

- key: "key"

operator: "Exists"

上述例子使用到的 effect 的一個(gè)值 NoSchedule,您也可以使用另外一個(gè)值 PreferNoSchedule。這是“優(yōu)化”或“軟”版本的 NoSchedule ——系統(tǒng)會(huì)*盡量*避免將 pod 調(diào)度到存在其不能容忍 taint 的節(jié)點(diǎn)上,但這不是強(qiáng)制的。effect 的值還可以設(shè)置為 NoExecute ,下文會(huì)詳細(xì)描述這個(gè)值。

您可以給一個(gè)節(jié)點(diǎn)添加多個(gè) taint ,也可以給一個(gè) pod 添加多個(gè) toleration。Kubernetes 處理多個(gè) taint 和 toleration 的過程就像一個(gè)過濾器:從一個(gè)節(jié)點(diǎn)的所有 taint 開始遍歷,過濾掉那些 pod 中存在與之相匹配的 toleration 的 taint。余下未被過濾的 taint 的 effect 值決定了 pod 是否會(huì)被分配到該節(jié)點(diǎn),特別是以下情況:

如果未被過濾的 taint 中存在一個(gè)以上 effect 值為 NoSchedule 的 taint,則 Kubernetes 不會(huì)將 pod 分配到該節(jié)點(diǎn)。

如果未被過濾的 taint 中不存在 effect 值為 NoSchedule 的 taint,但是存在 effect 值為 PreferNoSchedule 的 taint,則 Kubernetes 會(huì)*嘗試*將 pod 分配到該節(jié)點(diǎn)。

如果未被過濾的 taint 中存在一個(gè)以上 effect 值為 NoExecute 的 taint,則 Kubernetes 不會(huì)將 pod 分配到該節(jié)點(diǎn)(如果 pod 還未在節(jié)點(diǎn)上運(yùn)行),或者將 pod 從該節(jié)點(diǎn)驅(qū)逐(如果 pod 已經(jīng)在節(jié)點(diǎn)上運(yùn)行)。

例如,假設(shè)您給一個(gè)節(jié)點(diǎn)添加了如下的 taint

kubectl taint nodes node1 key1=value1:NoSchedule

kubectl taint nodes node1 key1=value1:NoExecute

kubectl taint nodes node1 key2=value2:NoSchedule

然后存在一個(gè) pod,它有兩個(gè) toleration

tolerations:

- key: "key1"

operator: "Equal"

value: "value1"

effect: "NoSchedule"

- key: "key1"

operator: "Equal"

value: "value1"

effect: "NoExecute"

在這個(gè)例子中,上述 pod 不會(huì)被分配到上述節(jié)點(diǎn),因?yàn)槠錄]有 toleration 和第三個(gè) taint 相匹配。但是如果在給節(jié)點(diǎn)添加 上述 taint 之前,該 pod 已經(jīng)在上述節(jié)點(diǎn)運(yùn)行,那么它還可以繼續(xù)運(yùn)行在該節(jié)點(diǎn)上,因?yàn)榈谌齻€(gè) taint 是三個(gè) taint 中唯一不能被這個(gè) pod 容忍的。

通常情況下,如果給一個(gè)節(jié)點(diǎn)添加了一個(gè) effect 值為 NoExecute 的 taint,則任何不能忍受這個(gè) taint 的 pod 都會(huì)馬上被驅(qū)逐,任何可以忍受這個(gè) taint 的 pod 都不會(huì)被驅(qū)逐。但是,如果 pod 存在一個(gè) effect 值為 NoExecute 的 toleration 指定了可選屬性 tolerationSeconds 的值,則表示在給節(jié)點(diǎn)添加了上述 taint 之后,pod 還能繼續(xù)在節(jié)點(diǎn)上運(yùn)行的時(shí)間。例如,

tolerations:

- key: "key1"

operator: "Equal"

value: "value1"

effect: "NoExecute"

tolerationSeconds: 3600

這表示如果這個(gè) pod 正在運(yùn)行,然后一個(gè)匹配的 taint 被添加到其所在的節(jié)點(diǎn),那么 pod 還將繼續(xù)在節(jié)點(diǎn)上運(yùn)行 3600 秒,然后被驅(qū)逐。如果在此之前上述 taint 被刪除了,則 pod 不會(huì)被驅(qū)逐。

使用例子

通過 taint 和 toleration ,可以靈活地讓 pod *避開*某些節(jié)點(diǎn)或者將 pod 從某些節(jié)點(diǎn)驅(qū)逐。下面是幾個(gè)使用例子:

專用節(jié)點(diǎn):如果您想將某些節(jié)點(diǎn)專門分配給特定的一組用戶使用,您可以給這些節(jié)點(diǎn)添加一個(gè) taint(即, kubectl taint nodes nodename dedicated=groupName:NoSchedule),然后給這組用戶的 pod 添加一個(gè)相對應(yīng)的 toleration(通過編寫一個(gè)自定義的admission controller,很容易就能做到)。擁有上述 toleration 的 pod 就能夠被分配到上述專用節(jié)點(diǎn),同時(shí)也能夠被分配到集群中的其它節(jié)點(diǎn)。如果您希望這些 pod 只能被分配到上述專用節(jié)點(diǎn),那么您還需要給這些專用節(jié)點(diǎn)另外添加一個(gè)和上述 taint 類似的 label (例如:dedicated=groupName),同時(shí) 還要在上述 admission controller 中給 pod 增加節(jié)點(diǎn)親和性要求上述 pod 只能被分配到添加了 dedicated=groupName 標(biāo)簽的節(jié)點(diǎn)上。

配備了特殊硬件的節(jié)點(diǎn):在部分節(jié)點(diǎn)配備了特殊硬件(比如 GPU)的集群中,我們希望不需要這類硬件的 pod 不要被分配到這些特殊節(jié)點(diǎn),以便為后繼需要這類硬件的 pod 保留資源。要達(dá)到這個(gè)目的,可以先給配備了特殊硬件的節(jié)點(diǎn)添加 taint(例如 kubectl taint nodes nodename special=true:NoSchedule or kubectl taint nodes nodename special=true:PreferNoSchedule),然后給使用了這類特殊硬件的 pod 添加一個(gè)相匹配的 toleration。和專用節(jié)點(diǎn)的例子類似,添加這個(gè) toleration 的最簡單的方法是使用自定義 admission controller。比如,我們推薦使用 Extended Resources 來表示特殊硬件,給配置了特殊硬件的節(jié)點(diǎn)添加 taint 時(shí)包含 extended resource 名稱,然后運(yùn)行一個(gè) ExtendedResourceToleration admission controller。此時(shí),因?yàn)楣?jié)點(diǎn)已經(jīng)被 taint 了,沒有對應(yīng) toleration 的 Pod 會(huì)被調(diào)度到這些節(jié)點(diǎn)。但當(dāng)你創(chuàng)建一個(gè)使用了 extended resource 的 Pod 時(shí),ExtendedResourceToleration admission controller 會(huì)自動(dòng)給 Pod 加上正確的 toleration ,這樣 Pod 就會(huì)被自動(dòng)調(diào)度到這些配置了特殊硬件件的節(jié)點(diǎn)上。這樣就能夠確保這些配置了特殊硬件的節(jié)點(diǎn)專門用于運(yùn)行 需要使用這些硬件的 Pod,并且您無需手動(dòng)給這些 Pod 添加 toleration。

基于 taint 的驅(qū)逐 (beta 特性): 這是在每個(gè) pod 中配置的在節(jié)點(diǎn)出現(xiàn)問題時(shí)的驅(qū)逐行為,接下來的章節(jié)會(huì)描述這個(gè)特性

基于 taint 的驅(qū)逐

前文我們提到過 taint 的 effect 值 NoExecute ,它會(huì)影響已經(jīng)在節(jié)點(diǎn)上運(yùn)行的 pod * 如果 pod 不能忍受effect 值為 NoExecute 的 taint,那么 pod 將馬上被驅(qū)逐 * 如果 pod 能夠忍受effect 值為 NoExecute 的 taint,但是在 toleration 定義中沒有指定 tolerationSeconds,則 pod 還會(huì)一直在這個(gè)節(jié)點(diǎn)上運(yùn)行。 * 如果 pod 能夠忍受effect 值為 NoExecute 的 taint,而且指定了 tolerationSeconds,則 pod 還能在這個(gè)節(jié)點(diǎn)上繼續(xù)運(yùn)行這個(gè)指定的時(shí)間長度。

此外,Kubernetes 1.6 已經(jīng)支持(alpha階段)節(jié)點(diǎn)問題的表示。換句話說,當(dāng)某種條件為真時(shí),node controller會(huì)自動(dòng)給節(jié)點(diǎn)添加一個(gè) taint。當(dāng)前內(nèi)置的 taint 包括:

node.kubernetes.io/not-ready:節(jié)點(diǎn)未準(zhǔn)備好。這相當(dāng)于節(jié)點(diǎn)狀態(tài) Ready 的值為 “False“。

node.kubernetes.io/unreachable:node controller 訪問不到節(jié)點(diǎn). 這相當(dāng)于節(jié)點(diǎn)狀態(tài) Ready 的值為 “Unknown“。

node.kubernetes.io/out-of-disk:節(jié)點(diǎn)磁盤耗盡。

node.kubernetes.io/memory-pressure:節(jié)點(diǎn)存在內(nèi)存壓力。

node.kubernetes.io/disk-pressure:節(jié)點(diǎn)存在磁盤壓力。

node.kubernetes.io/network-unavailable:節(jié)點(diǎn)網(wǎng)絡(luò)不可用。

node.kubernetes.io/unschedulable: 節(jié)點(diǎn)不可調(diào)度。

node.cloudprovider.kubernetes.io/uninitialized:如果 kubelet 啟動(dòng)時(shí)指定了一個(gè) “外部” cloud provider,它將給當(dāng)前節(jié)點(diǎn)添加一個(gè) taint 將其標(biāo)志為不可用。在 cloud-controller-manager 的一個(gè) controller 初始化這個(gè)節(jié)點(diǎn)后,kubelet 將刪除這個(gè) taint。

在版本1.13中,TaintBasedEvictions 功能已升級為Beta,并且默認(rèn)啟用,因此污點(diǎn)會(huì)自動(dòng)給節(jié)點(diǎn)添加這類 taint,上述基于節(jié)點(diǎn)狀態(tài) Ready 對 pod 進(jìn)行驅(qū)逐的邏輯會(huì)被禁用。

注意:

注意:為了保證由于節(jié)點(diǎn)問題引起的 pod 驅(qū)逐rate limiting行為正常,系統(tǒng)實(shí)際上會(huì)以 rate-limited 的方式添加 taint。在像 master 和 node 通訊中斷等場景下,這避免了 pod 被大量驅(qū)逐。

使用這個(gè) beta 功能特性,結(jié)合 tolerationSeconds ,pod 就可以指定當(dāng)節(jié)點(diǎn)出現(xiàn)一個(gè)或全部上述問題時(shí)還將在這個(gè)節(jié)點(diǎn)上運(yùn)行多長的時(shí)間。

比如,一個(gè)使用了很多本地狀態(tài)的應(yīng)用程序在網(wǎng)絡(luò)斷開時(shí),仍然希望停留在當(dāng)前節(jié)點(diǎn)上運(yùn)行一段較長的時(shí)間,愿意等待網(wǎng)絡(luò)恢復(fù)以避免被驅(qū)逐。在這種情況下,pod 的 toleration 可能是下面這樣的:

tolerations:

- key: "node.kubernetes.io/unreachable"

operator: "Exists"

effect: "NoExecute"

tolerationSeconds: 6000

注意,Kubernetes 會(huì)自動(dòng)給 pod 添加一個(gè) key 為 node.kubernetes.io/not-ready 的 toleration 并配置 tolerationSeconds=300,除非用戶提供的 pod 配置中已經(jīng)已存在了 key 為 node.kubernetes.io/not-ready 的 toleration。同樣,Kubernetes 會(huì)給 pod 添加一個(gè) key 為 node.kubernetes.io/unreachable 的 toleration 并配置 tolerationSeconds=300,除非用戶提供的 pod 配置中已經(jīng)已存在了 key 為 node.kubernetes.io/unreachable 的 toleration。

這種自動(dòng)添加 toleration 機(jī)制保證了在其中一種問題被檢測到時(shí) pod 默認(rèn)能夠繼續(xù)停留在當(dāng)前節(jié)點(diǎn)運(yùn)行 5 分鐘。這兩個(gè)默認(rèn) toleration 是由 DefaultTolerationSeconds admission controller添加的。

DaemonSet 中的 pod 被創(chuàng)建時(shí),針對以下 taint 自動(dòng)添加的 NoExecute 的 toleration 將不會(huì)指定 tolerationSeconds:

node.kubernetes.io/unreachable

node.kubernetes.io/not-ready

這保證了出現(xiàn)上述問題時(shí) DaemonSet 中的 pod 永遠(yuǎn)不會(huì)被驅(qū)逐,這和 TaintBasedEvictions 這個(gè)特性被禁用后的行為是一樣的。

基于節(jié)點(diǎn)狀態(tài)添加 taint

在版本1.12中,TaintNodesByCondition 功能已升級為Beta,因此節(jié)點(diǎn)生命周期控制器會(huì)自動(dòng)創(chuàng)建與Node條件相對應(yīng)的污點(diǎn)。 同樣,調(diào)度程序不檢查節(jié)點(diǎn)條件。 而是調(diào)度程序檢查污點(diǎn)。 這確保了節(jié)點(diǎn)條件不會(huì)影響調(diào)度到節(jié)點(diǎn)上的內(nèi)容。 用戶可以通過添加適當(dāng)?shù)?Pod 容忍來選擇忽略某些Node的問題(表示為 Node 的調(diào)度條件)。 注意,TaintNodesByCondition 只會(huì)污染具有 NoSchedule 設(shè)定的節(jié)點(diǎn)。 NoExecute 效應(yīng)由 TaintBasedEviction 控制, TaintBasedEviction 是 Beta 版功能,自1.13版起默認(rèn)啟用。

node.kubernetes.io/memory-pressure

node.kubernetes.io/disk-pressure

node.kubernetes.io/out-of-disk (只適合 critical pod)

node.kubernetes.io/unschedulable (1.10 或更高版本)

node.kubernetes.io/network-unavailable (只適合 host network)

添加上述 toleration 確保了向后兼容,您也可以選擇自由的向 DaemonSet 添加 toleration。

文檔來源:

https://kubernetes.io/zh/docs/concepts/configuration/taint-and-toleration/

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)站名稱:K8S之Taints(污點(diǎn))和Tolerations(容忍)--初探;-創(chuàng)新互聯(lián)
文章網(wǎng)址:http://muchs.cn/article26/phijg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、全網(wǎng)營銷推廣、品牌網(wǎng)站建設(shè)、面包屑導(dǎo)航網(wǎng)站排名、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)