精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

欧美aaaaa级| 青春草免费在线视频| 麻豆91精品| 中文字幕亚洲专区| 成年人看片网站| 综合日韩av| 1000精品久久久久久久久| 国产精品久久久久久久久久久久午夜片 | 亚洲成人av免费观看| 性欧美video高清bbw| 懂色av一区二区夜夜嗨| 国产97在线|亚洲| 国产成人自拍网站| 自拍亚洲一区| 日韩欧美不卡在线观看视频| 免费在线激情视频| 中文字幕中文字幕在线十八区| 99久久国产综合色|国产精品| 国产精品一香蕉国产线看观看| 精品一级少妇久久久久久久| 久久视频在线| 精品网站999www| 中文字幕在线播放一区二区| 日本欧美韩国| 欧美日韩国产丝袜另类| 中文字幕在线乱| 在线激情免费视频| 91影院在线观看| 91天堂在线视频| 波多野结衣电车痴汉| 亚洲精品专区| 欧美韩国理论所午夜片917电影| 国产综合精品在线| 婷婷综合一区| 亚洲成人久久一区| 黑人巨大猛交丰满少妇| 国语自产精品视频在线看抢先版结局| 日韩欧美在线播放| 黄色大片中文字幕| 宅男在线观看免费高清网站| 国产精品家庭影院| 日韩videos| 九色在线视频蝌蚪| xf在线a精品一区二区视频网站| 成人av男人的天堂| 精品国自产拍在线观看| 韩国一区二区三区| 国产日韩av高清| 自拍偷拍福利视频| 日本不卡在线视频| 国产精品福利在线观看网址| 久久久久久91亚洲精品中文字幕| 海角社区69精品视频| 亚洲视频精品| 婷婷国产精品| 精品久久久久久久中文字幕| 91视频 - 88av| gogo在线高清视频| 亚洲免费观看高清完整版在线| 中文字幕日韩一区二区三区不卡| av片在线看| 综合精品久久久| 亚洲小说欧美另类激情| 国产激情在线| 一区二区三区高清| www.好吊操| 天堂电影一区| 在线观看免费一区| 中文字幕丰满乱码| 国产一区二区三区免费在线| 日韩视频国产视频| 精品1卡二卡三卡四卡老狼| 精品人人人人| 亚洲欧美在线看| 欧美成人短视频| 在线成人激情| 午夜精品美女自拍福到在线| 日韩精品一区二区亚洲av| 视频一区欧美日韩| 国产在线观看不卡| 亚洲精品久久久久久久久久久久久久| 成人av免费在线播放| 欧美人与性禽动交精品| 1769在线观看| 亚洲伊人伊色伊影伊综合网| 婷婷无套内射影院| 日韩免费va| 日韩欧美一区在线| 国产精品无码一区二区三区免费| 清纯唯美综合亚洲| 欧美激情欧美激情在线五月| 日本一区二区三区精品| 久久99精品久久久久久| 成人动漫在线视频| 精品电影在线| 亚洲最快最全在线视频| 116极品美女午夜一级| 日本成人一区二区| 日韩精品在线免费观看| 在线免费看av网站| 日韩天堂av| 91亚洲精华国产精华| 日韩一卡二卡在线| 18成人在线观看| 国产女女做受ⅹxx高潮| 日本一区二区三区播放| 亚洲午夜久久久久久久| 久草视频精品在线| 另类小说综合欧美亚洲| 精品伊人久久大线蕉色首页| 久久99精品久久久久久野外| 欧美性猛交xxxx黑人| 欧美视频国产视频| 国产日产精品一区二区三区四区的观看方式| 毛片无码国产| 久久久免费高清视频| 午夜激情视频在线观看| 国产日韩欧美一区| 精品美女一区二区| 日韩精品电影一区二区三区| 激情综合在线| 亚洲自拍小视频| www免费网站在线观看| 香蕉久久一区二区不卡无毒影院 | 成人福利网站| 欧美最新大片在线看| 久久久久成人精品无码中文字幕| 91精品一区国产高清在线gif| 国产成人精品在线视频| 日韩在线一区二区三区四区| 亚洲欧美色综合| www亚洲成人| 国产精品自拍区| 97碰在线观看| 老司机午夜福利视频| 自拍偷自拍亚洲精品播放| 色综合手机在线| 国产精品一区二区99| 久久精品久久久精品美女| 国产aⅴ夜夜欢一区二区三区 | 亚洲高清免费观看| av污在线观看| 日韩精品电影| 国产伦精品免费视频| 福利在线播放| 一本大道av伊人久久综合| 97伦伦午夜电影理伦片| 奶水喷射视频一区| 乱一区二区三区在线播放| 美女av在线免费看| 亚洲精品视频久久| 91精品国产高清一区二区三密臀| 91婷婷韩国欧美一区二区| 国产中文字幕免费观看| 日韩欧美中文字幕电影| 91成人天堂久久成人| 日本免费一区二区三区最新| 色94色欧美sute亚洲线路一ni| 无码人妻精品一区二区三应用大全 | 国产精品视区| 99热国产免费| 日本资源在线| 日韩一区二区在线看| 黄色一级片中国| 国产精品一二三在| 中文字幕日韩精品无码内射| 第四色在线一区二区| 国内精品久久久久久| 天天操天天干天天干| 91黄视频在线观看| 日本不卡一区视频| 国产美女在线精品| 无码粉嫩虎白一线天在线观看 | 免费一级欧美在线观看视频| 精品国产欧美一区二区五十路| 国产av无码专区亚洲av| 亚洲高清免费观看高清完整版在线观看| 国产精品麻豆入口| 日韩av电影天堂| 欧美a级黄色大片| 欧美wwwsss9999| 国产精品一区电影| 密臀av在线| 亚洲最新av在线| www日本高清视频| 日韩欧美成人网| 黑人巨大精品一区二区在线| 国产成人av电影| 激情五月亚洲色图| 欧美精品色网| 色婷婷精品国产一区二区三区| 韩国三级成人在线| 日本成人免费在线| 日韩另类在线| 亚洲视频一区二区三区| www日本视频| 欧美在线free| 国产一卡二卡在线| 国产精品免费aⅴ片在线观看| 在线观看一区二区三区四区| 奇米综合一区二区三区精品视频| 成人在线免费观看视频网站| 精品国产乱码久久久久久果冻传媒| 99热国产免费| 日韩精品免费观看视频| 福利在线一区| 国产成人在线中文字幕| 欧美日韩黄色| 韩日一区二区三区| 91精品福利在线一区二区三区| 少妇影院在线观看| 国产亚洲欧美激情| 成年女人免费视频| 老司机午夜精品| 日韩久久一级片| 欧美视频在线观看| 一区二区日本| 激情综合网站| 久久日韩精品| 电影一区二区在线观看| 亚洲aa在线观看| 99久久er| 国产激情999| 美女的胸无遮挡在线观看 | 亚洲va国产va天堂va久久| 欧美电影免费观看网站| 97人人做人人爱| 欧美黑人猛交| 久久99国产综合精品女同| 91精品专区| 一本一本久久a久久精品综合小说| 污污的视频网站在线观看| 欧美成人video| 99热这里只有精品5| 欧美日本免费一区二区三区| 国产精品第六页| 色综合天天天天做夜夜夜夜做| 福利一区二区三区四区| 一区二区三区不卡视频| 亚洲xxxx3d动漫| 狂野欧美xxxx韩国少妇| 91在线观看地址| 91看片破解版| 另类小说综合欧美亚洲| 久久久久国产一区| 日韩在线a电影| 日本在线观看a| 男人的天堂成人在线| 成人在线看视频| 三级欧美韩日大片在线看| 1024av视频| 久久久人人人| 男女无套免费视频网站动漫| 日韩二区在线观看| 杨幂毛片午夜性生毛片| 精品一区二区三区在线观看| 成年网站免费在线观看| 国产一区二区三区四区五区入口| 成人免费黄色av| 成人免费视频一区二区| 偷偷色噜狠狠狠狠的777米奇| av影院午夜一区| 91精品人妻一区二区| 国产日产亚洲精品系列| 91麻豆免费视频网站| 一区二区三区.www| 草久久免费视频| 欧美亚洲愉拍一区二区| 国产一区二区三区在线观看 | 久久久免费电影| 色吧亚洲日本| 国产精品美女主播| 国产精品视频一区视频二区 | 色婷婷av一区二区三区之e本道| 亚洲精品www久久久久久广东| 毛片免费在线播放| 自拍偷拍亚洲一区| 欧美aaaxxxx做受视频| 日本精品久久久| 欧美亚洲二区| 国产一区在线免费| 波多野结衣的一区二区三区| 成人手机在线播放| 国产一区成人| 日本美女视频一区| 99精品国产99久久久久久白柏| 久久国产柳州莫菁门| 亚洲乱码国产乱码精品精的特点| 天天插天天操天天干| 欧美性欧美巨大黑白大战| 国产欧美日韩成人| 亚洲精品视频二区| 91高清在线观看视频| 欧美与欧洲交xxxx免费观看| 四虎地址8848精品| 久久精品中文字幕一区二区三区 | 国产无一区二区| 国产这里有精品| 91国产免费观看| 亚洲精品久久久狠狠狠爱| 中文字幕在线观看日韩| 日韩激情电影免费看| 91精品久久久久久久久久入口| 美女午夜精品| 成人手机在线播放| 麻豆国产精品官网| 久久中文字幕人妻| 亚洲综合丝袜美腿| 91中文字幕在线视频| 亚洲美女视频网站| 男女在线观看视频| 成人黄色在线观看| 国产亚洲一卡2卡3卡4卡新区 | 国产奶水涨喷在线播放| 欧美日韩你懂的| 欧美美女色图| 国内精品久久久久影院优| 99久热在线精品视频观看| 欧洲成人一区二区| 免费在线观看成人av| 欧美双性人妖o0| 一区二区三区国产| 精品国产亚洲一区二区麻豆| 色阁综合伊人av| 免费在线观看一区| 欧美激情专区| 国产日韩欧美在线播放不卡| 五月天激情小说| 午夜日韩在线电影| 亚洲第一大网站| 欧美乱妇高清无乱码| 国产成人视屏| 中文字幕一区二区三区四区五区人| 日本不卡高清视频| 欧美黄色激情视频| 欧美影片第一页| 国产资源在线观看| 国产精品27p| gogogo高清在线观看一区二区| 欧美一级片中文字幕| 久久久欧美精品sm网站| 手机看片久久久| 亚洲美女av在线播放| 国产免费不卡| 日韩高清av| 蜜桃av一区二区| 欧美乱大交做爰xxxⅹ小说| 欧美中文字幕亚洲一区二区va在线 | 动漫美女无遮挡免费| 亚洲欧美一区二区不卡| 国产一区二区三区中文字幕 | 亚洲精品mv| 欧美aaaaa喷水| 奇米四色…亚洲| 91免费视频网站| 国产成人无码精品| 亚洲色诱最新| 久久久久久久久久久av| 日本熟女一区二区| 日韩欧美一卡二卡| 污视频在线看网站| 国产66精品久久久久999小说| 欧美三级网页| 午夜久久久久久久| 一本一道波多野结衣一区二区| 成人在线播放视频| 国产日韩av在线播放| 综合激情视频| 日本一级片在线播放| 91黄色免费网站| 超碰公开在线| 精品午夜一区二区三区| 日韩精品免费专区| 顶级黑人搡bbw搡bbbb搡| 日韩欧美国产综合一区| 欧美xxxhd| 亚洲成人自拍视频| 国产美女在线观看一区| 97超碰人人干| 在线国产精品视频| 日韩08精品| 国产在线观看福利| 亚洲视频一二三| 少妇精品高潮欲妇又嫩中文字幕| 国产成人在线一区| 一本精品一区二区三区| 黄色性生活一级片| 在线不卡免费av| 日本在线影院| 日日噜噜噜夜夜爽爽| 97国产精品videossex| 中文字幕一区2区3区| 久久久久久久999| 久久成人综合| 捆绑裸体绳奴bdsm亚洲| 欧美日本韩国一区| 性欧美18xxxhd| 操bbb操bbb| 日本一区二区视频在线观看| 亚洲精品久久久久久久久久久久久久|