kubernetes(k8s)-32之污點Taint和容忍Toleration

一、目標

學習掌握什麼是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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章