Kubernetes 污点 Taint 和容忍 Toleration

本文介绍了Kubernetes中节点的污点与Pod的容忍机制,包括如何设置与删除污点,Pod如何设置容忍来调度到特定节点,以及容忍时间的概念。同时探讨了污点的不同效果对节点上Pod的影响。

参考地址:

系统环境:

  • kubernetes 版本:1.16.6

一、介绍

       在 Kubernetes 中,节点亲和性 NodeAffinity 是 Pod 上定义的一种属性,能够使 Pod 按我们的要求调度到某个节点上,而 Taints(污点) 则恰恰相反,它是 Node 上的一个属性,可以让 Pod 不能调度到带污点的节点上,甚至会对带污点节点上已有的 Pod 进行驱逐。当然,对应的 Kubernetes 可以给 Pod 设置 Tolerations(容忍) 属性来让 Pod 能够容忍节点上设置的污点,这样在调度时就会忽略节点上设置的污点,将 Pod 调度到该节点。一般时候 Taints 通常与 Tolerations 配合使用。

 

二、污点 taints

1、查看污点

污点是设置在 Node 节点上,所以我们可以通过查看节点信息来查找该节点是否设置污点以及对污点的信息,首先使用 kubectl get node 命令查看节点列表:

$ kubectl get node

NAME            STATUS   ROLES    AGE    VERSION
k8s-master      Ready    master   102d   v1.16.6
k8s-node-2-12   Ready    <none>   102d   v1.16.6
k8s-node-2-13   Ready    <none>   102d   v1.16.6

污点信息可以通过 kubectl describe nodes {Node名称} 命令,查看输出节点描述信息一栏中 Taints 标题后面的内容,即是污点的信息:

$ kubectl describe nodes k8s-master

...
CreationTimestamp:  Sat, 23 Nov 2019 00:52:45 +0800
Taints:             node-role.kubernetes.io/master:PreferNoSchedule
Unschedulable:      false
...

污点内容一般组成为 keyvalue 及一个 effect 三个元素,表现为:

<key>=<value>:<effect>

上面 value 可以设置为空,那么组成形式为 :

由上可以点到 master 节点的污点内容为:

node-role.kubernetes.io/master:PreferNoSchedule
  • key:node-role.kubernetes.io/master<
### 定义 - **污点(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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值