十、Kubernetes调度-污点和容忍Taint&Toleration

NodeAffinity节点亲和性,是在Pod上定义的一种属性,使得Pod能够被调度到某些Node上运行(优先选择或强制要求)。Taint则正好相反,它让Node拒绝Pod的运行。简单地说,被标记为Taint的节点就是存在问题的节点,比如磁盘要满、资源不足、存在安全隐患要进行升级维护,希望新的Pod不会被调度过来,但被标记为Taint的节点并非故障节点,仍是有效的工作节点,所以仍需将某些Pod调度到这些节点上时,可以通过使用Toleration属性来实现。

在默认情况下,在Node上设置一个或多个Taint之后,除非Pod明确声明能够容忍这些污点,否则无法在这些Node上运行。


一、容忍和污点Taint和Toleration

官 方 文 档
https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/

设计理念
Taint(锁)污点在一类服务器上打上污点, 作用在节点上,让不能容忍这个污点的Pod不能部署在打了污点的服务器上。

Toleration(钥匙)容忍是让Pod容忍节点上配置的污点, 作用在pod上,可以让一些需要特殊配置的Pod能够调用到具有污点和特殊配置的节点上。

生产环境并非随便调度
在这里插入图片描述

部署容忍和污点Taint和Toleration
在这里插入图片描述

二、Taint配置解析

创建一个污点(一个节点可以有多个污点)如果node节点上有多个Taint,每个Taint都需要容忍才能部署上去。

示例:

kubectl taint nodes NODE_NAME TAINT_KEY=TAINT_VALUE:EFFECT

# 举例:
# kubectl taint nodes k8s-node01 ssd=true:NoSchedule

[root@k8s-master01 taint]#kubectl taint nodes k8s-node01 ssd=true:NoSchedule
node/k8s-node01 tainted

该Taint的键为ssd,值为true,Taint的效果是NoSchedule。这意味着除非Pod明确声明可以容忍
这个Taint,否则不会被调度到node1上。


重要解释:

  • NoSchedule:禁止调度到该节点,已经在该节点上的Pod不受影响。

  • NoExecute:禁止调度到该节点,如果不符合这个污点,会立马被驱逐(或在一段时间后)。

  • PreferNoSchedule:尽量避免将Pod调度到指定的节点上,如果没有更合适的节点,可以部署到该节点。

  • tolerationSeconds:它指的是Pod能够容忍某个节点污点的时间长度。


三、Toleration配置解析

作用在pod上

方式一:完全匹配,key和value、effect都和taint一样

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

方式二:不完全匹配,只需要key和effect就可以,不需要匹配value。比如GPU,可能有很多种类。

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

方式三:大范围匹配,只需匹配key,(不推荐key为内置Taint

- key: "taintKey"
  operator: "Exists"

方式四:匹配所有(不推荐)

tolerations:
- operator: "Exists"

停留时间配置:

如果节点加的NoExecute,tolerationSeconds配置容忍多久会赶走,可以实现快速迁移。


                
### 定义 - **污点(Taint)**:是应用于节点上的一种属性,每个节点可以有一个或多个污点。当节点设置了污点后,那些不能容忍这些污点的 Pod 就不会被该节点接受,即无法调度到该节点上 [^1]。 - **容忍度(Toleration)**:是 Pod 的一种属性,它允许 Pod 被调度到带有特定污点的节点上。通过设置容忍度,Pod 可以忽略节点上的某些污点,从而能够被调度到这些节点 [^1][^2]。 ### 使用场景示例 - **隔离控制平面节点**:在 Kubernetes 集群中,控制平面节点(如 master 节点)通常运行着重要的系统组件,不希望普通的 Pod 被调度到这些节点上。可以给控制平面节点添加污点,例如: ```bash kubectl taint nodes k8s-master node-role.kubernetes.io/master:PreferNoSchedule ``` 这里的 `node-role.kubernetes.io/master:PreferNoSchedule` 是一个污点,表示尽量不将 Pod 调度到该节点。普通的 Pod 没有对该污点的容忍度,就不会被调度到 `k8s-master` 节点上。如果有特殊的 Pod 需要调度到该节点,就需要为其添加相应的容忍度 [^3]。 - **为 Jenkins Agent 添加调度灵活性**:在 Kubernetes 环境中使用 Jenkins 时,为 Jenkins Agent 添加污点容忍度,允许其被调度到带有特定污点的节点上。例如,有一些节点专门为 Jenkins Agent 预留,并且添加了污点 `jenkins-agent=allowed:NoSchedule`,那么可以为 Jenkins Agent Pod 添加容忍度,示例配置如下: ```yaml apiVersion: v1 kind: Pod metadata: name: jenkins-agent-pod spec: containers: - name: jenkins-agent image: jenkins/agent tolerations: - key: "jenkins-agent" operator: "Equal" value: "allowed" effect: "NoSchedule" ``` 这样,Jenkins Agent Pod 就可以被调度到带有 `jenkins-agent=allowed:NoSchedule` 污点的节点上 [^2]。 - **故障处理**:当节点出现故障或者进行维护时,可以给节点添加 `NoExecute` 类型的污点。例如: ```bash kubectl taint nodes node1 check=check:NoExecute ``` 添加该污点后,没有相应容忍度的 Pod 会被立即从该节点驱逐。如果之后故障修复或者维护完成,可以取消污点: ```bash kubectl taint node node1 check=check:NoExecute- ``` 这里的 `-` 表示移除该污点 [^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cyan_Jiang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值