排查由于 PDB 导致的逐出失败而导致的 UpgradeFailed 错误

本文讨论如何识别和解决在尝试升级 Azure Kubernetes 服务 (AKS) 群集时,Pod 中断预算 (PDB) 导致的逐出失败导致的 UpgradeFailed 错误。

先决条件

本文需要 Azure CLI 版本 2.0.65 或更高版本。 若要查找版本号,请运行 az --version。 如果必须安装或升级 Azure CLI,请参阅 如何安装 Azure CLI

有关升级过程的更多详细信息,请参阅升级 AKS) 群集中的“升级 AKS 群集”一节Azure Kubernetes 服务 (。

症状

AKS 群集升级操作失败,并显示以下错误消息:

代码:UpgradeFailed
消息:逐出 Pod <pod-name> 时,清空节点<节点名称>失败。 逐出失败,出现“请求过多”错误。 这通常是由 PDB) 策略的限制性 Pod 中断预算 (导致的。 请参阅 http://aka.ms/aks/debugdrainfailures。 原始错误:对 Kubernetes API 服务器的 API 调用失败。

原因

如果 Pod 受到 Pod 中断预算 (PDB) 策略的保护,则可能会发生此错误。 在这种情况下,Pod 会阻止耗尽。

若要测试这种情况,请运行 kubectl get pdb -A,然后检查“允许的中断”值。 该值应为 1 或更大。 有关详细信息,请参阅 使用 Pod 中断预算规划可用性

如果 “允许的中断” 值为 0,则节点排出将在升级过程中失败。

若要解决此问题,请使用以下解决方案之一。

解决方案 1:启用 Pod 以排出

  1. 调整 PDB 以启用 Pod 清空。 通常,允许的中断由 Min Available / Max unavailableRunning pods / Replicas 参数控制。 可以在 PDB 级别修改参数, Min Available / Max unavailable 或增加 的数量 Running pods / Replicas ,以将“允许的中断”值推送到 1 或更大。
  2. 请再次尝试将 AKS 群集升级到之前尝试升级到的版本。 此过程将触发对帐。

解决方案 2:备份、删除和重新部署 PDB

  1. 备份 PDB kubectl get pdb <pdb-name> -n <pdb-namespace> -o yaml > pdb_backup.yaml,然后删除 PDB kubectl delete pdb <pdb-name> -n /<pdb-namespace>。 升级完成后,可以重新部署 PDB kubectl apply -f pdb_backup.yaml
  2. 请再次尝试将 AKS 群集升级到之前尝试升级到的版本。 此过程将触发对帐。

解决方案 3:删除无法清空的 Pod

  1. 删除无法排出的 Pod。

    注意

    如果 Pod 是由部署或 StatefulSet 创建的,则它们将由 ReplicaSet 控制。 如果是这种情况,可能需要删除部署或 StatefulSet。 在此之前,建议先进行备份: kubectl get <kubernetes-object> <name> -n <namespace> -o yaml > backup.yaml

  2. 请再次尝试将 AKS 群集升级到之前尝试升级到的版本。 此过程将触发对帐。

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 还可以向 Azure 反馈社区提交产品反馈。