k8s里的taints 和 tolerations
Node taints 和 tolerations 是 Kubernetes 中用于控制和影響 pod 調(diào)度到節(jié)點(diǎn)上的機(jī)制。它們幫助確保某些 pod 僅調(diào)度到特定節(jié)點(diǎn),或者防止 pod 調(diào)度到不適合它們的節(jié)點(diǎn)。
### **Node Taints**
**taint** 是應(yīng)用于節(jié)點(diǎn)的一種屬性,用于標(biāo)記節(jié)點(diǎn)具有特殊條件或限制。taints 允許節(jié)點(diǎn)排斥那些沒有顯式容忍該 taint 的 pod。這在需要為特定工作負(fù)載保留某些節(jié)點(diǎn)或防止某些 pod 調(diào)度到具有特定特征的節(jié)點(diǎn)時(shí)非常有用。
每個(gè) taint 包含三個(gè)組件:
1. **Key**: 標(biāo)識 taint 的字符串。
2. **Value**: 與 key 關(guān)聯(lián)的可選字符串。
3. **Effect**: 指定 taint 的行為,可以是以下之一:
- `NoSchedule`: 不容忍該 taint 的 pod 將不會調(diào)度到該節(jié)點(diǎn)。
- `PreferNoSchedule`: Kubernetes 會嘗試避免調(diào)度不容忍該 taint 的 pod,但不保證。
- `NoExecute`: 不容忍該 taint 的 pod 如果已經(jīng)運(yùn)行,將會從節(jié)點(diǎn)上驅(qū)逐,同時(shí)新的 pod 也不會調(diào)度到該節(jié)點(diǎn)。
向節(jié)點(diǎn)添加 taint 的示例:
```bash
kubectl taint nodes <node-name> key=value:NoSchedule
```
### **Tolerations**
**toleration** 是應(yīng)用于 pod 的一種屬性,允許 pod "容忍" 節(jié)點(diǎn)的 taint。如果 pod 具有與節(jié)點(diǎn) taint 匹配的 toleration,則該 pod 可以調(diào)度到該節(jié)點(diǎn),即使節(jié)點(diǎn)有 taint。
每個(gè) toleration 包含以下組件:
1. **Key**: pod 容忍的 taint 的 key。
2. **Value**: pod 容忍的 taint 的 value。
3. **Effect**: pod 容忍的 taint 的 effect (`NoSchedule`, `PreferNoSchedule`, 或 `NoExecute`)。
4. **Operator**: 指定 key 和 value 之間的關(guān)系,可以是:
- `Equal`: 如果 key 和 value 相等,則 toleration 匹配 taint。
- `Exists`: 如果 key 存在,則 toleration 匹配 taint,無論 value 是什么。
向 pod 添加 toleration 的示例:
```yaml
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"
```
### **Taints 和 Tolerations 如何協(xié)同工作**
- Taints 應(yīng)用于節(jié)點(diǎn),用于指示某些 pod 不應(yīng)調(diào)度到該節(jié)點(diǎn),除非它們顯式容忍該 taint。
- Tolerations 應(yīng)用于 pod,用于指示它們可以調(diào)度到具有匹配 taint 的節(jié)點(diǎn)。
如果節(jié)點(diǎn)有 taint,而 pod 沒有匹配的 toleration,則該 pod 將不會調(diào)度到該節(jié)點(diǎn)。
### **使用場景**
1. **專用節(jié)點(diǎn)**: 通過向節(jié)點(diǎn)應(yīng)用 taint 并向相應(yīng)的 pod 添加 toleration,為特定工作負(fù)載保留節(jié)點(diǎn)。
2. **節(jié)點(diǎn)維護(hù)**: 通過應(yīng)用 taint 暫時(shí)阻止 pod 調(diào)度到節(jié)點(diǎn)。
3. **特殊硬件**: 確保需要特定硬件(例如 GPU)的 pod 僅調(diào)度到具有該硬件的節(jié)點(diǎn)。
### **檢查 Taints 和 Tolerations**
為了確保 taints 和 tolerations 不會阻止 pod 調(diào)度:
1. **檢查節(jié)點(diǎn)的 taints**:
```bash
kubectl describe nodes <node-name>
```
在節(jié)點(diǎn)描述中查找 `Taints` 部分。
2. **檢查 pod 的 tolerations**:
```bash
kubectl describe pod <pod-name>
```
在 pod 描述中查找 `Tolerations` 部分。
3. 確保節(jié)點(diǎn)上的 taints 與需要調(diào)度到這些節(jié)點(diǎn)的 pod 的 tolerations 匹配。如果不匹配,pod 可能無法調(diào)度。
通過正確配置 taints 和 tolerations,可以控制 pod 的放置,并確保 Kubernetes 集群中的資源高效利用。


浙公網(wǎng)安備 33010602011771號