iT邦幫忙

2022 iThome 鐵人賽

DAY 23
0
DevOps

從認識Docker到精通系列 第 23

第二十三天 - Taints and Tolerations

  • 分享至 

  • xImage
  •  

Taints and Tolerations

Node affinity定義了結點的親和性,讓pod能夠優先的被排到理想中的node上運行;Taints (污點)的目的則是完全相反,他讓pod不可以被部署至特定節點,若在資源不足(或是不得不部署pod在這些 node )時,則以Toleration(容忍度)來做依據分配pod到這些node上

我們可以歸類出幾個重點

  • Taints:中定義出節點的污點,即不可部署到這個 pod 的幾個key

  • Toleration:定義節點的容忍度,設置容忍度可允許 pod 部署到有設置的節點上,若無設置容忍度

  • 有幾個類似情境便可以使用Taint

    • 無設置 GPU的裝置(node)
    • 儲存空間不足的裝置(node)
    • 有網路問題的裝置(node)

設置 TaintToleration

利用指令kubectl taint 即可在 node 上標示Taint

kubectl taint nodes node1 key=value:noSchedule

也要記得在pod的spec中定義toleration,才可讓Taints生效

tolerations:
- key: "key"
  operator: "Equal"
  value: "value"
  effect: "NoSchedule"

也可採用以下寫法:

tolerations:
- key: "key"
  operator: "Exists"
  effect: "NoSchedule"
  • Pod 的 Toleration 宣告中的 Key 和 effect 需和 Taint 的設置一致,才可以讓pod被分到有 Taint(s) 的 Node,operator若不設置則預設為 Equal
    • operator的值是 Exists (存在)
    • operator的值是 Equalvalue 相等
  • 空的 key 配合 Exists 能夠讓所有的key都符合
  • effect為設置則effect的所有值都符合

effect

  • NoSchedule:若某個 node 留下的 taint 的 effect 為 NoSchedule ,就不會把pod部署到node上,不影響執行中的pod
  • PreferNoSchedule:若某個 node 留下的 taint 的 effect 為 PreferNoSchedule ,就儘量不把pod部署到node上,但還是可能被部署到他上面,不影響執行中的pod
  • NoExecute:若某個node被設定了 NoExecute,若此 node 上已有此 taint 的 pod 會立刻被驅逐,也不會把這個pod再分配到該node上
    • 有個東西叫 TolerationSeconds,可表示在 taint 被增加後,帶有該 torleration 的 pod 可以存留多久

一個 pod 可以設置多個 Toleration,並針對實際環境作出對應,以下變有幾個情境:

Application

在部署環境中可能會遇見以下的類似情境,我們便可以利用taint和toleration的特性來應對這些情形

  • 讓特定使用者使用特定node
  • 讓配有特定硬體的node執行哪些pod
  • 排除故障的node

使用者獨佔節點

kubectl taint nodes nodename forspecial=groupName:NoSchedule

利用 taint 設定 forspecial 為特定的 groupName,其他的groupName的pod便不會被規劃到這個 node 上,僅有設有 toleration 的 pod 才可以部署

搭載特定硬體節點

like GPU運算加速等等的

kubectl taint nodes nodename gpu=true:NoSchedule  
  
kubectl taint nodes nodename fpga=true:NoSchedule

概念和上一個小節一樣,利用NoSchedulePreferNoSchedule來讓一般 pod 僅量不部署到這些 node

排除故障節點

故障的節點可能會影響整體服務的運行,維運者可以透過設定 taint 讓 k8s 接手 pod 退出 node 的程序,讓服務不受影響
設置指令跟上面一樣因此就不提了,但因為以下的問題滿常遇到的,因此 k8s 有個自動化的功能叫TaintBasedEvictions 會自動設定了下列的taint來對應處理這些問題,且預設TolerationSeconds為300,讓 Taint產生時不會使未設定 Toleration 的 pod 立刻被驅除

若要啟用TaintBaseEvictions,記得要打開他的feature gate喔!

最後有一個要注意的是,在設定pod退出node時要小心同時若有多個pod退出有可能會引起cluster的崩潰,因此要好好設想toleration的時間以及NoExecute的條件是否過於嚴格的問題!


上一篇
第二十二天-Taints and Tolerations
下一篇
第二十四天 - Storage In K8s
系列文
從認識Docker到精通30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言