精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何用三只兔子的故事來輕松理解 Kubernetes 污點(diǎn)和容忍

系統(tǒng) Linux
本文通過自身理解進(jìn)行述說,如有不準(zhǔn)確的地方,請指正。

前言

本文通過自身理解進(jìn)行述說,如有不準(zhǔn)確的地方,請指正。

在講述一系列相關(guān)專業(yè)術(shù)語之前,先嘗試用一個通俗易懂的故事來說明 Kubernetes 中 node 與 pod 之間的愛恨情仇。

雄性(node)| 雌性(pod)

在銀河系以外的一個星球上,有著一群兩性生物,分別是雌性(pod)和雄性(node)。雌性生物居多,而雄性生物由于優(yōu)勝劣汰,只剩下 3 只優(yōu)質(zhì)的雄性生物(node)。雄雌在一起就容易產(chǎn)生吸引,就會有以下的情況產(chǎn)生:

(1)雄(node)少雌(pod)多,而這三只優(yōu)質(zhì)的雄性生物性格、優(yōu)點(diǎn)都是一致的,雌性生物選誰都一樣。于是,雌性生物就分為均等分為三列和三只雄性生物在一起。這種類似于平均分配的原則。

k8s 中的概念:在 k8s 中是最常見最普通的 pod 分布方式,常用與 deployment 和 daemonset 控制器。

(2)時間一長,生物開始了進(jìn)化。三只雄性(node)生物各自有了不一樣的地方,編號 1 的雄性學(xué)會了種植(node01 label skill='grow');編號 2 的雄性學(xué)會了打獵(node02 label skill='hunt');編號 3 的雄性啥也沒學(xué)會(沒學(xué)會就保持默認(rèn))。普通的雌性(pod)仍然保持著平均分配的原則。而一些進(jìn)化快的雌性(pod)生物發(fā)現(xiàn)了三只優(yōu)質(zhì)雄性(node)生物各自的不同,各自也開始有了一些選擇。一些雌性更加青睞學(xué)會種植的雄性生物(nodeSelector skill='grow') ;一些雌性更加青睞學(xué)打獵的雄性生物(nodeSelector skill='hunt') ;而有些雌性生物喜歡的特點(diǎn)很奇特,它們喜歡會飛的雄性,而僅存的三只雄性生物都無法滿足這一特點(diǎn)。如果有天一只雄性生物進(jìn)化會飛了,它們就會依附與會飛的雄性生物,如果始終沒有進(jìn)化出會飛的雄性生物,則它們一直等下去這在 k8s 中,就是 yaml 文件中 nodeSelector 的使用。

 k8s 中的概念:當(dāng) node 打上特定的標(biāo)簽后,會出現(xiàn)如下情況:

  1.   pod 中未指定 nodeSelector ,則保持默認(rèn) schedule 調(diào)度算法的方式;
  2.   pod 中指定了 nodeSelector ,且指定 nodeSelector 中的 key、value 符合某一個 node 中的某一個 key、value,則這個 pod 直接調(diào)度到該 node;
  3.   pod 中指定了 nodeSelector ,指定 nodeSelector 中的 key、value 不包含在任何一個 node 中,則這個 pod 會一直處于 padding 狀態(tài)。

(3)三只雄性(node)不僅優(yōu)點(diǎn)增長了,缺點(diǎn)也隨之而來。編號 1 的雄性喜歡打臉(node01 taint hobby='face');編號 2 的雄性喜歡打屁股(node01 taint hobby='hunkers');編號 3 的雄性喜歡踩腳(node01 taint hobby='foot');普通的雌性(pod)生物仍然保持平均分配的原則,而一些再次進(jìn)化的雌性生物也有了自己的性格。能夠容忍打臉的雌性則和編號 1 的雄性在一起(tolerations hobby='face'),但是這個容忍可能是永久,也可能是 1 天(tolerationSeconds=86400)。而這三只雄性生物偶爾會在一起鬼混,編號 1 的雄性生物說不定哪天就嗜好就變?yōu)榱讼矚g睡懶覺。而一些無法容忍它睡懶覺嗜好的雌性生物就會隔一段時間或者馬上就離開它。

k8s 中的概念:這就是 污點(diǎn) 與 容忍。

污點(diǎn)和容忍還有其他的選項(xiàng)參數(shù),后文展開解說。

nodeSelector

將 pod 分配給指定的節(jié)點(diǎn)。

集群如下: 

  1. $ kubectl get nodes  
  2. NAME         STATUS   ROLES    AGE   VERSION  
  3. k8s-master   Ready    master   20h   v1.19.7  
  4. k8s-node01   Ready    <none>   20h   v1.19.7  
  5. k8s-node02   Ready    <none>   20h   v1.19.7 

為 k8s-node01 添加一個標(biāo)簽 

  1. $ kubectl label nodes k8s-node01 disktype=ssd  
  2. node/k8s-node01 labeled 

查看標(biāo)簽 

  1. $ kubectl get nodes --show-labels  
  2. NAME         STATUS   ROLES    AGE   VERSION   LABELS  
  3. k8s-master   Ready    master   20h   v1.19.7   ..., kubernetes.io/hostname=k8s-master  
  4. k8s-node01   Ready    <none>   20h   v1.19.7   ..., disktype=ssd,kubernetes.io/hostname=k8s-node01  
  5. k8s-node02   Ready    <none>   20h   v1.19.7   ..., kubernetes.io/hostname=k8s-node02 

可以看到 k8s-node01 節(jié)點(diǎn)標(biāo)簽:disktype=ssd

創(chuàng)建一個調(diào)度到 選擇節(jié)點(diǎn)的 Pod 

  1. apiVersion: apps/v1  
  2. kind: Deployment  
  3. metadata:  
  4.   labels:  
  5.     app: ngx  
  6.   name: ngx  
  7. spec:  
  8.   replicas: 2  
  9.   selector:  
  10.     matchLabels:  
  11.       app: ngx  
  12.   template:  
  13.     metadata:  
  14.       labels: 
  15.         app: ngx  
  16.     spec:  
  17.       containers:  
  18.       - image: nginx:alpine-arm64  
  19.         name: nginx  
  20.       nodeSelector:  
  21.         disktype: ssd    #### 選擇服務(wù) key: value 的節(jié)點(diǎn)  

創(chuàng)建 pod 查看是否調(diào)度到指定的節(jié)點(diǎn) 

  1. $ kubectl apply -f  ngx.yaml  
  2. deployment.apps/ngx created  
  3. $ kubectl get po -o wide  
  4. NAME                   READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES  
  5. ngx-5f4df66559-hjmzg   1/1     Running   0          10s   10.244.1.13   k8s-node01   <none>           <none>  
  6. ngx-5f4df66559-wqgdb   1/1     Running   0          10s   10.244.1.14   k8s-node01   <none>           <none> 

k8s 親和性

說道親和性,親和性主要分為兩類:nodeAffinity 和 podAffinity 。

nodeAffinity

nodeAffinity 就是節(jié)點(diǎn)親和性,調(diào)度可以分成軟策略和硬策略兩種方式,軟策略就是如果你沒有滿足調(diào)度要求的節(jié)點(diǎn)的話,POD 就會忽略這條規(guī)則,繼續(xù)完成調(diào)度過程,說白了就是滿足條件最好了,沒有的話也無所謂了的策略;而硬策略就比較強(qiáng)硬了,如果沒有滿足條件的節(jié)點(diǎn)的話,就不斷重試直到滿足條件為止,簡單說就是你必須滿足我的要求,不然我就不干的策略。nodeAffinity就有兩上面兩種策略:

  •  requiredDuringSchedulingIgnoredDuringExecution :硬策略
  •  preferredDuringSchedulingIgnoredDuringExecution :軟策略

硬策略 

  1. apiVersion: apps/v1  
  2. kind: Deployment  
  3. metadata:  
  4.   labels:  
  5.     app: ngx  
  6.   name: ngx  
  7. spec:  
  8.   replicas: 2  
  9.   selector: 
  10.      matchLabs:  
  11.       app: ngx  
  12.   template:  
  13.     metadata:  
  14.       labels:  
  15.         app: ngx  
  16.     spec:  
  17.       affinity:  
  18.         nodeAffinity:  
  19.           requiredDuringSchedulingIgnoredDuringExecution:  
  20.             nodeSelectorTerms:  
  21.             - matchExpressions:  
  22.               - key: disktype ## key 的值  
  23.                 operator: In ## 包括  
  24.                 values:  
  25.                 - ssd ## value  
  26.       containers:  
  27.       - image: nginx:alpine-arm64  
  28.         name: nginx  
  29.       nodeSelector:  
  30.         disktype: ssd 

上面這兩個 pod 只會運(yùn)行在 滿足 node label disktype=value 的節(jié)點(diǎn)上,如果沒有節(jié)點(diǎn)滿足這個條件,則一直處于 pending 狀態(tài)。 

  1. $ kubectl get po -o wide  
  2. NAME                  READY   STATUS    RESTARTS   AGE     IP            NODE         NOMINATED NODE   READINESS GATES  
  3. ngx-7b65b44bc-gff9x   1/1     Running   0          3m53s   10.244.1.15   k8s-node01   <none>           <none>  
  4. ngx-7b65b44bc-w7bsf   1/1     Running   0          3m53s   10.244.1.16   k8s-node01   <none>           <none>  
  5. $ kubectl get nodes k8s-node01 --show-labels  
  6. NAME         STATUS   ROLES    AGE   VERSION   LABELS  
  7. k8s-node01   Ready    <none>   22h   v1.19.7   ..., disktype=ssd,kubernetes.io/arch=arm64,kubernetes.io/hostname=k8s-node01 

軟策略 

  1. apiVersion: apps/v1  
  2. kind: Deployment  
  3. metadata:  
  4.   labels:  
  5.     app: ngx  
  6.   name: ngx 
  7. spec:  
  8.   replicas: 2  
  9.   selector:  
  10.     matchLabels:  
  11.       app: ngx  
  12.   template:  
  13.     metadata:  
  14.       labels:  
  15.         app: ngx  
  16.     spec:  
  17.       affinity:  
  18.         nodeAffinity:  
  19.           preferredDuringSchedulingIgnoredDuringExecution:  
  20.           - weight: 10  
  21.             preference:  
  22.               matchExpressions:  
  23.               - key: disktype  
  24.                 operator: In  
  25.                 values: 
  26.                 - hdd 
  27.       containers:  
  28.       - image: nginx:alpine-arm64  
  29.         name: nginx 

軟策略就是,第一選擇是 node label disktype=hdd 的節(jié)點(diǎn),如果沒有,就采用默認(rèn) scheduler 的調(diào)度策略,沒有強(qiáng)制性。 

  1. $ kubectl get po -o wide  
  2. NAME                  READY   STATUS    RESTARTS   AGE     IP            NODE         NOMINATED NODE   READINESS GATES  
  3. ngx-d4754b6fd-lr96g   1/1     Running   0          2m55s   10.244.2.13   k8s-node02   <none>           <none>  
  4. ngx-d4754b6fd-ns7hs   1/1     Running   0          2m55s   10.244.1.28   k8s-node01   <none>           <none> 

operator 提供如下幾種操作:

  •  In:label 的值在某個列表中
  •  NotIn:label 的值不在某個列表中
  •  Gt:label 的值大于某個值
  •  Lt:label 的值小于某個值
  •  Exists:某個 label 存在
  •  DoesNotExist:某個 label 不存在

如果nodeSelectorTerms下面有多個選項(xiàng)的話,滿足任何一個條件就可以了;如果matchExpressions有多個選項(xiàng)的話,則必須同時滿足這些條件才能正常調(diào)度 POD。

污點(diǎn)和容忍

在 Kubernetes 中,節(jié)點(diǎn)親和性 NodeAffinity 是 Pod 上定義的一種屬性,能夠使 Pod 按我們的要求調(diào)度到某個節(jié)點(diǎn)上,而 Taints(污點(diǎn)) 則恰恰相反,它是 Node 上的一個屬性,可以讓 Pod 不能調(diào)度到帶污點(diǎn)的節(jié)點(diǎn)上,甚至?xí)埸c(diǎn)節(jié)點(diǎn)上已有的 Pod 進(jìn)行驅(qū)逐。當(dāng)然,對應(yīng)的 Kubernetes 可以給 Pod 設(shè)置 Tolerations(容忍) 屬性來讓 Pod 能夠容忍節(jié)點(diǎn)上設(shè)置的污點(diǎn),這樣在調(diào)度時就會忽略節(jié)點(diǎn)上設(shè)置的污點(diǎn),將 Pod 調(diào)度到該節(jié)點(diǎn)。一般時候 Taints 通常與 Tolerations 配合使用。

污點(diǎn)(Taints)

查看污點(diǎn)

查看 node 的污點(diǎn) 

  1. $ kubectl describe nodes k8s-master  
  2. ...  
  3. Taints:             node-role.kubernetes.io/master:NoSchedule  
  4. ...  
  5. # 也可通過下面操作查看:  
  6. $ kubectl get nodes k8s-master -o go-template={{.spec.taints}}  
  7. [map[effect:NoSchedule key:node-role.kubernetes.io/master]] 

污點(diǎn)內(nèi)容一般組成為 key、value 及一個 effect 三個元素,表現(xiàn)為:

  1. <key>=<value>:<effect> 

這里的 value 可以為空,表現(xiàn)形式為: 

  1. node-role.kubernetes.io/master:NoSchedule  
  2. - key: node-role.kubernetes.io/master  
  3. - value: 空 
  4. - effect: NoSchedule 

設(shè)置污點(diǎn)

一般我們需要想要設(shè)置某個節(jié)點(diǎn)只允許特定的 Pod 進(jìn)行調(diào)度,這時候就得對節(jié)點(diǎn)設(shè)置污點(diǎn),可以按 kubectl taint node [node] key=value[effect] 格式進(jìn)行設(shè)置,其中 effect 可取值如下:

  •  PreferNoSchedule: 盡量不要調(diào)度。
  •  NoSchedule: 一定不能被調(diào)度。
  •  NoExecute: 不僅不會調(diào)度, 還會驅(qū)逐 Node 上已有的 Pod。

一般時候我們設(shè)置污點(diǎn),就像下面例子一樣對齊進(jìn)行設(shè)置: 

  1. ### 設(shè)置污點(diǎn)并不允許 Pod 調(diào)度到該節(jié)點(diǎn)  
  2. $ kubectl taint node k8s-master key1=value1:NoSchedule  
  3. ### 設(shè)置污點(diǎn)盡量阻止污點(diǎn)調(diào)度到該節(jié)點(diǎn)  
  4. $ kubectl taint node k8s-master key2=value2:PreferNoSchedule  
  5. ### 設(shè)置污點(diǎn),不允許普通 Pod 調(diào)度到該節(jié)點(diǎn),且將該節(jié)點(diǎn)上已經(jīng)存在的 Pod 進(jìn)行驅(qū)逐  
  6. $ kubectl taint node k8s-master key3=value3:NoExecute 

刪除污點(diǎn)

上面說明了如何對 Node 添加污點(diǎn)阻止 Pod 進(jìn)行調(diào)度,下面再說一下如何刪除節(jié)點(diǎn)上的污點(diǎn),可以使用下面命令: 

  1. kubectl taint node [node] [key]- 

上面語法和創(chuàng)建污點(diǎn)類似,不過需要注意的是刪除污點(diǎn)需要知道 key 和最后面設(shè)置一個 "-" 兩項(xiàng)將污點(diǎn)刪除,示例如下:

為了方便演示,先給節(jié)點(diǎn)設(shè)置污點(diǎn): 

  1. ### 設(shè)置污點(diǎn)1  
  2. $ kubectl taint node k8s-master key1=value1:PreferNoSchedule  
  3. node/k8s-master tainted  
  4. ### 設(shè)置污點(diǎn)2  
  5. $ kubectl taint node k8s-master key2=value2:NoSchedule  
  6. node/k8s-master tainted  
  7. ### 設(shè)置污點(diǎn)3,并且不設(shè)置 value  
  8. $ kubectl taint node k8s-master key2=:PreferNoSchedule  
  9. node/k8s-master tainted 

查看污點(diǎn),可以看到上面設(shè)置的三個值: 

  1. $ kubectl describe nodes k8s-master  
  2. ...  
  3. Taints:             key2=value2:NoSchedule  
  4.                     node-role.kubernetes.io/master:NoSchedule  
  5.                     key1=value1:PreferNoSchedule  
  6.                     key2:PreferNoSchedule 
  7.  ... 

然后刪除污點(diǎn) 

  1. ### 刪除污點(diǎn),可以不指定 value,指定 [effect] 值就可刪除該 key[effect] 的污點(diǎn)  
  2. $ kubectl taint node k8s-master key1:PreferNoSchedule-  
  3. ### 也可以根據(jù) key 直接將該 key2 的所有 [effect] 都刪除:  
  4. $ kubectl taint node k8s-master key2- 

再次查看污點(diǎn),可以看到以上污點(diǎn)都被刪除: 

  1. $ kubectl describe nodes k8s-master  
  2. ...  
  3. Taints:             node-role.kubernetes.io/master:NoSchedule  
  4. ...  

容忍 (toleratints)

Pod 設(shè)置容忍

為了使某些 Pod 禁止調(diào)度到某些特定節(jié)點(diǎn)上,就可以對節(jié)點(diǎn)設(shè)置污點(diǎn) taints。當(dāng)然,如果希望有些 Pod 能夠忽略節(jié)點(diǎn)的污點(diǎn),繼續(xù)能夠調(diào)度到該節(jié)點(diǎn),就可以對 Pod 設(shè)置容忍,讓 Pod 能夠容忍節(jié)點(diǎn)上設(shè)置的污點(diǎn),例如:

對一個節(jié)點(diǎn)設(shè)置污點(diǎn): 

  1. kubectl taint node k8s-node01 key=value:NoSchedule 

對于 Pod 設(shè)置容忍, 以下兩種方式都可以: 

  1. ### 容忍的 key、value 和對應(yīng) effect 也必須和污點(diǎn) taints 保持一致  
  2. ......  
  3. tolerations:  
  4. - key: "key"  
  5.   operator: "Equal" 
  6.   value: "value"  
  7.   effect: "NoSchedule"  
  8. ### 容忍 tolerations 的 key 和要污點(diǎn) taints 的 key 一致,且設(shè)置的 effect 也相同,不需要設(shè)置 value  
  9. ......  
  10. tolerations:  
  11. - key: "key"  
  12.   operator: "Exists"  
  13.   effect: "NoSchedule" 

Node 和 Pod 對于污點(diǎn)與容忍基本概念

概念

  •  一個 node 可以有多個污點(diǎn);
  •  一個 pod 可以有多個容忍;
  •  kubernetes 執(zhí)行多個污點(diǎn)和容忍方法類似于過濾器

如果一個 node 有多個污點(diǎn),且 pod 上也有多個容忍,只要 pod 中容忍能包含 node 上設(shè)置的全部污點(diǎn),就可以將 pod 調(diào)度到該 node 上。如果 pod 上設(shè)置的容忍不能夠包含 node 上設(shè)置的全部污點(diǎn),且 node 上剩下不能被包含的污點(diǎn) effect 為 PreferNoSchedule,那么也可能會被調(diào)度到該節(jié)點(diǎn)。

注意

當(dāng) pod 總存在 容忍,首先 pod 會選擇沒有污點(diǎn)的節(jié)點(diǎn),然后再次選擇容忍污點(diǎn)的節(jié)點(diǎn)。

  •  如果 node 上帶有污點(diǎn) effect 為 NoSchedule,而 pod 上不帶響應(yīng)的容忍,kubernetes 就不會調(diào)度 pod 到這臺 node 上。
  •  如果 Node 上帶有污點(diǎn) effect 為 PreferNoShedule,這時候 Kubernetes 會努力不要調(diào)度這個 Pod 到這個 Node 上。
  •  如果 Node 上帶有污點(diǎn) effect 為 NoExecute,這個已經(jīng)在 Node 上運(yùn)行的 Pod 會從 Node 上驅(qū)逐掉。沒有運(yùn)行在 Node 的 Pod 不能被調(diào)度到這個 Node 上。一般使用與當(dāng)某個節(jié)點(diǎn)處于 NotReady 狀態(tài)下,pod 迅速在其他正常節(jié)點(diǎn)啟動。

Deployment 中設(shè)置容忍

在 kubernetes 中 deployment 設(shè)置容忍,示例如下: 

  1. apiVersion: apps/vl  
  2. kind: Deployment  
  3. metadata:  
  4.   name: example  
  5. spec:  
  6.   replicas: 5  
  7.   template:  
  8.     spec:  
  9.       ......  
  10.       tolerations:  
  11.       - key: "key"  
  12.         operator: "Equal"  
  13.         value: "value"  
  14.         effect: "NoSchedule" 

設(shè)置容忍時間

正常情況下, 如果一個污點(diǎn)帶有 effect=NoExecute 被添加到了這個 Node。那么不能容忍這個污點(diǎn)的所有 Pod 就會立即被踢掉。而帶有容忍標(biāo)簽的 Pod 就不會踢掉。然而,一個帶有 effect=Noexecute 的容忍可以指定一個 tolerationSeconds 來指定當(dāng)這個污點(diǎn)被添加的時候在多長時間內(nèi)不被踢掉。例如: 

  1. tolerations:  
  2. - key: "key"  
  3.   operator: "Equal"  
  4.   value: "value"  
  5.   effect: "Noexecute"  
  6.   tolerationSeconds: 3600 

如果這個 Pod 已經(jīng)在這個帶污點(diǎn)且 effect 為 NoExecute 的 node 上。這個 pod 可以一直運(yùn)行到 3600s 后再被踢掉。如果這時候 Node 的污點(diǎn)被移除了,這個 Pod 就不會被踢掉。

容忍示例

Operator 默認(rèn)是 Equal,可設(shè)置為 Equal 與 Exists 兩種,按這兩種進(jìn)行示例:

Operator 是 Exists

容忍任何污點(diǎn)

例如一個空的 key,將匹配所有的 key、value、effect。即容忍任何污點(diǎn)。 

  1. tolerations:  
  2. - operator: "Exists" 

容忍某 key 值的污點(diǎn)

例如一個空的 effect,并且 key 不為空,那么將匹配所有與 key 相同的 effect: 

  1. tolerations:  
  2. - key: "key"  
  3.   operator: "Exists" 

Operator 是 Equal

node 上有一個污點(diǎn)

Node 和 Pod 的 key 為 key1、value1 與 effect 相同則能調(diào)度: 

  1. #污點(diǎn)  
  2. key1=value1:NoSchedule  
  3. #Pod設(shè)置  
  4. tolerations:  
  5. - key: "key1"  
  6.   operator: "Equal"  
  7.   value: "value1"  
  8.   effect: "NoSchedule" 

node 上有多個污點(diǎn)

Node 的污點(diǎn)的 key、value、effect 和 Pod 容忍都相同則能調(diào)度: 

  1. ## 設(shè)置污點(diǎn)  
  2. key1=value1:NoSchedule  
  3. key2=value2:NoExecute  
  4. ## Pod設(shè)置容忍  
  5. tolerations:  
  6. - key: "key1"  
  7.   operator: "Equal"  
  8.   value: "value1"  
  9.   effect: "NoSchedule"  
  10. - key: "key2"  
  11.   operator: "Equal"  
  12.   value: "value2"  
  13.   effect: "NoExecute" 

Node 的污點(diǎn)和 Pod 的大部分都相同,不同的是 Node 污點(diǎn) effect 為 PreferNoSchedule 的,可能會調(diào)度: 

  1. ## 污點(diǎn)  
  2. key1=value1:NoSchedule  
  3. key2=value2:NoExecute  
  4. key3=value3:PreferNoSchedule  
  5. ## Pod設(shè)置容忍  
  6. tolerations:  
  7. - key: "key1"  
  8.   operator: "Equal"  
  9.   value: "value1"  
  10.   effect: "NoSchedule"  
  11. - key: "key2"  
  12.   operator: "Equal"  
  13.   value: "value2"  
  14.   effect: "NoExecute" 

Node 的污點(diǎn)和 Pod 的大部分都相同,不同的是 Node 污點(diǎn) effect 為 NoSchedule 和 NoExecute 的,不會被調(diào)度: 

  1. ## 污點(diǎn)  
  2. key1=value1:NoSchedule  
  3. key2=value2:NoExecute  
  4. key3=value3:PreferNoSchedule  
  5. ## Pod設(shè)置容忍  
  6. tolerations:  
  7. - key: "key1"  
  8.   operator: "Equal"  
  9.   value: "value1"  
  10.   effect: "NoSchedule"  
  11. - key: "key3"  
  12.   operator: "Equal"  
  13.   value: "value3"  
  14.   effect: "PreferNoSchedule" 

對比理解 Exists 和 Equal 之間的區(qū)別:

  •  Exists 是包含,Equal 是等于,Exists 使用范圍更廣,而 Equal 則是精準(zhǔn)匹配。
  •  當(dāng)污點(diǎn)中存在 NoExecute 時,而容忍中不存在 NoExecute 時,不會被調(diào)度到該節(jié)點(diǎn)。
  •  Exists 可以不寫 value , 而 Equal 則一定要指定對應(yīng)的 value

污點(diǎn)驅(qū)逐

在使用 kubernetes 時,會遇到 某個 node 節(jié)點(diǎn)明明已經(jīng) 宕機(jī)了,查看 node 狀態(tài)從 Ready 狀態(tài)變?yōu)?NotReady 狀態(tài),但是 節(jié)點(diǎn)所在的 pod 卻已經(jīng)處于 running 狀態(tài),過了很長一段時間才會轉(zhuǎn)為 Terminating 狀態(tài),這是為什么呢?

污點(diǎn)是對于 node 節(jié)點(diǎn)來講,如果 node 節(jié)點(diǎn) effect 設(shè)置為 NoExecute ,它會影響節(jié)點(diǎn)上已經(jīng)運(yùn)行的 Pod,如下所示:

  •  立即將沒有匹配容忍的 pod 驅(qū)逐。
  •  設(shè)置容忍但是沒有指定 tolerationSeconds 參數(shù)的,那么該容忍永久生效,不會被驅(qū)逐。
  •  設(shè)置容忍但是有指定 tolerationSeconds 參數(shù)的,那么在指定的時間內(nèi)容忍有效,超過指定時間后將被剔除。(pod 默認(rèn)設(shè)置,tolerationSeconds = 300s)

此外,當(dāng)某些條件為 true 時,節(jié)點(diǎn)控制器會自動污染節(jié)點(diǎn)。內(nèi)置以下污點(diǎn):

key 注釋
node.kubernetes.io/not-ready 節(jié)點(diǎn)尚未準(zhǔn)備好。這對應(yīng)于 NodeCondition Ready 為 false。
node.kubernetes.io/unreachable 無法從節(jié)點(diǎn)控制器訪問節(jié)點(diǎn)。這對應(yīng)于 NodeCondition Ready 為 Unknown。
node.kubernetes.io/out-of-disk 節(jié)點(diǎn)磁盤不足。
node.kubernetes.io/memory-pressure 節(jié)點(diǎn)有內(nèi)存壓力。
node.kubernetes.io/disk-pressure 節(jié)點(diǎn)有磁盤壓力。
node.kubernetes.io/network-unavailable 節(jié)點(diǎn)的網(wǎng)絡(luò)不可用。
node.kubernetes.io/unschedulable 節(jié)點(diǎn)不可調(diào)度。
node.cloudprovider.kubernetes.io/uninitialized 當(dāng) kubelet 從 "外部" 云提供程序開始時,此污點(diǎn)在節(jié)點(diǎn)上設(shè)置為將其標(biāo)記為不可用。來自 cloud-controller-manager 的控制器初始化此節(jié)點(diǎn)后,kubelet 刪除此污點(diǎn)。

通過上面知識的鋪墊,當(dāng)一個節(jié)點(diǎn)宕機(jī)時,kubernetes 集群會給它打上什么樣的污點(diǎn)呢?

一個 Ready 狀態(tài)的節(jié)點(diǎn) 

  1. $ kubectl get node k8s-node02 -o go-template={{.spec.taints}}  
  2. <no value> 

一個 NotReady 狀態(tài)的節(jié)點(diǎn) 

  1. $ kubectl get node k8s-node02 -o go-template={{.spec.taints}}  
  2. [map[effect:NoSchedule key:node.kubernetes.io/unreachable timeAdded:2021-12-23T13:49:58Z] map[effect:NoExecute key:node.kubernetes.io/unreachable timeAdded:2021-12-23T13:50:03Z]] 

 處于 NotReady 狀態(tài)的節(jié)點(diǎn)被打上了下面兩個污點(diǎn): 

  1. Taints:             node.kubernetes.io/unreachable:NoExecute  
  2.                     node.kubernetes.io/unreachable:NoSchedule 

接下來測試 kubernetes 集群會給 Pod 分配什么樣的容忍。 

  1. $ kubectl get po nginx-745b4df97d-mgdmp -o yaml  
  2. ...  
  3.   tolerations:  
  4.   - effect: NoExecute  
  5.     key: node.kubernetes.io/not-ready  
  6.     operator: Exists  
  7.     tolerationSeconds: 300  ## 300/60=5min  
  8.   - effect: NoExecute  
  9.     key: node.kubernetes.io/unreachable  
  10.     operator: Exists  
  11.     tolerationSeconds: 300 ## 300/60=5min  
  12. ... 

看到這里,Pod 的失效機(jī)制已經(jīng)很明白了, 當(dāng) node 節(jié)點(diǎn)處于 NotReady 狀態(tài)或者 unreachable 狀態(tài)時,Pod 會容忍它 5 分鐘,然后被驅(qū)逐。而這 5 分鐘內(nèi)就算 Pod 處于 running 狀態(tài),也是無法正常提供服務(wù)的。因此,可以在 yaml 清單中 手動指明 0 容忍,清單文件如下: 

  1. apiVersion: apps/v1  
  2. kind: Deployment  
  3. metadata:  
  4.   labels:  
  5.     app: nginx  
  6.   name: nginx  
  7. spec:  
  8.   replicas: 4  
  9.   selector:  
  10.     matchLabels:  
  11.       app: nginx  
  12.   template:  
  13.     metadata:  
  14.       labels:  
  15.         app: nginx  
  16.     spec:  
  17.       tolerations:  
  18.       - effect: NoExecute  
  19.         key: node.kubernetes.io/not-ready  
  20.         operator: Exists  
  21.         tolerationSeconds: 0  
  22.       - effect: NoExecute  
  23.         key: node.kubernetes.io/unreachable  
  24.         operator: Exists  
  25.         tolerationSeconds: 0  
  26.       containers:  
  27.       - image: nginx:alpine  
  28.         name: nginx 

生成 Pod 

  1. $ kubectl get po -o wide  
  2. NAME                    READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES  
  3. nginx-84f6f75c6-c76fm   1/1     Running   0          6s    10.244.3.16   k8s-node02   <none>           <none>  
  4. nginx-84f6f75c6-hsxq5   1/1     Running   0          6s    10.244.3.15   k8s-node02   <none>           <none>  
  5. nginx-84f6f75c6-wkt52   1/1     Running   0          6s    10.244.1.63   k8s-node01   <none>           <none>  
  6. nginx-84f6f75c6-xmkjs   1/1     Running   0          6s    10.244.3.17   k8s-node02   <none>           <none> 

接下來強(qiáng)制關(guān)閉 k8s-node02 節(jié)點(diǎn),查看 Pod 是否轉(zhuǎn)移。 

  1. $ kubectl get po -o wide  
  2. NAME                    READY   STATUS        RESTARTS   AGE    IP            NODE         NOMINATED NODE   READINESS GATES  
  3. nginx-84f6f75c6-c76fm   1/1     Terminating   0          116s   10.244.3.16   k8s-node02   <none>           <none>  
  4. nginx-84f6f75c6-csqf4   1/1     Running       0          13s    10.244.1.66   k8s-node01   <none>           <none>  
  5. nginx-84f6f75c6-hsxq5   1/1     Terminating   0          116s   10.244.3.15   k8s-node02   <none>           <none>  
  6. nginx-84f6f75c6-r2v4p   1/1     Running       0          13s    10.244.1.64   k8s-node01   <none>           <none>  
  7. nginx-84f6f75c6-v4knq   1/1     Running       0          13s    10.244.1.65   k8s-node01   <none>           <none>  
  8. nginx-84f6f75c6-wkt52   1/1     Running       0          116s   10.244.1.63   k8s-node01   <none>           <none>  
  9. nginx-84f6f75c6-xmkjs   1/1     Terminating   0          116s   10.244.3.17   k8s-node02   <none>           <none> 

在 node 節(jié)點(diǎn)轉(zhuǎn)為 NotReady 狀態(tài)后,Pod 立刻進(jìn)行了轉(zhuǎn)移。這是通過 在 yaml 清單文件中明確指定 容忍時間。還可以直接修改 apiserver 配置來修改默認(rèn)容忍時間。 

  1. vim /etc/kubernetes/manifests/kube-apiserver.yaml  
  2. ...  
  3. spec:  
  4.   containers:  
  5.   - command:  
  6.     - kube-apiserver  
  7.     - --advertise-address=192.168.1.11  
  8.     - --default-not-ready-toleration-seconds=1    ## 新增行  
  9.     - --default-unreachable-toleration-seconds=1  ## 新增行  
  10. ... 

修改保存后, kube-apiserver-k8s-masterpod 會自動重載最新配置。 

  1. $ kubectl get po nginx-84f6f75c6-wkt52 -o yaml  
  2. ...  
  3.   tolerations:  
  4.   - effect: NoExecute  
  5.     key: node.kubernetes.io/not-ready  
  6.     operator: Exists  
  7.     tolerationSeconds: 0  
  8.   - effect: NoExecute  
  9.     key: node.kubernetes.io/unreachable  
  10.     operator: Exists  
  11.     tolerationSeconds: 0  
  12. ... 

對于小型集群,可以直接設(shè)置全局變量。

注意:當(dāng) kubernetes 集群只有一個 node 節(jié)點(diǎn)時,無法做到 Pod 轉(zhuǎn)移,因?yàn)?Pod 已經(jīng)無路可退了。 

責(zé)任編輯:龐桂玉 來源: 奇妙的Linux世界
相關(guān)推薦

2020-05-21 08:58:34

Kubernetes操作系統(tǒng)運(yùn)維

2020-04-28 10:28:30

Kubernetes操作系統(tǒng)運(yùn)維

2023-09-21 11:28:28

Kubernetes云原生

2010-08-20 10:41:20

史玉柱

2016-01-13 10:10:29

應(yīng)用開發(fā)容器Kubernetes

2020-11-04 00:00:29

Kerberos協(xié)議身份

2020-01-10 17:45:06

Git共享文件開源

2019-01-18 09:32:57

2022-03-03 08:42:10

NodePortServiceKubernetes

2023-12-06 08:48:36

Kubernetes組件

2010-05-24 10:23:34

實(shí)現(xiàn)MySQL

2022-09-29 10:51:18

ShellLinux命令審計

2024-03-01 19:03:14

kubernetesLinuxk8s

2021-02-19 09:20:04

KubernetesSpark云帳戶

2010-05-25 13:47:53

MySQL 命令

2010-04-16 11:03:02

Oracle存儲過程

2021-09-09 17:59:14

AI

2011-08-30 14:29:31

數(shù)字簽名數(shù)字證書

2021-02-19 09:33:01

kubernetesJAVA服務(wù)

2010-05-21 16:09:39

GoogleCode和
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

九九热精品免费视频| 成人av网站免费观看| 中文成人综合网| 欧美成人精品一区二区三区| 久久精品美女| 天天天天天天天天操| 裤袜国产欧美精品一区| 国产成人在线看| 国产亚洲日本欧美韩国| 自拍日韩亚洲一区在线| 午夜精品无码一区二区三区| 日韩精品久久| 一本久久综合亚洲鲁鲁五月天| 国产精品三级在线| 国产精品扒开腿做爽爽| 黄色视屏在线免费观看| 国产精品毛片一区二区在线看| 色综合视频在线观看| 永久久久久久| 在线观看av大片| 激情五月色综合国产精品| 欧美日韩国产在线看| 97久草视频| 亚洲av鲁丝一区二区三区 | 超碰97人人做人人爱少妇| 亚洲熟妇av一区二区三区 | 亚洲精品456在线播放狼人| 国内自拍中文字幕| 国产视频在线免费观看| 羞羞答答成人影院www| 精品视频1区2区| 亚洲第一在线综合在线| 中文字幕视频二区| 婷婷久久综合| 中文字幕欧美专区| 久草福利视频在线| 精品欧美不卡一区二区在线观看| 久久久久在线| 中文字幕九色91在线| 黑丝av在线播放| 成人性生活视频| 亚洲成人一二三| 久久久99爱| 农村少妇久久久久久久| 午夜在线一区| 在线观看精品国产视频| 中文av字幕在线观看| 婷婷色在线资源| 99久久精品国产网站| 2023亚洲男人天堂| 人妻少妇无码精品视频区| 国产成人精品一区二区三区视频 | 久久99久久久久久久久久久| 日韩小视频在线观看| 黑人无套内谢中国美女| 欧美办公室脚交xxxx| 欧美激情一区三区| 97中文在线观看| aaaa一级片| 99综合视频| 在线观看视频99| 日韩一级av毛片| 成人精品久久| 亚洲国产精品va在线观看黑人| 成人在线观看黄| 超碰在线caoporen| 久久一区二区三区国产精品| 国产精品一区二区性色av| 久草网视频在线观看| 伊人青青综合网| 日韩高清人体午夜| 手机免费av片| 特黄毛片在线观看| 亚洲欧美一区二区久久| 精品国产aⅴ麻豆| 一二三区中文字幕| 国产一区二区三区免费| 国产98色在线| 久久久久97国产| 久久日文中文字幕乱码| 日韩精品视频免费| 国产女主播喷水高潮网红在线| 少妇一区二区视频| 亚洲第一免费播放区| 日本黄色片在线播放| 亚洲综合网站| 欧美日韩电影在线播放| 日本www在线播放| 久久免费电影| 亚洲视频免费在线观看| www国产免费| 欧美日产一区二区三区在线观看| a级大片在线观看| 欧美日韩精品一区二区视频| 精品盗摄一区二区三区| 欧美日韩理论片| 黄色成人在线观看网站| 黑人精品xxx一区| 免费看污污网站| 日韩免费福利视频| 欧美日韩国产综合新一区 | 久久久国产精品一区二区中文| 国产精品极品尤物在线观看 | 色综合久久久久久久| 亚洲福利精品视频| 久草在线综合| 制服丝袜亚洲色图| 超碰在线97免费| youjizzjizz亚洲| 日韩欧美资源站| 国产九九九视频| 国产日本亚洲| 欧美一区二区播放| 无套内谢丰满少妇中文字幕| 欧美调教在线| 日韩国产精品视频| 日韩三级在线观看视频| 伊人久久大香线蕉午夜av| 成人福利在线| 久久九九全国免费| 亚洲欧美日韩一区二区 | 国产成人福利av| 91精品综合久久久久久| 在线观看国产网站| 韩国精品一区二区三区| 久久久国产成人精品| 亚洲色图欧美色| 91日韩视频| 热久久免费视频精品| 亚洲 欧美 中文字幕| 久久婷婷麻豆| 国产精品丝袜高跟| 天堂√在线中文官网在线| 26uuu亚洲婷婷狠狠天堂| 日本午夜一区二区三区| 成a人片在线观看www视频| 亚洲成人午夜电影| 国产又粗又猛又爽又黄| 国产精品成人一区二区不卡| 国产成人精品av在线| 国产情侣免费视频| 国内精品伊人久久久久av影院| 97人人模人人爽人人少妇| 色影视在线观看| 亚洲精品精品亚洲| 日本免费a视频| 蜜桃av在线播放| 精品国精品国产尤物美女| 欧美成人三级伦在线观看| 国产激情在线| 国产日韩一区二区三区在线| 97国产精品视频| 探花视频在线观看| 奇米777欧美一区二区| 92福利视频午夜1000合集在线观看 | 在线观看你懂的视频| 欧美激情第8页| 欧美最近摘花xxxx摘花| 香蕉久久国产av一区二区| 久久久久久久综合日本| 国产白丝袜美女久久久久| h1515四虎成人| 色哟哟亚洲精品一区二区| 久久中文字幕无码| 丁香婷婷综合激情五月色| 日韩精品一区二区三区丰满| h视频在线免费观看| 91精品国产综合久久小美女| 国产免费无码一区二区视频| 成人在线综合网| 日韩免费视频播放| 精品一区二区三区的国产在线观看| 国产精品成人免费视频| 麻豆视频在线免费观看| 欧美日韩另类字幕中文| 实拍女处破www免费看| 日本一本在线观看| 福利91精品一区二区三区| 精品国产乱码一区二区三区四区| 在线观看的黄色| 伊人久久五月天| 国产三级按摩推拿按摩| 性做久久久久久免费观看欧美| 艹b视频在线观看| 国产乱人伦精品一区| 欧美一区三区三区高中清蜜桃| 国内精品一区视频| 6080yy午夜一二三区久久| 精品无码一区二区三区电影桃花 | 麻豆久久精品| 中文字幕免费在线不卡| 国产成人一二片| 国产精品久久网| 成人超碰在线| 欧美一区二区三区免费在线看| 国产精品成人久久| 国产综合色产在线精品| 青青草精品视频在线| 136福利精品导航| 日韩av免费在线看| 亚洲资源一区| 欧美日韩久久久| 亚洲一区二区91| 国产精品成人免费精品自在线观看| 毛片av免费在线观看| 午夜久久一区| 五月天国产一区| 成人a在线观看高清电影| 精品少妇一区二区30p| 91亚洲欧美激情| 欧美激情一区三区| 日本天堂在线播放| 狠狠入ady亚洲精品| 日日夜夜精品网站| 激情av综合| 亚洲a在线观看| 肉色欧美久久久久久久免费看| 欧美国产精品人人做人人爱| 亚洲av无码国产精品永久一区| 亚洲精品日产精品乱码不卡| av在线免费观看不卡| 天堂午夜影视日韩欧美一区二区| 日韩国产成人无码av毛片| 久久国产成人精品| 欧美专区一二三| 精品一区二区男人吃奶| 91在线短视频| 精品视频成人| 久久久久中文字幕2018| 亚洲欧美日韩综合在线| 日韩免费高清av| 亚洲欧美精品一区二区三区| 亚洲精品成人天堂一二三| 国精品人伦一区二区三区蜜桃| 国产一区美女在线| 视色视频在线观看| 日韩精品一二区| 大地资源第二页在线观看高清版| 国产精选久久| 国产免费一区二区三区在线观看| 欧美激情喷水| 日本精品性网站在线观看| 免费看男女www网站入口在线| 欧美丰满少妇xxxxx| 性xxxxfjsxxxxx欧美| 精品中文字幕在线2019| 中文字幕在线三区| 久久97精品久久久久久久不卡| 超碰在线观看免费| 欧美高清第一页| 波多野结衣中文在线| 欧美激情中文网| 国产一区电影| 国产亚洲精品va在线观看| 免费观看成年在线视频网站| 91精品久久久久久久久99蜜臂| 亚洲视频中文字幕在线观看| 欧美日韩精品高清| 亚洲天堂视频在线| 欧美一区二区在线免费播放| av天堂一区二区三区| 日韩精品一区国产麻豆| 欧美视频一二区| 日韩久久精品电影| 国产伦精品一区二区三区视频痴汉 | 中文字幕在线官网| 国产成人极品视频| 97精品资源在线观看| 91精品国产91| 麻豆传媒视频在线观看免费| 久久久国产视频91| 女人黄色免费在线观看| 69久久夜色精品国产7777| 羞羞影院欧美| 成人在线小视频| 日韩电影大全网站| 国产一区在线播放| 丝袜美腿一区| 国产在线视频不卡| julia中文字幕一区二区99在线| 国产欧美一区二区视频| 成人免费观看49www在线观看| 亚洲自拍偷拍福利| 色橹橹欧美在线观看视频高清| 亚洲一区中文字幕| 久久porn| 一区二区三区视频| 九九久久成人| japanese在线视频| 国产精品美女久久久浪潮软件| 香蕉视频禁止18| 成人美女在线观看| 林心如三级全黄裸体| 国产三级久久久| 中文在线永久免费观看| 国产精品视频一区二区三区不卡| 国产黄色片在线免费观看| 一本到高清视频免费精品| av加勒比在线| 亚洲图中文字幕| 成人在线高清免费| 国产在线拍偷自揄拍精品| 亚洲人成网www| 蜜桃视频日韩| 亚州综合一区| www.黄色网址.com| 欧美一区二区三区久久精品茉莉花 | 91精选在线观看| 国产精品秘入口| 亚洲精品中文字幕有码专区| 黄色网在线播放| 久久av在线看| 九九热线视频只有这里最精品| 欧美一级大片视频| 精品国产鲁一鲁****| 色姑娘综合av| 日韩香蕉视频| 波多野结衣三级视频| 99亚偷拍自图区亚洲| 无套内谢大学处破女www小说| 最新成人av在线| 精品欧美一区二区久久久久| 欧洲av一区二区嗯嗯嗯啊| 国产精品51麻豆cm传媒 | 亚洲国产国产亚洲一二三| 777777av| 国产高清视频一区| 99热这里只有精品4| 一区二区三区欧美亚洲| 亚洲视频在线观看免费视频| 国产亚洲综合久久| 一区二区乱码| 久久影院理伦片| 国产日韩精品视频一区二区三区| 国产51自产区| 亚洲国产一二三| 波多野结衣一二区| 成人国产在线视频| 日韩二区三区| 亚洲精品在线看| 国产乱码在线| 国产精品xxxx| 亚欧日韩另类中文欧美| 草b视频在线观看| 久久亚洲国产精品一区二区| 日b视频在线观看| 五月天激情综合| 中文字幕制服诱惑| 亚洲一二三在线| 久久久久黄色| 自拍另类欧美| 国产精品亚洲一区二区三区妖精| 妖精视频一区二区| 中文字幕第一区二区| 亚洲综合图片网| 久久国产精品色| 欧洲一区二区视频| 欧美久久精品| 久久成人免费观看| 久久久久久免费毛片精品| 波多野结衣黄色| 日韩最新在线视频| 精品国产乱码一区二区三区 | 阿v免费在线观看| 国产在线播放不卡| 欧美激情1区| 日本道中文字幕| 色狠狠一区二区| 99在线观看免费| 久久久噜久噜久久综合| 国产成人3p视频免费观看| 99re精彩视频| 一区二区三区加勒比av| 中文字幕 欧美激情| 久久五月情影视| 欧美激情99| 日本人视频jizz页码69| 亚洲日本护士毛茸茸| 男人天堂手机在线观看| 奇米4444一区二区三区| 五月开心六月丁香综合色啪| 中文字幕人妻一区| 欧美午夜精彩| 国产91成人video| 国产女人水真多18毛片18精品| 午夜激情一区| 免费在线观看成年人视频| 欧美老肥妇做.爰bbww| 亚洲国产综合一区| 97精品伊人久久久大香线蕉 | 亚洲精品二区| 国产福利精品一区二区| 综合网在线观看| 欧美成人vr18sexvr| 蜜桃视频在线观看播放| 亚洲高清视频一区二区| 成人一区二区视频| 中文字幕a级片| 国模精品视频一区二区| 亚洲另类在线观看|