Kubernetes中的节点可以带有内置污点(taint),这些污点是在节点创建时自动设置的,并且不能被删除或修改。内置污点可以用来标记那些不希望运行Pod的节点,或者只允许某些Pod在该节点上运行。
Kubernetes内置污点的介绍
Kubernetes中有三个内置污点:
- node.kubernetes.io/not-ready:表示节点当前不可用,可能由于网络故障、硬件故障等原因导致;
- node.kubernetes.io/unreachable:表示节点当前无法访问,可能由于网络分区、节点故障等原因导致;
- node.kubernetes.io/out-of-disk:表示节点上的磁盘空间已满,无法再运行新的Pod。
这些内置污点是集群级别的,即对所有节点都有效。当节点带有这些污点时,调度器会自动将不可调度的Pod从这些节点上删除,直到节点变得可用或者新的节点被加入集群。由于这些污点是内置的,所以它们不能被删除或修改。
使用内置污点的示例
我们来看几个使用内置污点的示例,以便更好地理解它们的用途。
标记不可用节点
我们可以使用node.kubernetes.io/not-ready污点来标记一个不可用的节点,以便避免将新的Pod调度到这个节点上。
首先,我们需要找到要标记的节点的名称。可以使用kubectl get nodes命令来查看节点列表:
代码语言:javascript复制$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
node1 Ready <none> 20h v1.21.0
node2 Ready <none> 20h v1.21.0
node3 Ready <none> 20h v1.21.0
在这个示例中,我们将标记node3节点为不可用。可以使用kubectl taint nodes命令来添加污点:
代码语言:javascript复制$ kubectl taint nodes node3 node.kubernetes.io/not-ready=:NoSchedule
这个命令会在node3节点上添加一个node.kubernetes.io/not-ready的污点,并将影响效果(effect)设置为NoSchedule,表示新的Pod将不能调度到这个节点上。
我们可以使用kubectl describe node命令来查看节点的详细信息,以确认污点是否被正确添加:
代码语言:javascript复制$ kubectl describe node node3
...
Taints: node.kubernetes.io/not-ready=:NoSchedule
现在,如果我们尝试在集群中创建新的Pod,调度器将不会将它们调度到node3节点上。当我们修复了这个节点的问题后,可以使用kubectl taint命令来删除这个污点:
代码语言:javascript复制$ kubectl taint nodes node3 node.kubernetes.io/not-ready-