如何对 Amazon EKS 集群中卡滞的容器组和命名空间进行故障排除?
我无法删除 Amazon Elastic Kubernetes Service (Amazon EKS) 集群中的容器组或命名空间。容器组或命名空间卡滞在“正在终止”状态。
简短描述
删除 Amazon EKS 中的容器组或命名空间后,资源会进入 Terminating(正在终止)状态。如果此过程未完成,则必须手动解决问题。
容器组可能会因以下任一原因出现终止问题:
- 终结器阻止删除
- 容器组无法响应终止信号
- PreStop 钩子失败或 terminationGracePeriodSeconds 服务延时过长
- 网络中断阻止 Worker 节点与控制面板的通信
- 高资源使用率影响 Worker 节点
命名空间可能会因以下任一原因出现终止问题:
- Kubernetes 无法删除特定资源
- API 服务器报告状态为 False
- 终结器阻止删除
解决方法
参考以下部分对卡滞的容器组或命名空间进行故障排除。
对卡滞的容器组进行故障排除
完成以下任务以对卡滞的容器组进行故障排除。
检查容器组状态
完成以下步骤:
-
要查看受影响节点上的 kubelet 日志,请运行以下命令:
kubectl get pods -A --field-selector=status.phase==Terminating -o wide -
查看输出中的 NODE 列以确定受影响的节点。如果所有卡滞的容器组都在同一节点上,则运行以下 journalctl 命令以查看受影响节点上的 kubelet 日志:
journalctl -u kubelet -
重启 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 文件,请完成以下步骤:
- 运行以下命令创建命名空间配置文件:
**注意:**请将 TERMINATING_NAMESPACE 替换为卡滞的命名空间的名称。kubectl get namespace TERMINATING_NAMESPACE -o json > tempfile.json - 从 JSON 文件的 spec 部分移除终结器数组。
- 运行以下命令应用更改:
**注意:**请将 TERMINATING_NAMESPACE 替换为卡滞的命名空间的名称。kubectl replace --raw "/api/v1/namespaces/TERMINATING_NAMESPACE/finalize" -f ./tempfile.json - 验证命名空间是否已移除。运行以下命令:
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。
- 语言
- 中文 (简体)
