排查 Pod 和命名空间停滞在终止状态的问题

本文讨论Microsoft Azure Kubernetes 服务(AKS)中 Pod 和命名空间停滞Terminating在状态中的方案故障排除策略。

先决条件

故障排除清单

步骤 1:确定要删除的 Pod

验证必须删除的 Pod 的名称以及 Pod 所属的命名空间。 若要确定哪些 Pod 在 AKS 群集上运行,以及 Pod 正在运行的命名空间,请运行以下 kubectl get 命令:

kubectl get pod --all-namespaces

步骤 2:删除 Pod

使用步骤 1 中的信息,运行以下 kubectl delete 命令以删除 Pod:

kubectl delete <pod-name> --namespace <namespace-name>

注意

如果指定的 Pod 属于“default”命名空间,则可以省略 --namespace <namespace-name> 该参数。

如果收到以下错误消息,请确保 Pod 名称和命名空间名称正确:

服务器错误(NotFound):找不到 Pod“<POD NAME>”

如果 Pod 和命名空间名称正确,但未删除 Pod,则可以强行删除 Pod。 为此,请 kubectl delete 运行以下命令:

kubectl delete pod <pod-name> --namespace <namespace-name> --grace-period=0 --force --wait=false

步骤 3:确定要删除的命名空间

验证必须删除的命名空间的名称。 若要确定 AKS 群集上运行的命名空间, kubectl get 请运行以下命令:

kubectl get namespace

步骤 4:查找命名空间中的资源

如果命名空间停滞在 Terminating 状态中,请查找命名空间中定义的所有资源。 为此,请 kubectl get 运行以下命令:

kubectl get all --namespace <namespace-name>

步骤 5:删除命名空间中的资源

发现命名空间中定义了哪些资源后,请删除这些资源。 若要删除每个资源, kubectl delete 请运行以下命令:

kubectl delete <resource> <resource name> --namespace <namespace-name> --grace-period=0 --force --wait=false

例如,如果要删除 nginxtest 命名空间中的 nginx Pod,请运行以下命令:

kubectl delete pod nginxtest --namespace nginx --grace-period=0 --force --wait=false

步骤 6:删除命名空间

删除命名空间中的所有资源后,请删除命名空间本身。 为此,请 kubectl delete 运行以下命令:

kubectl delete namespace <namespace-name>  --grace-period=0 --force --wait=false

警告

如果使用终结器防止意外删除,则kubectl delete命令最初可能无法成功。 终结器是发出预删除操作信号的资源的密钥。 终结器控制资源上的垃圾回收,它们旨在提醒控制者在删除资源之前要执行的操作。

但是,终结器不一定标识应执行的代码。 事实上,终结器采用以下方式类似于批注:

  • 它们基本上是密钥列表。
  • 可以操纵它们。

如果尝试删除具有终结器的资源,则在控制器删除终结器键或终结器之前,该资源将一直处于最终状态,或者通过使用 kubectl 删除终结器。 清空终结器列表后,Kubernetes 可以回收资源并将其放入要从注册表中删除的队列中。

如果没有资源保留在命名空间中,但命名空间仍停滞在 Terminating 状态中,请运行以下 kubectl patch 命令以清空终结器字段:

kubectl patch namespace <namespace-name> --patch '{"metadata": {"finalizers": null}}'

此操作使你可以在再次运行 kubectl delete 命令时成功删除命名空间。

联系我们寻求帮助

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