Kubernetes對Pod調度指定Node以及Node的Taint 和 Toleration


由於博客園不支持markdown,推薦以下url閱讀:

原創url:https://blog.csdn.net/weixin_42495873/article/details/103364868

#### 1.指定pod到指定的node上
```shell
#1.1查看節點的lebel
kubectl get nodes --show-labels

#1.2獲取到該節點的label信息
ip-10-100-2-80 Ready <none> 60d v1.14.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=ip-10-100-2-80,kubernetes.io/os=linux

#1.3也可通過自己設置label
kubectl label nodes <node-name> <label-key>=<label-value>

#1.4在配置文件spec下面添加
spec:
nodeSelector:
kubernetes.io/hostname: ip-10-100-2-80

```

#### 2.Taint 和 Toleration
2.1. 概念
- nodeSelector可以通過打標簽的形式讓Pod被調度到指定的Node上,Taint則相反,它使節點能夠排斥一類特定的Pod,除非Pod被指定了toleration的標簽。(taint即污點,Node被打上污點;只有容忍[toleration]這些污點的Pod才可能被調度到該Node)。

2.2 effect的類型

NoSchedule:只有擁有和這個 taint 相匹配的 toleration 的 pod 才能夠被分配到這個節點。

PreferNoSchedule:系統會盡量避免將 pod 調度到存在其不能容忍 taint 的節點上,但這不是強制的。

NoExecute :任何不能忍受這個 taint 的 pod 都會馬上被驅逐,任何可以忍受這個 taint 的 pod 都不會被驅逐。Pod可指定屬性 tolerationSeconds 的值,表示pod 還能繼續在節點上運行的時間。
```shell
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoExecute"
tolerationSeconds: 3600
```

2.3 kubectl taint
```shell
# 給節點增加一個taint(污點),它的key是<key>,value是<value>,effect是NoSchedule。
kubectl taint nodes <node_name> <key>=<value>:NoSchedule

#刪除節點上的taint。
kubectl taint nodes node1 key:NoSchedule-

```
2.4 只有擁有和這個taint相匹配的toleration的pod才能夠被分配到 node_name 這個節點。
```shell
例如,在 PodSpec 中定義 pod 的 toleration:
#operator:Equal 會比較key和value
#operator:Exists 只要含有key就會容忍該污點

tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"

tolerations:
- key: "key"
operator: "Exists"
effect: "NoSchedule"

#容忍所有含污點的node
tolerations:
- operator: "Exists"

#容忍所有key相同的,忽視effect
tolerations:
- key: "key"
operator: "Exists"
```
2.3. 使用場景

2.3.1. 專用節點
```shell
kubectl taint nodes <nodename> dedicated=<groupName>:NoSchedule
```
先給Node添加taint,然后給Pod添加相對應的 toleration,則該Pod可調度到taint的Node,也可調度到其他節點。

如果想讓Pod只調度某些節點且某些節點只接受對應的Pod,則需要在Node上添加Label(例如:dedicated=groupName),同時給Pod的nodeSelector添加對應的Label。

2.3.2. 特殊硬件節點

如果某些節點配置了特殊硬件(例如CPU),希望不使用這些特殊硬件的Pod不被調度該Node,以便保留必要資源。即可給Node設置taint和label,同時給Pod設置toleration和label來使得這些Node專門被指定Pod使用。

# kubectl taint
```shell
kubectl taint nodes nodename special=true:NoSchedule
# 或者
kubectl taint nodes nodename special=true:PreferNoSchedule
```

2.3.3. 基於taint驅逐

effect 值 NoExecute ,它會影響已經在節點上運行的 pod,即根據策略對Pod進行驅逐。

如果 pod 不能忍受effect 值為 NoExecute 的 taint,那么 pod 將馬上被驅逐
如果 pod 能夠忍受effect 值為 NoExecute 的 taint,但是在 toleration 定義中沒有指定 tolerationSeconds,則 pod 還會一直在這個節點上運行。
如果 pod 能夠忍受effect 值為 NoExecute 的 taint,而且指定了 tolerationSeconds,則 pod 還能在這個節點上繼續運行這個指定的時間長度。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM