Longhorn节点驱逐因Pod中断预算报错,如何通过Helm配置自动化处理?
Longhorn节点驱逐(Drain)适配Kubernetes原地升级解决方案
问题根源
instance-manager Pod对应的PodDisruptionBudget(PDB)默认maxUnavailable被设为0,直接限制了该类型Pod的驱逐操作,触发报错:
error when evicting pods/"instance-manager-xxx" -n "longhorn-system" (will retry after 5s): Cannot evict pod as it would violate the pod's disruption budget.
解决方案
1. 临时调整PDB(适配单次自动化驱逐流程)
适合仅为节点升级临时放行驱逐的场景,可直接嵌入Ansible自动化任务:
- 修改instance-manager的PDB参数,允许1个Pod中断:
kubectl patch pdb instance-manager -n longhorn-system -p '{"spec":{"maxUnavailable":1}}' - 执行节点封锁与驱逐:
kubectl cordon <目标节点名称> kubectl drain <目标节点名称> --ignore-daemonsets --delete-emptydir-data - 节点升级完成、重新加入集群后,可恢复原PDB配置(按需选择):
kubectl patch pdb instance-manager -n longhorn-system -p '{"spec":{"maxUnavailable":0}}'
2. 通过Helm Chart永久修改PDB配置(适配长期自动化流程)
Longhorn 1.5.3的Helm Chart支持通过values.yaml配置instance-manager的PDB参数,无需手动修改集群资源:
- 在你的Helm values配置文件中添加以下内容:
instanceManager: podDisruptionBudget: maxUnavailable: 1 # 可根据集群节点规模调整,比如节点数较多时设为2或百分比(如"20%") # 如需设置最小可用数,可追加: # minAvailable: 2 - 执行Helm升级应用配置:
配置生效后,后续所有节点驱逐操作都会自动适配修改后的PDB规则,无需临时调整。helm upgrade longhorn longhorn/longhorn -n longhorn-system -f <你的values文件路径>
自动化流程注意事项
- 在Ansible playbook中需保证任务执行顺序:
- 临时修改PDB(若用临时方案)/ 先完成Helm配置升级(若用永久方案)
- 执行节点cordon和drain
- 节点升级完成后执行
kubectl uncordon <目标节点名称> - 恢复PDB配置(仅临时方案需要)
内容的提问来源于stack exchange,提问作者Eric Hemmerlin
相关产品推荐
相关产品推荐

