一、目標
學習掌握什麼是kubernetes(k8s)集羣調度的污點Taint和容忍Toleration。
(白話解釋:所謂污點就是故意給某個節點服務器上設置個污點參數,那麼你就能讓生成pod的時候使用相應的參數去避開有污點參數的node服務器。而容忍呢,就是當資源不夠用的時候,及時這個node服務器上有污點,那麼只要pod的yaml配置文件中寫了容忍參數,最終pod還是會容忍的生成在該污點服務器上。默認master節點是NoSchedule)
二、平臺
[[email protected] ~]# uname -r
3.10.0-957.el7.x86_64
[[email protected] ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
[root@master qinhe]# rpm -qa |grep kube
kubeadm-1.17.3-0.x86_64
kubernetes-cni-0.7.5-0.x86_64
kubelet-1.17.3-0.x86_64
kubectl-1.17.3-0.x86_64
各主機規劃:
主機名 IP 角色 端口
master 192.168.73.150 master,node
node1 192.168.73.151 node
node2 192.168.73.152 node
harbor 192.168.73.160 harbor私服
三、概念
1.污點(Taint)的組成
使用kubectl taint命令可以給某個Node節點設置污點,Node被設置上污點之後就和Pod之間存在了一種相斥的關係,可以讓Node拒絕Pod的調度執行,甚至將Node已經存在的Pod驅逐出去。key=value:effect
每個污點有一個key和value作爲污點的標籤,其中value可以爲空,effect描述污點的作用。當前taint effect支持如下三個選項:
●NoSchedule:表示k8s將不會將Pod調度到具有該污點的Node上
●PreferNoSchedule:表示k8s將盡量避免將Pod調度到具有該污點的Node上
●NoExecute:表示k8s將不會將Pod調度到具有該污點的Node上,同時會將Node上已經存在的Pod驅逐出去
四、查看master節點的Taint配置情況
1.先查看所有節點kubectl get node,確認master節點的完整名字
2.查看master節點的詳情kubectl describe node master.hiibm.com
從下圖中可以清晰的看到master節點被默認的打上了污點屬性NoSchedule
五、給某個節點服務器打上污點標籤
1.先看一下當前pod都分佈到哪些節點上(沒有pod的話就自己創建幾個pod出來)
kubectl get pod -owide
2.給節點2服務器打上污點標籤NoExecute
kubectl taint nodes node2.hiibm.com check=xtaint:NoExecute
註釋:
check------->鍵
value: "xtaint"----------->容忍的鍵對應的鍵值
"NoExecute"----------->容忍的鍵對應的影響效果effect
3.觀察當前pod的變化過程
可以從圖中看到,xnode1上的那個叫xnode1的pod正在被刪除。再過一會,就被徹底刪除了。這正是我們想要的效果
4.刪除node上的設置的污點
kubectl taint nodes node2.hiibm.com check=xtaint:NoExecute-
沒有設置過污點的節點屬性中的參數是這樣的Taints: <none>
六、容忍Toleration
1.前言:
剛纔已經在node2節點上設置了污點【check=xtaint:NoExecute】,然後在node2上的以前運行的pod都自動的被刪除了。那麼接下來我們用容忍toleration看看能不能在node2節點上創建pod。
2.創建一個包含有容忍toleration的配置文件
[root@master taint]# vim a1-taint-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-3
labels:
app: pod-3
spec:
containers:
- name: pod-3
image: harbor.hiibm.com/public/xnginx:v1.5.20200306
tolerations:
- key: "check"
operator: "Equal"
value: "xtaint"
effect: "NoExecute"
tolerationSeconds: 3600
註釋:
tolerations:----------->容忍
- key: "check" ----------->容忍的鍵
operator: "Equal"----------->操作符"等於"
value: "xtaint"----------->容忍的鍵對應的鍵值
effect: "NoExecute"----------->容忍的鍵對應的影響效果
tolerationSeconds: 3600----------->容忍3600秒。納尼?啥意思?貌似是,好像本pod配置文件中有這個參數了,然後再給本服務器設置污點NoExecute,那麼這個pod也不會像普通pod那樣立即被驅逐,而是再等上3600秒才被刪除。
3.使用包含有容忍的配置文件生成pod
kubectl apply -f a1-taint-pod.yaml
4.查看包含容忍的這個pod生成到哪裏了
kubectl get pod -owide
註釋:
a. 之前我們只在node2.hiibm.com上設置了污點【check=xtaint:NoExecute】。也就是說,如果沒有特殊設定的情況下,普通的pod是永遠不會生成在node2服務器上的。
b. 那本次的pod配置文件已經明確寫了容忍條件,能夠準確匹配容忍node2上的污點,切記啊是準確匹配配置文件中的參數,少一個參數都不行。所以本次的pod運氣好的話還能繼續生成在node2服務器上。
c. 納尼?你運氣咋這麼好?如果運氣不好的話你也可以把node1服務器也設置上和node2一樣的污點。然後本pod就會像以前一樣隨意生成到任意一個節點服務器。
七、讓master節點設置儘可能當成節點服務器使用
kubectl taint nodes master.hiibm.com node-role.kubernetes.io/master=:PreferNoSchedule
註釋:上面這條命令是針對服務器master.hiibm.com,當node節點服務器資源不夠用的時候,pod也可以生成到這個服務器master.hiibm.com上。這樣能充分利用資源。
--------------------------------------------END----------------2020年3月9日16:03:10-------------------------------------
抵制伸手黨。隨手點贊啊老鐵,雙擊666