污点(Taint)与容忍(Toleration)机制为 Kubernetes 提供了灵活的节点隔离与调度控制能力,是实现多租户和资源专用场景的关键手段。
Taint(污点)和 Toleration(容忍)是 Kubernetes 中用于控制 Pod 调度的重要机制。它们通过在 Node 和 Pod 上分别设置排斥与容忍规则,实现资源的精细分配和节点隔离。
Taint 和 Toleration 相互配合,决定 Pod 是否能被调度到某个节点:
与节点亲和性(Node Affinity)不同,Taint 和 Toleration 采用排斥机制,而亲和性是吸引机制。
通过命令行为节点添加、删除和查看污点,实现节点级的调度控制。
以下命令为节点添加不同类型的污点:
# 禁止调度新 Pod
kubectl taint nodes node1 key1=value1:NoSchedule
# 驱逐现有 Pod 并禁止调度新 Pod
kubectl taint nodes node1 key1=value1:NoExecute
# 尽量避免调度(软限制)
kubectl taint nodes node1 key2=value2:PreferNoSchedule
通过在键名后添加减号删除污点:
kubectl taint nodes node1 key1:NoSchedule-
kubectl taint nodes node1 key1:NoExecute-
kubectl taint nodes node1 key2:PreferNoSchedule-
可通过以下命令检查节点上的所有污点:
kubectl describe nodes node1
# 或者使用 jsonpath 获取特定信息
kubectl get nodes node1 -o jsonpath='{.spec.taints}'
在 Pod 的 spec.tolerations 字段中配置容忍规则,使 Pod 能调度到带有特定污点的节点。
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoExecute"
tolerationSeconds: 3600
- key: "maintenance"
operator: "Exists"
effect: "NoExecute"
tolerationSeconds: 300
containers:
- name: app
image: nginx
下表总结了 Toleration 主要字段及含义。
| 字段 | 说明 |
|---|---|
| key | 对应 Taint 的键名 |
| operator | 匹配操作符(Equal/Exists) |
| value | 对应 Taint 的值(Exists 时可省略) |
| effect | 污点效果类型(NoSchedule/PreferNoSchedule/NoExecute) |
| tolerationSeconds | 容忍宽限时间,仅对 NoExecute 有效 |
operator: Equal 精确匹配键值对,Exists 只要键存在即匹配。effect 控制调度或驱逐行为,tolerationSeconds 控制 Pod 被驱逐前的宽限时间。合理配置 Taint 和 Toleration,可实现多种调度隔离和资源专用场景。
为特定工作负载预留节点:
# 标记节点为 GPU 专用
kubectl taint nodes gpu-node dedicated=gpu:NoSchedule
临时隔离节点进行维护:
# 设置维护污点
kubectl taint nodes node1 maintenance=true:NoExecute
处理有问题的节点:
# 标记问题节点
kubectl taint nodes problematic-node problem=disk-pressure:NoSchedule
Kubernetes 会自动为节点添加一些内置污点,用于反映节点健康和资源状态。
| 污点键 | 说明 |
|---|---|
| node.kubernetes.io/not-ready | 节点未就绪 |
| node.kubernetes.io/unreachable | 节点不可达 |
| node.kubernetes.io/disk-pressure | 磁盘压力 |
| node.kubernetes.io/memory-pressure | 内存压力 |
| node.kubernetes.io/pid-pressure | PID 压力 |
| node.kubernetes.io/network-unavailable | 网络不可用 |
NoSchedule,软限制用 PreferNoSchedule,NoExecute 谨慎用于关键服务。Taint 和 Toleration 机制为 Kubernetes 提供了强大的节点隔离与调度灵活性。通过合理配置,可以实现资源专用、节点维护、故障隔离等多种场景,提升集群的弹性和可维护性。