什么是污点和容忍
ref="/tag/2020/" style="color:#643D3D;font-weight:bold;">Kubernetes中的污点(Taint)和容忍(Toleration)机制,是用来控制Pod调度行为的重要工具。简单来说,污点是加在节点上的“驱逐标记”,表示这个节点不欢迎某些Pod;而容忍则是Pod身上的“通行证”,允许它无视某些污点,正常调度到对应节点上。
比如你有几台专门跑数据库的机器,不想让其他普通服务随便挤上去,就可以给这些节点打上污点。只有明确声明了能“容忍”这个污点的Pod,才能被调度过去。
给节点打上污点
使用 kubectl taint 命令可以给节点添加污点。语法格式如下:
kubectl taint nodes <node-name> <key>=<value>:<effect>其中 effect 有三种:
NoSchedule:不允许新Pod调度过来(已存在的不受影响)PreferNoSchedule:尽量避免调度,但不是强制NoExecute:不仅不调度新Pod,还会把已经在运行的不匹配Pod驱逐掉
举个例子,给名为 db-node-1 的节点加上“专用数据库”的污点:
kubectl taint nodes db-node-1 role=database:NoSchedule这样一来,普通Pod就无法调度到这台节点上了。
让Pod容忍特定污点
要让某个Pod能部署到带污点的节点,就需要在Pod的配置里加上容忍设置。比如下面这个Deployment定义:
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-deployment
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
tolerations:
- key: "role"
operator: "Equal"
value: "database"
effect: "NoSchedule"
nodeName: db-node-1这里的 tolerations 字段就是告诉Kubernetes:这个Pod能容忍键为 role、值为 database、effect为 NoSchedule 的污点。于是它就能顺利调度到 db-node-1 上了。
常见的使用场景
实际工作中,污点和容忍经常用在这些地方:
混合环境隔离:比如一个集群里既有物理机又有虚拟机,你想让关键服务只跑在物理机上,就可以给物理机打上污点,关键服务加容忍。
测试与生产共存:开发环境和生产Pod混在一个集群时,可以给生产专用节点加污点,防止测试Pod误占资源。
硬件特殊需求:有些Pod需要GPU,那就给GPU节点打上 gpu=true:NoSchedule 的污点,只有需要GPU的Pod才加对应容忍。
查看和清除污点
想看看某个节点有哪些污点,可以用:
kubectl describe node <node-name> | grep Taints要删除某个污点,在原命令末尾加上 - 即可:
kubectl taint nodes db-node-1 role=database:NoSchedule-这样就清除了该污点,之后所有Pod都能正常调度到这个节点(除非还有别的限制)。
掌握污点和容忍,等于掌握了Kubernetes调度的“门禁系统”。合理使用,能让资源分配更清晰,服务之间更少干扰,运维也更省心。