You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

K8s节点故障后如何自动强制删除处于Terminating状态的Pod?

解决方案

你遇到的Multi-Attach错误根因是RWO(ReadWriteOnce)模式的PersistentVolumeClaim同一时间仅允许被挂载到单个节点。当Pod所在节点失联时,K8s默认会保留失联节点上的Pod对象(避免脑裂场景下双实例写数据),旧Pod的挂载记录未被清理,因此新调度的Pod无法绑定同一块PV。以下是三种可落地的配置方案:

方案1:调整集群全局驱逐参数(需集群管理员权限)

修改kube-controller-manager的启动参数,调整节点失联后的驱逐等待时长:

  • --pod-eviction-timeout=1m:节点状态变为NotReady/Unreachable后,等待1分钟就开始驱逐该节点上的所有Pod,默认值为5分钟。修改后需重启kube-controller-manager组件生效。

方案2:在Deployment级别配置短容忍时间(无需集群级修改)

直接修改你的Deployment的Pod模板,配置节点不可达污点的短容忍时长,业务侧即可自主生效:

spec:
  template:
    spec:
      tolerations:
      - key: "node.kubernetes.io/unreachable"
        operator: "Exists"
        effect: "NoExecute"
        tolerationSeconds: 60 # 节点失联后60秒,Pod就会被从API server中标记驱逐
      - key: "node.kubernetes.io/not-ready"
        operator: "Exists"
        effect: "NoExecute"
        tolerationSeconds: 60
      terminationGracePeriodSeconds: 10 # 优雅终止最大等待时长,超时后强制终止进程

配置生效后,节点失联超过60秒对应Pod就会被自动标记为删除,等待terminationGracePeriodSeconds超时后就会被强制清理,无需手动执行删除命令。

方案3:自定义定时清理脚本

如果上述配置仍无法满足你的超时要求,可以部署一个CronJob到集群中,定期扫描所有处于Terminating状态超过阈值(比如2分钟)、且关联了PVC的Pod,自动执行强制删除命令,参考命令如下:
kubectl delete pod ${POD_NAME} -n ${POD_NAMESPACE} --grace-period=0 --force

注意事项
  • 超时时间不要设置过短,避免节点临时网络波动导致Pod被误删,引发不必要的业务重启
  • 强制删除Pod前要确保你的业务具备定期数据落盘逻辑,避免未同步到存储的数据丢失
  • 如果你的存储插件支持ReadWriteMany(RWX)模式的PV,可以将PVC的访问模式修改为RWX,从根本上避免Multi-Attach错误

内容的提问来源于stack exchange,提问作者David Tinker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 17:36:09