Kubernetes CKA課程筆記 61

Scheduling Pods — Taints & Tolerations,以Node為出發點的限制條件

ZONGRU Li
Nov 21, 2021

前面幾篇都是偏向Pod來決定要被SchedulerNode的規則Rule

但是其實也有反過來的,Node為出發點的規則(Rule)設置稱為 — Taint

Taint:

  • 設置在Node上
  • 通常用來做一些Pod佈署的抵制(repel)用途使用
  • 例如有一個Pod是有app: my-app設置
  • 假設有三台worker1~3
  • 其中worker1 & worker2嚴禁app: my-app的Pods佈署進去
  • 則最終Pod會佈署的worker3
  • 而設置的東西就是Taint
  • 查看Taint設定可以執行:

kubectl describe node {指定的node名稱}

當然也能直接看全部nodeTaint設定,執行:

kubectl describe node|grep Taints

如上可以發現目前只有master node有這個設置

這個則是源於kubeadm執行的init時候建立的

但是記得我們有些Pod也真的還是佈署在master機上:

上圖意味著,一定有某種方式可以將Pod佈署在master node上!

而這個某種方式就是 — Toleration

Toleration:

  • 設置在Pod上
  • 使允許Pod被只要符合taints就可以Scheduler到該Node

由上面的特性線索

所以我們可以來看看像是etcd-master這個Pod上有什麼設置,執行:

kubectl describe pod -n kube-system etcd-master

上面顯示的值可能不夠明確

所以換執行json格是輸出,執行:

kubectl get pod -n kube-system etcd-master -o json

如上圖有看到兩組的key-pairtolerations

講師這邊還分享組好的看全部指定nameSpacetoleration jsonpath語法:

kubectl get pod -n kube-system -o custom-columns=POD_NAME:.metadata.name,TOLERATIONS:.spec.tolerations

參考如上這些Pod上有的toleration設置:

  1. effect:NoExecute
  2. operator:Exists

即可被佈署到master

實際演練toleration設置:

假設為了要收集Control Plane Node上的log需要

要讓Pod能夠佈署在master node上,所以幫這個Pod設置toleration

嘗試撰寫一個pod-with-tolerations.yaml:

先填入基本內容如下:

接著在containers同階層開始撰寫toleration內容:

參考官網片段內容描述前面tainteffect設置解說:

link

所以強制性來說NoExecute > NoSchedule

所以雖然master上的taint定義的是:NoSchedule

我們仍參考其他已經在上面的Pod定義的effectNoExecute

所以改為如下:

但是這時候還會有個問題是=>

我們替這個Pod擴增tolerations設置

不看tolerations的話,另外兩台worker node基本也是都可以佈署

所以這時候就又要依賴前面59篇 & 60篇筆記學到的:

  1. NodeName
  2. NodeSelector
  3. NodeAffinity

以上設置來指定到master node

所以用簡單的NodeName指定方式最終再改為:

儲存!

接著就是執行建立並確認:

成功!!!

我課程這邊結束就先砍掉這個Pod:

參考課程(reference)

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet