1. 程式人生 > 實用技巧 >汙點Taint和容忍Toleration

汙點Taint和容忍Toleration

一、什麼是Taint和Toleration

    所謂汙點就是故意給某個節點伺服器上設定個汙點引數,那麼你就能讓生成pod的時候使用相應的引數去避開有汙點引數的node伺服器。而容忍呢,就是當資源不夠用的時候,即使這個node伺服器上有汙點,那麼只要pod的yaml配置檔案中寫了容忍引數,最終pod還是會容忍的生成在該汙點伺服器上。預設master節點是NoSchedule

二、Taint(汙點)

2.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驅逐出去

2.2、檢視某個節點的Taint配置情況

# 1、檢視所有node情況
[root@k8s-master01 ~]# kubectl get node
NAME           STATUS   ROLES    AGE     VERSION
k8s-master01   Ready    matser   7d19h   v1.20.0
k8s-master02   Ready    <none>   7d19h   v1.20.0
k8s-master03   Ready    <none>   7d19h   v1.20.0
k8s-node01     Ready    <none>   7d19h   v1.20.0
k8s-node02     Ready    <none>   7d19h   v1.20.0

# 2、檢視某個節點的Taint資訊(kubectl describe node nodename)
[root@k8s-master01 ~]# kubectl describe node k8s-node01  (內容太多不貼全了)
Name:               k8s-node01
Roles:              <none>
Labels:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    disktype=ssd
                    kubernetes.io/arch=amd64
                    kubernetes.io/hostname=k8s-node01
                    kubernetes.io/os=linux
                    node.kubernetes.io/node=
Annotations:        node.alpha.kubernetes.io/ttl: 0
                    volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp:  Mon, 21 Dec 2020 05:13:32 +0800
Taints:             <none>   # 關注這個地方即可 ---沒有設定過汙點的節點屬性中的引數是這樣的Taints:     <none>
Unschedulable:      false

2.3、給某個節點伺服器打上汙點標籤

# 1、先看一下當前pod都分佈到哪些節點上
[root@k8s-master01 ~]# kubectl get pod -owide 
NAME                        READY   STATUS  RESTARTS     AGE     IP                NODE           NOMINATED NODE   READINESS GATES
nginx-btl2c                 1/1     Running   3          6d      172.162.195.26    k8s-master03   <none>           <none>
nginx-c9qf5                 1/1     Running   3          6d      172.161.125.27    k8s-node01     <none>           <none>
nginx-pl9gs                 1/1     Running   3          6d      172.169.92.103    k8s-master02   <none>           <none>

# 2、給節點k8s-node01伺服器打上汙點標籤NoExecute
[root@k8s-master01 ~]# kubectl taint nodes k8s-node01 check=xtaint:NoExecute
`註釋:
check------->鍵 
value: "xtaint"----------->容忍的鍵對應的鍵值
"NoExecute"----------->容忍的鍵對應的影響效果effect
`
# 3、再次檢視pod,發現k8s-node01節點上的nginx-c9qf5容器正在被刪除,再過一會,就被徹底刪除了,這正是我們想要的效果!
[root@k8s-master01 ~]# kubectl get pod -owide
NAME             READY   STATUS        AGE   IP            NODE       NOMINATED NODE   READINESS GATES
nginx-c9qf5      1/1     Terminating   6d  172.161.125.27  k8s-node01  <none>           <none>

2.4、刪除某個節點上的設定的汙點

# 跟刪除標籤的方式有點類似,在後面加個 "-"
[root@k8s-master01 ~]# kubectl taint nodes k8s-node01 check=xtaint:NoExecute-
node/k8s-node01 untainted

"
 Taints: 		test=xtaint:NoExecute
			 	check=xtaint:NoSchedule
 				test=xtaint:NoSchedule
"
# 以上的Taints這樣刪,必須得帶個"-"
kubectl taint nodes k8s-node02 test=xtaint:NoExecute-
kubectl taint nodes k8s-node02 check=xtaint:NoSchedule-
kubectl taint nodes k8s-node02 test=xtaint:NoSchedule-

三、Toleration(容忍)

3.1、現在k8s-node02節點上打上一個NoSchedule

# 打上NoExecute,k8s-node02、k8s-master01、k8s-master02節點上的pod都會自動被刪除
[root@k8s-master01 ~]# kubectl taint nodes k8s-node02 test=xtaint:NoExecute
node/k8s-node02 tainted

3.2、建立一個包含有容忍toleration的配置檔案

cat > test-taint-pod.yaml << EFO
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.5.2
  tolerations:
  - key: "check"
    operator: "Equal"
    value: "xtaint"
    effect: "NoExecute"
    tolerationSeconds: 3600
EFO

# create Pod
[root@k8s-master01 app]# kubectl create -f test-taint-pod.yaml 
pod/nginx created

引數解釋

tolerations:----------->容忍
- key: "check" ----------->容忍的鍵
operator: "Equal"----------->操作符"等於"
value: "xtaint"----------->容忍的鍵對應的鍵值
effect: "NoExecute"----------->容忍的鍵對應的影響效果
tolerationSeconds: 3600----------->容忍3600秒。本pod配置檔案中有這個引數了,然後再給本伺服器設定汙點NoExecute,那麼這個pod也不會像普通pod那樣立即被驅逐,而是再等上3600秒才被刪除。

3.2、toleration配置方式

方式一:
tolerations:
- key: "key"
  operator: "Equal"
  value: "value"
  effect: "NoSchedule"
方式二:
tolerations:
- key: "key"
  operator: "Exists"
  effect: "NoSchedule"
  
   一個Toleration和一個Taint相匹配是指它們有一樣的key和effect,並且如果operator是Exists(此時toleration不指定value)或者operator是Equal,則它們的value應該相等。
注意兩種情況:

    如果一個Toleration的key為空且operator為Exists,表示這個Toleration與任意的key、value和effect都匹配,即這個Toleration能容忍任意的Taint:
tolerations:
- operator: "Exists"

    如果一個Toleration的effect為空,則key與之相同的相匹配的Taint的effect可以是任意值:
tolerations:
- key: "key"
  operator: "Exists"
  
   上述例子使用到effect的一個值NoSchedule,也可以使用PreferNoSchedule,該值定義儘量避免將Pod排程到存在其不能容忍的Taint的節點上,但並不是強制的。effect的值還可以設定為NoExecute。
   Kubernetes會自動給Pod新增一個key為node.kubernetes.io/not-ready的Toleration並配置tolerationSeconds=300,同樣也會給Pod新增一個key為node.kubernetes.io/unreachable的Toleration並配置tolerationSeconds=300,除非使用者自定義了上述key,否則會採用這個預設設定。
   一個使用了很多本地狀態的應用程式在網路斷開時,仍然希望停留在當前節點上執行一段時間,願意等待網路恢復以避免被驅逐。在這種情況下,Pod的Toleration可以這樣配置:
tolerations:
- key: "node.alpha.kubernetes.io/unreachable"
  operator: "Exists"
  effect: "NoExecute"
  tolerationSeconds: 6000