【云原生Kubernetes】15-Kubernetes的污點(diǎn)(Taint)和容忍(Toleration)詳解
簡(jiǎn)介
? 污點(diǎn)(Taint)是指標(biāo)記節(jié)點(diǎn)的一種機(jī)制,用于告訴 Kubernetes 集群這個(gè)節(jié)點(diǎn)上的 Pod 是有問(wèn)題的,例如某些節(jié)點(diǎn)資源已經(jīng)不足等。當(dāng)節(jié)點(diǎn)被標(biāo)記為污點(diǎn)時(shí),Kubernetes 調(diào)度器將不會(huì)將新的 Pod 分配到這個(gè)節(jié)點(diǎn)上,除非這個(gè) Pod 明確地聲明了它可以容忍這個(gè)節(jié)點(diǎn)上的污點(diǎn)。污點(diǎn)通常用于保證某些節(jié)點(diǎn)上運(yùn)行的應(yīng)用程序不會(huì)被新的 Pod 占用。
? 容忍度(Toleration)是指告訴 Kubernetes 集群一個(gè) Pod 可以容忍哪些節(jié)點(diǎn)上存在的污點(diǎn)。當(dāng)一個(gè) Pod 被標(biāo)記為可以容忍某些污點(diǎn)時(shí),Kubernetes 調(diào)度器將在為該 Pod 分配節(jié)點(diǎn)時(shí)考慮這些容忍度信息。只有節(jié)點(diǎn)上存在被 Pod 容忍的污點(diǎn)時(shí),該節(jié)點(diǎn)才會(huì)被考慮作為該 Pod 的運(yùn)行節(jié)點(diǎn)。
? 污點(diǎn)和容忍度(Toleration)相互配合,可以用來(lái)避免 Pod 被分配到不合適的節(jié)點(diǎn)上。 每個(gè)節(jié)點(diǎn)上都可以應(yīng)用一個(gè)或多個(gè)污點(diǎn),這表示對(duì)于那些不能容忍這些污點(diǎn)的 Pod, 是不會(huì)被該節(jié)點(diǎn)接受的。
默認(rèn)情況下Pod是不會(huì)調(diào)度到含有污點(diǎn)的Node上的
基本用法
設(shè)置污點(diǎn)
kubectl taint node [node] key=value[effect]
其中[effect] 可取值: [ NoSchedule | PreferNoSchedule | NoExecute ]
NoSchedule :一定不能被調(diào)度。
PreferNoSchedule:盡量不要調(diào)度。
NoExecute:不僅不會(huì)調(diào)度,還會(huì)驅(qū)逐Node上已有的Pod。
- 給192.168.194.130Node上添加污點(diǎn)
#示例:
kubectl taint node 192.168.194.130 test=xhz:NoSchedule
去除污點(diǎn)
#比如設(shè)置污點(diǎn):
kubectl taint node 192.168.194.130 test=16:NoSchedule
kubectl taint node 192.168.194.130test=16:NoExecute
#去除指定key及其effect:
kubectl taint nodes node_name key:[effect]- #(這里的key不用指定value)
#去除指定key所有的effect:
kubectl taint nodes node_name key-
#示例:
kubectl taint node 192.168.194.130 test:NoSchedule-
kubectl taint node 192.168.194.130 test:NoExecute-
kubectl taint node 192.168.194.130 test-
示例
- 在node1上加一個(gè)Taint,該Taint的鍵為key,值為value,Taint的效果是NoSchedule。這意味著除非pod明確聲明可以容忍這個(gè)Taint,否則就不會(huì)被調(diào)度到node1上。
- 設(shè)置污點(diǎn)
[root@master ~]# kubectl taint node 192.168.194.130 key1=value1:NoSchedule
node/192.168.194.130 tainted
[root@master ~]#
- 創(chuàng)建pod,設(shè)置pod可以容忍污點(diǎn)key1()
pod可以容忍節(jié)點(diǎn)上的污點(diǎn)key1,并不代表著pod一定會(huì)調(diào)度到該節(jié)點(diǎn)
apiVersion: v1
kind: Pod
metadata:
name: pod-taints
spec:
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
containers:
- name: pod-taints
image: busybox:latest
也可以這樣寫(xiě):
tolerations:
- key: "key1"
operator: "Exists"
effect: "NoSchedule"
operator
的默認(rèn)值是 Equal
。
一個(gè)容忍度和一個(gè)污點(diǎn)相“匹配”是指它們有一樣的鍵名和效果,并且:
- 如果
operator
是Exists
(此時(shí)容忍度不能指定value
),或者 - 如果
operator
是Equal
,則它們的value
應(yīng)該相等。
存在兩種特殊情況:
如果一個(gè)容忍度的
key
為空且operator
為Exists
, 表示這個(gè)容忍度與任意的 key、value 和 effect 都匹配,即這個(gè)容忍度能容忍任何污點(diǎn)。如果
effect
為空,則可以與所有鍵名key1
的效果相匹配。
effect說(shuō)明
上面的例子中effect的取值為NoSchedule,下面對(duì)effect的值作下簡(jiǎn)單說(shuō)明:
- NoSchedule: 如果一個(gè)pod沒(méi)有聲明容忍這個(gè)Taint,則系統(tǒng)不會(huì)把該P(yáng)od調(diào)度到有這個(gè)Taint的node上。
- PreferNoSchedule:NoSchedule的軟限制版本,如果一個(gè)Pod沒(méi)有聲明容忍這個(gè)Taint,則系統(tǒng)會(huì)盡量避免把這個(gè)pod調(diào)度到這一節(jié)點(diǎn)上去,但不是強(qiáng)制的。例如當(dāng)Pod沒(méi)有容忍該污點(diǎn),但是其他節(jié)點(diǎn)的資源已經(jīng)無(wú)法在調(diào)度Pod,此時(shí)Pod還是會(huì)被調(diào)度到該節(jié)點(diǎn)上。
- NoExecute:定義pod的驅(qū)逐行為,以應(yīng)對(duì)節(jié)點(diǎn)故障。NoExecute這個(gè)Taint效果對(duì)節(jié)點(diǎn)上正在運(yùn)行的pod有以下影響:
- 沒(méi)有設(shè)置Toleration的Pod會(huì)被立刻驅(qū)逐
- 配置了對(duì)應(yīng)Toleration的pod,如果沒(méi)有為tolerationSeconds賦值,則會(huì)一直留在這一節(jié)點(diǎn)中
- 配置了對(duì)應(yīng)Toleration的pod且指定了tolerationSeconds值,則會(huì)在指定時(shí)間后驅(qū)逐
- 從kubernetes 1.6版本開(kāi)始引入了一個(gè)alpha版本的功能,即把節(jié)點(diǎn)故障標(biāo)記為T(mén)aint(目前只針對(duì)node unreachable及node not ready,相應(yīng)的NodeCondition "Ready"的值為Unknown和False)。激活TaintBasedEvictions功能后(在–feature-gates參數(shù)中加入TaintBasedEvictions=true),NodeController會(huì)自動(dòng)為Node設(shè)置Taint,而狀態(tài)為"Ready"的Node上之前設(shè)置過(guò)的普通驅(qū)逐邏輯將會(huì)被禁用。注意,在節(jié)點(diǎn)故障情況下,為了保持現(xiàn)存的pod驅(qū)逐的限速設(shè)置,系統(tǒng)將會(huì)以限速的模式逐步給node設(shè)置Taint,這就能防止在一些特定情況下(比如master暫時(shí)失聯(lián))造成的大量pod被驅(qū)逐的后果。這一功能兼容于tolerationSeconds,允許pod定義節(jié)點(diǎn)故障時(shí)持續(xù)多久才被逐出。
多污點(diǎn)與多容忍配置
系統(tǒng)允許在同一個(gè)node上設(shè)置多個(gè)taint,也可以在pod上設(shè)置多個(gè)Toleration。Kubernetes調(diào)度器處理多個(gè)Taint和Toleration能夠匹配的部分,剩下的沒(méi)有忽略掉的Taint就是對(duì)Pod的效果了。下面是幾種特殊情況:
- 如果剩余的Taint中存在effect=NoSchedule,則調(diào)度器不會(huì)把該pod調(diào)度到這一節(jié)點(diǎn)上。
- 如果剩余的Taint中沒(méi)有NoSchedule的效果,但是有PreferNoSchedule效果,則調(diào)度器會(huì)嘗試不會(huì)pod指派給這個(gè)節(jié)點(diǎn)
- 如果剩余Taint的效果有NoExecute的,并且這個(gè)pod已經(jīng)在該節(jié)點(diǎn)運(yùn)行,則會(huì)被驅(qū)逐;如果沒(méi)有在該節(jié)點(diǎn)運(yùn)行,也不會(huì)再被調(diào)度到該節(jié)點(diǎn)上。
例如,假設(shè)你給一個(gè)節(jié)點(diǎn)添加了如下污點(diǎn):
kubectl taint nodes node1 key1=value1:NoSchedule
kubectl taint nodes node1 key1=value1:NoExecute
kubectl taint nodes node1 key2=value2:NoSchedule
假定某個(gè) Pod 有兩個(gè)容忍度:
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoExecute"
? 在這種情況下,上述 Pod 不會(huì)被調(diào)度到上述節(jié)點(diǎn),因?yàn)槠錄](méi)有容忍度和第三個(gè)污點(diǎn)相匹配。 但是如果在給節(jié)點(diǎn)添加上述污點(diǎn)之前,該 Pod 已經(jīng)在上述節(jié)點(diǎn)運(yùn)行, 那么它還可以繼續(xù)運(yùn)行在該節(jié)點(diǎn)上,因?yàn)榈谌齻€(gè)污點(diǎn)是三個(gè)污點(diǎn)中唯一不能被這個(gè) Pod 容忍的,且該污點(diǎn)effect: “NoSchedule”,是允許已經(jīng)調(diào)度到該節(jié)點(diǎn)的Pod繼續(xù)運(yùn)行的。
? 常情況下,如果給一個(gè)節(jié)點(diǎn)添加了一個(gè) effect 值為 NoExecute
的污點(diǎn), 則任何不能忍受這個(gè)污點(diǎn)的 Pod 都會(huì)馬上被驅(qū)逐,任何可以忍受這個(gè)污點(diǎn)的 Pod 都不會(huì)被驅(qū)逐。 但是,如果 Pod 存在一個(gè) effect 值為 NoExecute
的容忍度指定了可選屬性 tolerationSeconds
的值,則表示在給節(jié)點(diǎn)添加了上述污點(diǎn)之后, Pod 還能繼續(xù)在節(jié)點(diǎn)上運(yùn)行的時(shí)間。例如,
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoExecute"
tolerationSeconds: 3600
這表示如果這個(gè) Pod 正在運(yùn)行,同時(shí)一個(gè)匹配的污點(diǎn)被添加到其所在的節(jié)點(diǎn), 那么 Pod 還將繼續(xù)在節(jié)點(diǎn)上運(yùn)行 3600 秒,然后被驅(qū)逐。 如果在此之前上述污點(diǎn)被刪除了,則 Pod 不會(huì)被驅(qū)逐。
常用場(chǎng)景
節(jié)點(diǎn)獨(dú)占
如果想要拿出一部分節(jié)點(diǎn),專門(mén)給特定的應(yīng)用使用,則可以為節(jié)點(diǎn)添加這樣的Taint
kubectl taint nodes nodename dedicated=groupName:NoSchedule
然后給這些應(yīng)用的pod加入相應(yīng)的toleration,則帶有合適toleration的pod就會(huì)被允許同使用其他節(jié)點(diǎn)一樣使用有taint的節(jié)點(diǎn)。然后再將這些node打上指定的標(biāo)簽,再通過(guò)nodeSelector或者親和性調(diào)度的方式,要求這些pod必須運(yùn)行在指定標(biāo)簽的節(jié)點(diǎn)上。
配備了特殊硬件的節(jié)點(diǎn)
在部分節(jié)點(diǎn)配備了特殊硬件(比如 GPU)的集群中, 我們希望不需要這類硬件的 Pod 不要被調(diào)度到這些特殊節(jié)點(diǎn),以便為后繼需要這類硬件的 Pod 保留資源。 要達(dá)到這個(gè)目的,可以先給配備了特殊硬件的節(jié)點(diǎn)添加污點(diǎn):
kubectl taint nodes nodename special=true:NoSchedule
或
kubectl taint nodes nodename special=true:PreferNoSchedule
然后在pod中利用對(duì)應(yīng)的toleration來(lái)保障特定的pod能夠使用特定的硬件。然后同樣的,我們也可以使用標(biāo)簽或者其他的一些特征來(lái)判斷這些pod,將其調(diào)度到這些特定硬件的服務(wù)器上。
基于污點(diǎn)的驅(qū)逐
之前說(shuō)到,在節(jié)點(diǎn)故障時(shí),可以通過(guò)TaintBasedEvictions功能自動(dòng)將節(jié)點(diǎn)設(shè)置Taint,然后將pod驅(qū)逐。但是在一些場(chǎng)景下,比如說(shuō)網(wǎng)絡(luò)故障造成的master與node失聯(lián),而這個(gè)node上運(yùn)行了很多本地狀態(tài)的應(yīng)用即使網(wǎng)絡(luò)故障,也仍然希望能夠持續(xù)在該節(jié)點(diǎn)上運(yùn)行,期望網(wǎng)絡(luò)能夠快速恢復(fù),從而避免從這個(gè)node上被驅(qū)逐。Pod的Toleration可以這樣定義:
tolerations:
- key: "node.alpha.kubernetes.io/unreachable"
operator: "Exists"
effect: "NoExecute"
tolerationSeconds: 6000
前文提到過(guò)污點(diǎn)的效果值 NoExecute
會(huì)影響已經(jīng)在節(jié)點(diǎn)上運(yùn)行的如下 Pod:
- 如果 Pod 不能忍受這類污點(diǎn),Pod 會(huì)馬上被驅(qū)逐。
- 如果 Pod 能夠忍受這類污點(diǎn),但是在容忍度定義中沒(méi)有指定
tolerationSeconds
, 則 Pod 還會(huì)一直在這個(gè)節(jié)點(diǎn)上運(yùn)行。 - 如果 Pod 能夠忍受這類污點(diǎn),而且指定了
tolerationSeconds
, 則 Pod 還能在這個(gè)節(jié)點(diǎn)上繼續(xù)運(yùn)行這個(gè)指定的時(shí)間長(zhǎng)度。
當(dāng)某種條件為真時(shí),節(jié)點(diǎn)控制器會(huì)自動(dòng)給節(jié)點(diǎn)添加一個(gè)污點(diǎn)。當(dāng)前內(nèi)置的污點(diǎn)包括:
-
node.kubernetes.io/not-ready
:節(jié)點(diǎn)未準(zhǔn)備好。這相當(dāng)于節(jié)點(diǎn)狀況Ready
的值為 “False
”。 -
node.kubernetes.io/unreachable
:節(jié)點(diǎn)控制器訪問(wèn)不到節(jié)點(diǎn). 這相當(dāng)于節(jié)點(diǎn)狀況Ready
的值為 “Unknown
”。 -
node.kubernetes.io/memory-pressure
:節(jié)點(diǎn)存在內(nèi)存壓力。 -
node.kubernetes.io/disk-pressure
:節(jié)點(diǎn)存在磁盤(pán)壓力。 -
node.kubernetes.io/pid-pressure
: 節(jié)點(diǎn)的 PID 壓力。 -
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è)“外部”云平臺(tái)驅(qū)動(dòng), 它將給當(dāng)前節(jié)點(diǎn)添加一個(gè)污點(diǎn)將其標(biāo)志為不可用。在 cloud-controller-manager 的一個(gè)控制器初始化這個(gè)節(jié)點(diǎn)后,kubelet 將刪除這個(gè)污點(diǎn)。
在節(jié)點(diǎn)被驅(qū)逐時(shí),節(jié)點(diǎn)控制器或者 kubelet 會(huì)添加帶有 NoExecute
效果的相關(guān)污點(diǎn)。 如果異常狀態(tài)恢復(fù)正常,kubelet 或節(jié)點(diǎn)控制器能夠移除相關(guān)的污點(diǎn)。
在某些情況下,當(dāng)節(jié)點(diǎn)不可達(dá)時(shí),API 服務(wù)器無(wú)法與節(jié)點(diǎn)上的 kubelet 進(jìn)行通信。 在與 API 服務(wù)器的通信被重新建立之前,刪除 Pod 的決定無(wú)法傳遞到 kubelet。 同時(shí),被調(diào)度進(jìn)行刪除的那些 Pod 可能會(huì)繼續(xù)運(yùn)行在分區(qū)后的節(jié)點(diǎn)上。
說(shuō)明:
控制面會(huì)限制向節(jié)點(diǎn)添加新污點(diǎn)的速率。這一速率限制可以管理多個(gè)節(jié)點(diǎn)同時(shí)不可達(dá)時(shí) (例如出現(xiàn)網(wǎng)絡(luò)中斷的情況),可能觸發(fā)的驅(qū)逐的數(shù)量。
基于節(jié)點(diǎn)狀態(tài)添加污點(diǎn)
控制平面使用節(jié)點(diǎn)控制器自動(dòng)創(chuàng)建 與節(jié)點(diǎn)狀況對(duì)應(yīng)的、效果為 NoSchedule
的污點(diǎn)。
調(diào)度器在進(jìn)行調(diào)度時(shí)檢查污點(diǎn),而不是檢查節(jié)點(diǎn)狀況。這確保節(jié)點(diǎn)狀況不會(huì)直接影響調(diào)度。 例如,如果 DiskPressure
節(jié)點(diǎn)狀況處于活躍狀態(tài),則控制平面添加 node.kubernetes.io/disk-pressure
污點(diǎn)并且不會(huì)調(diào)度新的 Pod 到受影響的節(jié)點(diǎn)。 如果 MemoryPressure
節(jié)點(diǎn)狀況處于活躍狀態(tài),則控制平面添加 node.kubernetes.io/memory-pressure
污點(diǎn)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-664360.html
對(duì)于新創(chuàng)建的 Pod,可以通過(guò)添加相應(yīng)的 Pod 容忍度來(lái)忽略節(jié)點(diǎn)狀況。 控制平面還在具有除 BestEffort
之外的 QoS 類的 Pod 上添加 node.kubernetes.io/memory-pressure
容忍度。 這是因?yàn)?Kubernetes 將 Guaranteed
或 Burstable
QoS 類中的 Pod(甚至沒(méi)有設(shè)置內(nèi)存請(qǐng)求的 Pod) 視為能夠應(yīng)對(duì)內(nèi)存壓力,而新創(chuàng)建的 BestEffort
Pod 不會(huì)被調(diào)度到受影響的節(jié)點(diǎn)上。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-664360.html
總結(jié)
- 默認(rèn)情況下,Pod不會(huì)調(diào)度到含有污點(diǎn)的節(jié)點(diǎn)上;
- 節(jié)點(diǎn)可以配置多個(gè)污點(diǎn),各個(gè)污點(diǎn)直接是邏輯與的關(guān)系,因此設(shè)置容忍度的時(shí)候需要容忍所有污點(diǎn);
- Pod容忍了節(jié)點(diǎn)上的污點(diǎn),并不代表Pod一定會(huì)被調(diào)度到該節(jié)點(diǎn)上;
- 必須理解設(shè)置污點(diǎn)時(shí)effect對(duì)應(yīng)的三個(gè)參數(shù)的含義(PreferNoSchedule,NoSchedule,NoExecute);
建的BestEffort
Pod 不會(huì)被調(diào)度到受影響的節(jié)點(diǎn)上。
到了這里,關(guān)于【云原生|Kubernetes】15-Kubernetes的污點(diǎn)和容忍詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!