使用kubectl drain node时如何让K8s等新Pod就绪再删旧Pod?
解决kubectl drain时Pod驱逐导致的服务停机问题
Deployment的rollingUpdate策略仅针对版本滚动更新场景生效,而kubectl drain触发的是节点级的Pod驱逐(属于集群维护类中断),这个场景下需要通过**PodDisruptionBudget(PDB,Pod中断预算)**来约束Pod的中断行为,确保新Pod就绪后再删除旧Pod。
具体配置步骤
- 创建对应PodDisruptionBudget资源,配置最小可用Pod数量/百分比,保证驱逐过程中服务始终有足够的就绪Pod:
apiVersion: policy/v1 kind: PodDisruptionBudget metadata: name: platform-menu-backend-pdb spec: minAvailable: 100% # 若副本数固定,也可设置具体数值(如4),确保可用Pod数不低于原副本量 selector: matchLabels: app: platform-menu-backend # 与Deployment的标签匹配
将上述内容保存为pdb.yaml,执行kubectl apply -f pdb.yaml完成配置。
- 执行节点驱逐命令时,需忽略DaemonSet类型的Pod(这类Pod无法被正常驱逐):
kubectl drain <节点名称> --ignore-daemonsets --delete-emptydir-data
原理说明
配置PDB后,Kubernetes在执行Pod驱逐时会检查当前可用Pod数是否满足minAvailable的要求:
- 若待驱逐节点上的Pod被删除后会导致可用Pod数不达标,Kubernetes会先调度新Pod至其他健康节点
- 等待新Pod进入**就绪(Ready)**状态后,再删除待驱逐节点上的旧Pod,从而避免服务停机
内容的提问来源于stack exchange,提问作者Lucas Fernandes
相关产品推荐
相关产品推荐

