宽限期让 Pod 慢一点被驱逐
容忍条目可以带 tolerationSeconds:当节点被打上 NoExecute 类污点(例如失联、不可用)之后,Pod 会保留指定秒数再被驱逐,为优雅下线与重新调度预留时间。不写这个字段表示无限容忍,Pod 会一直留在该节点上。控制面为不可用、未就绪等状况配置的默认容忍通常是有限时间的,因此节点失联后 Pod 会在宽限期结束后被重新调度到其他节点。
基本信息
| 适用对象 | 各版本 Pod 的 tolerations 配置 |
|---|---|
| 关键字段 | tolerationSeconds,配合 effect: NoExecute 使用 |
| 语义 | 未设置表示无限容忍 |
| 常见默认 | 控制器为节点不可用、未就绪等状况配置的容忍多为有限值 |
| 影响范围 | 决定节点异常后 Pod 多久被驱逐并重新调度 |
典型使用场景
- 有状态服务优雅下线:给数据回收与主从切换留出时间窗
- 无状态服务快速重调度:缩短宽限期,尽快把副本补到健康节点
- 专用节点保留:对特定污点设置无限容忍,让 Pod 长期留在该节点
- 维护演练:观察宽限期与副本补齐的实际时间关系
- 告警设计:把节点失联类异常单独覆盖,避免被无限容忍掩盖
宽限期配置示例
宽限期配置示例
spec:
tolerations:
- key: node.kubernetes.io/unreachable
operator: Exists
effect: NoExecute
tolerationSeconds: 300 # 节点不可达后保留 300 秒再驱逐
containers:
- name: app
image: registry.example.com/app:1.5核对污点与容忍
核对污点与容忍
kubectl get node node1 -o jsonpath='{.spec.taints}'
kubectl get pod web-x -o jsonpath='{.spec.tolerations}'
kubectl describe node node1 | grep -i -A3 taints
kubectl get pods -A -o wide --field-selector spec.nodeName=node1 # 节点失联后副本变化配置与行为
| 配置 | 行为 | 适用 |
|---|---|---|
| 不设置 tolerationSeconds | 无限容忍,不被驱逐 | 必须长期留在特定节点的负载 |
| 设置较短值 | 很快被驱逐并重调度 | 可快速重建的无状态服务 |
| 设置较长值 | 留出下线与回收时间 | 有状态服务与主从切换 |
| 节点恢复后 | 由控制器补齐副本 | 重调度结果取决于调度约束 |
宽限期调得太短会加速重调度:有状态服务可能出现两个实例同时写的风险,调整前先把数据一致性方案想清楚。
无限容忍失联节点时,副本数看着正常但流量已经进不来,节点失联类异常需要有独立告警覆盖,不能只依赖副本数指标。