跳至内容

如何对 Amazon EKS 集群中卡滞的容器组和命名空间进行故障排除?

2 分钟阅读
0

我无法删除 Amazon Elastic Kubernetes Service (Amazon EKS) 集群中的容器组或命名空间。容器组或命名空间卡滞在“正在终止”状态。

简短描述

删除 Amazon EKS 中的容器组或命名空间后,资源会进入 Terminating(正在终止)状态。如果此过程未完成,则必须手动解决问题。

容器组可能会因以下任一原因出现终止问题:

  • 终结器阻止删除
  • 容器组无法响应终止信号
  • PreStop 钩子失败或 terminationGracePeriodSeconds 服务延时过长
  • 网络中断阻止 Worker 节点与控制面板的通信
  • 高资源使用率影响 Worker 节点

命名空间可能会因以下任一原因出现终止问题:

  • Kubernetes 无法删除特定资源
  • API 服务器报告状态为 False
  • 终结器阻止删除

解决方法

参考以下部分对卡滞的容器组或命名空间进行故障排除。

对卡滞的容器组进行故障排除

完成以下任务以对卡滞的容器组进行故障排除。

检查容器组状态

完成以下步骤:

  1. 要查看受影响节点上的 kubelet 日志,请运行以下命令:

    kubectl get pods -A --field-selector=status.phase==Terminating -o wide
  2. 查看输出中的 NODE 列以确定受影响的节点。如果所有卡滞的容器组都在同一节点上,则运行以下 journalctl 命令以查看受影响节点上的 kubelet 日志:

    journalctl -u kubelet
  3. 重启 kubelet。

检查容器组终结器

要检查终结器,请运行以下命令:

kubectl get pod POD_NAME -n NAMESPACE -o yaml

**注意:**将 POD_NAME 替换为您的容器组名称。将 NAMESPACE 替换为您的容器组所在命名空间的名称。

如果存在终结器,则运行以下命令之一:

对于简单删除,请使用以下命令:

kubectl patch pod POD_NAME -n NAMESPACE -p '{"metadata":{"finalizers":null}}'

或者,如果您的环境需要使用 JSON 补丁操作,或您偏好使用更详细的语法,则使用以下命令:

kubectl patch pod POD_NAME -n NAMESPACE --type=json -p '[{"op": "remove", "path": "/metadata/finalizers" }]'

**注意:**将 POD_NAME 替换为您的容器组名称。将 NAMESPACE 替换为您的容器组所在命名空间的名称。

强制删除容器组

**重要说明:**最佳做法是仅在其他方法均无效时使用此选项,避免数据丢失或损坏。

运行以下命令强制删除容器组:

kubectl delete pod POD_NAME -n NAMESPACE --grace-period=0 --force

**注意:**请将 POD_NAME 替换为您的容器组名称,并将 NAMESPACE 替换为您的容器组所在命名空间的名称。

对卡滞的命名空间进行故障排除

完成以下任务以对卡滞的命名空间进行故障排除。

检查命名空间状态

当命名空间卡滞在 Terminating(正在终止)状态时,该命名空间可能包含 Kubernetes 无法删除的资源。或者,某个 API 服务可能处于 False 状态。

运行以下命令检查您的命名空间状态:

kubectl describe namespace NAMESPACE

**注意:**请将 NAMESPACE 替换为卡滞的命名空间的名称。

查找并移除剩余资源

如果命名空间中仍有资源,您会收到以下错误消息:

"NamespaceContentRemaining: Some resources are remaining: serviceaccounts has 2 resource instances"

要列出剩余资源,请运行以下命令:

kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get --show-kind --ignore-not-found -n NAMESPACE

**注意:**请将 NAMESPACE 替换为您的命名空间名称。

然后,运行以下命令移除已识别的资源:

kubectl delete RESOURCE_TYPE RESOURCE_NAME -n NAMESPACE

**注意:**请将 RESOURCE_TYPE 替换为资源类型,将 RESOURCE_NAME 替换为资源名称,并将 NAMESPACE 替换为您的命名空间。

移除命名空间终结器

如果终结器仍处于连接状态,您会收到以下错误消息:

"NamespaceFinalizersRemaining: Some content in the namespace has finalizers remaining: kubernetes.io/persistent-volume-provisioner in 1 resource instance"

要移除命名空间终结器,您可以运行补丁命令、使用 JSON 文件或强制删除命名空间。

要通过补丁操作移除终结器,请运行以下命令:

kubectl patch namespace NAMESPACE --type=json -p '[{"op": "remove", "path": "/metadata/finalizers" }]'

**注意:**请将 NAMESPACE 替换为卡滞的命名空间的名称。

要使用 JSON 文件,请完成以下步骤:

  1. 运行以下命令创建命名空间配置文件:
    kubectl get namespace TERMINATING_NAMESPACE -o json > tempfile.json
    **注意:**请将 TERMINATING_NAMESPACE 替换为卡滞的命名空间的名称。
  2. 从 JSON 文件的 spec 部分移除终结器数组。
  3. 运行以下命令应用更改:
    kubectl replace --raw "/api/v1/namespaces/TERMINATING_NAMESPACE/finalize" -f ./tempfile.json
    **注意:**请将 TERMINATING_NAMESPACE 替换为卡滞的命名空间的名称。
  4. 验证命名空间是否已移除。运行以下命令:
    kubectl get namespaces

要强制删除命名空间,请运行以下命令:

kubectl delete namespace NAMESPACE --grace-period=0 --force

**注意:**请将 NAMESPACE 替换为卡滞的命名空间的名称。最佳做法是仅在其他方法均无效时使用此选项,避免数据丢失或损坏。

清理自定义资源

如果命名空间中仍有资源,则运行以下命令:

kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get --show-kind --ignore-not-found -n NAMESPACE

**注意:**请将 NAMESPACE 替换为您的命名空间名称。

如果识别到自定义资源,则运行以下命令将其移除:

kubectl delete RESOURCE_TYPE RESOURCE_NAME -n NAMESPACE

**注意:**请将 RESOURCE_TYPE 替换为资源类型,将 RESOURCE_NAME 替换为资源名称,并将 NAMESPACE 替换为您的命名空间。

运行以下命令移除自定义资源终结器:

kubectl patch RESOURCE_TYPE RESOURCE_NAME -n NAMESPACE -p '{"metadata":{"finalizers":null}}' --type=merge

**注意:**将 RESOURCE_TYPE 替换为资源类型。将 RESOURCE_NAME 替换为资源名称。将 NAMESPACE 替换为您的命名空间。

然后,运行以下命令移除 CustomResourceDefinitions

kubectl delete crd CRD_NAME

**注意:**请将 CRD_NAME 替换为您的 CustomResourceDefinition 的名称。仅移除不再需要的 CustomResourceDefinitions

AWS 官方已更新 6 个月前