Kubernetes CKA課程筆記 61
前面幾篇都是偏向Pod來決定要被Scheduler到Node的規則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名稱}
當然也能直接看全部node的Taint設定,執行:
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-pair的tolerations
講師這邊還分享組好的看全部指定nameSpace的toleration jsonpath語法:
kubectl get pod -n kube-system -o custom-columns=POD_NAME:.metadata.name,TOLERATIONS:.spec.tolerations
參考如上這些Pod上有的toleration設置:
- effect:NoExecute
- operator:Exists
即可被佈署到master
實際演練toleration設置:
假設為了要收集Control Plane Node上的log需要
要讓Pod能夠佈署在master node上,所以幫這個Pod設置toleration
嘗試撰寫一個pod-with-tolerations.yaml:
先填入基本內容如下:
接著在containers同階層開始撰寫toleration內容:
參考官網片段內容描述前面taint的effect設置解說:
所以強制性來說NoExecute > NoSchedule
所以雖然master上的taint定義的是:NoSchedule
我們仍參考其他已經在上面的Pod定義的effect為NoExecute
所以改為如下:
但是這時候還會有個問題是=>
我們替這個Pod擴增tolerations設置
不看tolerations的話,另外兩台worker node基本也是都可以佈署
所以這時候就又要依賴前面59篇 & 60篇筆記學到的:
- NodeName
- NodeSelector
- NodeAffinity
以上設置來指定到master node上
所以用簡單的NodeName指定方式最終再改為:
接著就是執行建立並確認:
我課程這邊結束就先砍掉這個Pod: