日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux数据污点标记,Taints和Tolerations(污点和容忍)

發(fā)布時間:2025/3/20 linux 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux数据污点标记,Taints和Tolerations(污点和容忍) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Taints和Tolerations(污點和容忍)

上面介紹的NodeAffinity節(jié)點親和性,是在pod上定義的一種屬性,是pod能夠被調(diào)度到某些node上運行(優(yōu)先選擇或強制要求)。Taint則正好相反,使用kubectl taint命令可以給某個Node節(jié)點設(shè)置污點,Node被設(shè)置上污點之后就和Pod之間存在了一種相斥的關(guān)系,可以讓Node拒絕Pod的調(diào)度執(zhí)行,甚至將Node已經(jīng)存在的Pod驅(qū)逐出去。

Taint需要和Toleration配合使用,讓pod避開那些不適合的node。在node上設(shè)置一個或多個Taint之后,除非pod明確聲明能夠容忍這些污點,否則無法在這些node上運行。Toleration是pod的屬性,讓pod能夠(注意,只是能夠,而非必須)運行在標注了Taint的node上。

每個污點的組成如下:

key=value:effect

每個污點有一個 key 和 value 作為污點的標簽,其中 value 可以為空,e?ect 描述污點的作用。

當前 taint e?ect 支持如下三個選項:

NoSchedule :表示k8s不會將新的不能容忍的Pod調(diào)度到具有該污點的Node上,但是之前運行在node節(jié)點中的Pod不受影響

PreferNoSchedule :表示k8s將盡量避免將Pod調(diào)度到具有該污點的Node上

NoExecute :表示k8s不會將新的不能容忍的Pod調(diào)度到具有該污點的Node上,同時會將Node上已經(jīng)存在的Pod驅(qū)逐出去

可以用kubectl taint?命令為Node設(shè)置Taint信息:

kubectl taint nodes node1 env=pro:NoSchedule

查看所有Node上的污點

kubectl describe no|grep -e Hostname -e Taints|grep -v none|grep -A 1 "Taints"

查看指定node上的污點

kubectl describe no nodename|grep Taints

刪除taint:

kubectl taint nodes node1 env:NoSchedule-

這個設(shè)置為node1加上一個Taint。該Taint的鍵為key,值為value,Taint的效果是NoSchedule。這意味著除非pod明確聲明可以容忍這個Taint,否則就不會被調(diào)度到node1上。

然后,需要在pod上聲明 Toleration。下面的兩個Toleration都被設(shè)置為可以容忍(Toleration)具有該Taint的node,使得pod能夠被調(diào)度到node1上:

apiVersion: v1

kind: Pod

metadata:

name: pod-toleration

spec:

tolerations:

- key: "key"

operator: "Equal"

value: "value"

effect: "NoSchedule"

containers:

- name: pod-toleration

image: gcr.io/google_containers/pause:2.0

或者

tolerations:

- key: "key"

operator: "Exists"

effect: "NoSchedule"

pod的toleration聲明中的key和effect需要與Taint的設(shè)置保持一致,并且滿足以下條件之一。operator的值是Exists(無需指定value)

operator的值是Equal?并且value相等。

如果不指定operator,則默認值為Equal。

另外,有如下兩個特例:空的key配合Exists操作符能夠匹配所有的鍵和值。

空的effect匹配所有的effect。

系統(tǒng)允許在同一個Node上設(shè)置多個Taint,也可以在Pod上設(shè)置多個Toleration。Kubernetes調(diào)度器處理多個Taint和Toleration的邏輯順序為:首先列出節(jié)點中所有的Taint,然后忽略Pod的Toleration能夠匹配的部分,剩下的沒有忽略的Taint就是對Pod的效果了。下面是幾種特殊情況。

如果在剩余的Taint中存在effect=NoSchedule,則調(diào)度器不會把該Pod調(diào)度到這一節(jié)點上。

如果在剩余的Taint中沒有NoSchedule效果,但是有PreferNoSchedule效果,則調(diào)度器會嘗試不把這個Pod指派給這個節(jié)點。

如果在剩余的Taint中有NoExecute效果,并且這個Pod已經(jīng)在該節(jié)點上運行,則會被驅(qū)逐;如果沒有在該節(jié)點上運行,則也不會再被調(diào)度到該節(jié)點上。

例如,我們這樣對一個節(jié)點進行Taint設(shè)置:

kubectl taint nodes node1 key1=value1:NoSchedule

kubectl taint nodes node1 key1=value1:NoExecute

kubectl taint nodes node1 key2=value2:NoSchedule

然后在Pod上設(shè)置兩個Toleration:

tolerations:

- key: "key1"

operator: "Equal"

value: "value1"

effect: "NoSchedule"

- key: "key1"

operator: "Equal"

value: "value1"

effect: "NoExecute"

這樣的結(jié)果是該Pod無法被調(diào)度到node1上,這是因為第3個Taint沒有匹配的Toleration。但是如果該Pod已經(jīng)在node1上運行了,那么在運行時設(shè)置第3個Taint,它還能繼續(xù)在node1上運行,這是因為Pod可以容忍前兩個Taint。

一般來說,如果給Node加上effect=NoExecute的Taint,那么在該Node上正在運行的所有無對應(yīng)Toleration的Pod都會被立刻驅(qū)逐,而具有相應(yīng)Toleration的Pod永遠不會被驅(qū)逐。不過,系統(tǒng)允許給具有NoExecute效果的Toleration加入一個可選的tolerationSeconds字段,這個設(shè)置表明Pod可以在Taint添加到Node之后還能在這個Node上運行多久(單位為s):

tolerations:

- key: "key1"

operator: "Equal"

value: "value1"

effect: "NoExecute"

tolerationSeconds: 3600

上述定義的意思是,如果Pod正在運行,所在節(jié)點都被加入一個匹配的Taint,則這個Pod會持續(xù)在這個節(jié)點上存活3600s后被逐出。如果在這個寬限期內(nèi)Taint被移除,則不會觸發(fā)驅(qū)逐事件。

Taint和Toleration是一種處理節(jié)點并且讓Pod進行規(guī)避或者驅(qū)逐Pod的彈性處理方式,下面列舉一些常見的用例。

1.專用節(jié)點(dedicated)

如果想要拿出一部分節(jié)點專門給一些特定應(yīng)用使用,則可以為節(jié)點添加這樣的Taint:

kubectl taint nodes nodename dedicated=groupName:NoSchedule

然后給這些應(yīng)用的Pod加入對應(yīng)的Toleration。這樣,帶有合適Toleration的Pod就會被允許同使用其他節(jié)點一樣使用有Taint的節(jié)點。

通過自定義Admission Controller也可以實現(xiàn)這一目標。如果希望讓這些應(yīng)用獨占一批節(jié)點,并且確保它們只能使用這些節(jié)點,則還可以給這些Taint節(jié)點加入類似的標簽dedicated=groupName,然后Admission Controller需要加入節(jié)點親和性設(shè)置,要求Pod只會被調(diào)度到具有這一標簽的節(jié)點上。

2.具有特殊(special)硬件設(shè)備的節(jié)點

在集群里可能有一小部分節(jié)點安裝了特殊的硬件設(shè)備(如GPU芯片),用戶自然會希望把不需要占用這類硬件的Pod排除在外,以確保對這類硬件有需求的Pod能夠被順利調(diào)度到這些節(jié)點。

可以用下面的命令為節(jié)點設(shè)置Taint:

kubectl taint nodes nodename special=true:NoSchedule

kubectl taint nodes nodename special=true:PreferNoSchedule

然后在Pod中利用對應(yīng)的Toleration來保障特定的Pod能夠使用特定的硬件。

和上面的獨占節(jié)點的示例類似,使用Admission Controller來完成這一任務(wù)會更方便。例如,Admission Controller使用Pod的一些特征來判斷這些Pod,如果可以使用這些硬件,就添加Toleration來完成這一工作。要保障需要使用特殊硬件的Pod只被調(diào)度到安裝這些硬件的節(jié)點上,則還需要一些額外的工作,比如將這些特殊資源使用opaque-int-resource的方式對自定義資源進行量化,然后在PodSpec中進行請求;也可以使用標簽的方式來標注這些安裝有特別硬件的節(jié)點,然后在Pod中定義節(jié)點親和性來實現(xiàn)這個目標。

3.基于污點的驅(qū)逐,以應(yīng)對節(jié)點故障

前面提到的NoExecute這個Taint效果對節(jié)點上正在運行的Pod有以下影響。

◎ 沒有設(shè)置Toleration的Pod會被立刻驅(qū)逐。

◎ 配置了對應(yīng)Toleration的Pod,如果沒有為tolerationSeconds賦值,則會一直留在這一節(jié)點中。

◎ 配置了對應(yīng)Toleration的Pod且指定了tolerationSeconds值,則會在指定時間后驅(qū)逐。

◎ 把節(jié)點故障標記為Taint

當某種條件為真時,節(jié)點控制器會自動給節(jié)點添加一個污點。當前內(nèi)置的污點包括:

node.kubernetes.io/not-ready:節(jié)點未準備好。這相當于節(jié)點狀態(tài)?Ready?的值為 "False"。

node.kubernetes.io/unreachable:節(jié)點控制器訪問不到節(jié)點. 這相當于節(jié)點狀態(tài)?Ready?的值為 "Unknown"。

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/unschedulable: 節(jié)點不可調(diào)度。

node.cloudprovider.kubernetes.io/uninitialized:如果 kubelet 啟動時指定了一個 "外部" 云平臺驅(qū)動, 它將給當前節(jié)點添加一個污點將其標志為不可用。在 cloud-controller-manager 的一個控制器初始化這個節(jié)點后,kubelet 將刪除這個污點。

在節(jié)點被驅(qū)逐時,節(jié)點控制器或者 kubelet 會添加帶有 NoExecute 效應(yīng)的相關(guān)污點。 如果異常狀態(tài)恢復(fù)正常,kubelet 或節(jié)點控制器能夠移除相關(guān)的污點。

說明: 為了保證由于節(jié)點問題引起的 Pod 驅(qū)逐 速率限制行為正常, 系統(tǒng)實際上會以限定速率的方式添加污點。在像主控節(jié)點與工作節(jié)點間通信中斷等場景下, 這樣做可以避免 Pod 被大量驅(qū)逐。

例如,一個包含很多本地狀態(tài)的應(yīng)用可能需要在網(wǎng)絡(luò)發(fā)生故障時,還能持續(xù)在節(jié)點上運行,期望網(wǎng)絡(luò)能夠快速恢復(fù),從而避免被從這個節(jié)點上驅(qū)逐。

Pod的Toleration可以這樣定義:

tolerations :

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

operator:"Exists"

effect : "NoExecute"

tolerationSeconds : 6000

說明:

如果沒有為Pod指定node.kubernetes.io/not-ready的Toleration,那么Kubernetes會自動為Pod加入tolerationSeconds=300 的node.kubernetes.io/not-ready類型的Toleration。

同樣,如果Pod沒有定義node.kubernetes.io/unreachable的Toleration,那么系統(tǒng)會自動為其加入tolerationSeconds=300 的node.kubernetes.io/unreachable類型的Toleration。

這些系統(tǒng)自動設(shè)置的toleration在Node發(fā)現(xiàn)問題時,能夠為Pod確保驅(qū)逐前再運行5min。這兩個默認的Toleration由AdmissionController“DefaultTolerationSeconds”自動加入。

DaemonSet 中的 Pod 被創(chuàng)建時, 針對以下污點自動添加的 NoExecute 的容忍度將不會指定 tolerationSeconds:node.kubernetes.io/unreachable

node.kubernetes.io/not-ready

這保證了出現(xiàn)上述問題時 DaemonSet 中的 Pod 永遠不會被驅(qū)逐。

總結(jié)

以上是生活随笔為你收集整理的linux数据污点标记,Taints和Tolerations(污点和容忍)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。