为什么我无法删除 Amazon EKS 集群资源?
我无法从 Amazon Elastic Kubernetes Service (Amazon EKS) 集群中删除资源。
解决方案
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
根据卡滞在 Terminating(正在终止)状态的 Amazon EKS 资源执行以下故障排除操作。终结器提醒控制器删除资源并防止意外删除。如果您的资源卡滞在 Terminating(正在终止)状态,则必须先从中移除终结器,然后再将其删除。有关终结器的详细信息,请参阅 Kubernetes 网站上的终结器。
解决命名空间删除问题
要检查命名空间中是否有资源卡滞在 Terminating(正在终止)状态,请运行以下命令:
kubectl get all -n namespace-name | grep Terminating
**注意:**将 namespace-name 替换为命名空间。
要手动删除资源,请运行以下命令:
kubectl delete resource resource-name -n namespace-name
**注意:**将 resource 替换为资源类型,将 resource-name 替换为资源名称,将 namespace-name 替换为命名空间。
要检查终结器或 API 服务错误,请运行以下命令:
kubectl get ns namespace-name -o json
**注意:**将 namespace-name 替换为命名空间。
如果您在命令输出中收到错误,请参阅如何解决 Amazon EKS 集群中的命名空间处于已终止状态的问题?
解决入口删除问题
要从入口资源中移除终结器,请运行以下命令:
kubectl patch ingress ingress-name -n namespace-name -p '{"metadata":{"finalizers":[]}}' --type=merge
**注意:**将 ingress-name 替换为入口名称,将 namespace-name 替换为命名空间。
然后,运行以下命令删除入口资源:
kubectl delete ingress ingress-name -n namespace-name
**注意:**将 ingress-name 替换为入口名称,将 namespace-name 替换为命名空间。
解决服务删除问题
要从服务资源中移除终结器,请运行以下命令:
kubectl patch svc service-name -n namespace-name -p '{"metadata":{"finalizers":[]}}' --type=merge
**注意:**将 service-name 替换为您的服务名称,将 namespace-name 替换为命名空间。
使用 Amazon EC2 控制台在与服务关联的负载均衡器上停用删除保护。或者,使用 service.beta.kubernetes.io/aws-load-balancer-attributes 注释来停用删除保护。有关详细信息,请参阅 Kubernetes 网站上的 Resource attributes。
然后,运行以下命令删除服务:
kubectl delete svc service-name -n namespace-name
**注意:**将 service-name 替换为您的服务名称,将 namespace-name 替换为命名空间。
解决 PV 和 PVC 删除问题
如果您无法删除 PersistentVolume (PV) 或 PersistentVolumeClaim (PVC),请检查是否存在以下问题:
- 验证在移除绑定的 PVC 之前是否删除了 PV
- 检查是否在 Pod 仍在运行时移除了 PVC 并将其连接在上面
您已删除 PV
要解决此问题,请删除绑定到 PV 的 PVC。
要识别与卡滞在 Terminating(正在终止)状态的 PV 关联的 PVC,请运行以下命令来描述 PV:
kubectl get pv pv-name
**注意:**将 pv-name 替换为 PV 名称。该命令以 NAMESPACE/PVC_NAME 格式显示 PVC 名称和命名空间。
输出示例:
default/ebs-claim
要删除 PVC,请运行以下命令:
kubectl delete pvc -n namespace-name pvc-name
**注意:**将 namespace-name 替换为 PVC 命名空间,将 pvc-name 替换为 PVC 名称。
如果您仍然无法删除 PV,请运行以下命令来移除其终结器:
kubectl patch pv -p '{"metadata":{"finalizers":null}}' pv-name
**注意:**将 pv-name 替换为 PV 名称。
您已移除 PVC
要解决此问题,请删除连接到 PVC 的容器组。
要识别与 PVC 关联的容器组,请运行以下命令来描述 PVC:
kubectl describe pvc -n namespace-name pvc-name
**注意:**将 namespace-name 替换为 PVC 命名空间,将 pvc-name 替换为 PVC 名称。在输出中,选中 Used by 属性。
输出示例:
Name: ebs-claim Namespace: default StorageClass: ebs-sc Status: Bound Volume: pvc-3402cc47-c4d7-42c3-8965-f9e1e08f8b95 Labels: <none> Annotations: pv.kubernetes.io/bind-completed: yes pv.kubernetes.io/bound-by-controller: yes volume.beta.kubernetes.io/storage-provisioner: ebs.csi.aws.com volume.kubernetes.io/selected-node: ip-192-168-33-43.ec2.internal volume.kubernetes.io/storage-provisioner: ebs.csi.aws.com Finalizers: [kubernetes.io/pvc-protection] Capacity: 4Gi Access Modes: RWO VolumeMode: Filesystem Used By: ebs-app-59c74d8d45-z65kj Events: <none>
在前面的示例中,ebs-app-59c74d8d45-z65kj 容器组使用 PVC。
要删除容器组,请运行以下命令:
kubectl delete pod -n namespace-name pod-name
**注意:**将 namespace-name 替换为 PVC 命名空间,将 pod-name 替换为容器组名称。
如果您仍然无法删除 PVC,请运行以下命令移除其终结器:
kubectl patch pvc -p '{"metadata":{"finalizers":null}}' -n namespace-name pvc-name
**注意:**将 namespace-name 替换为 PVC 命名空间,将 pvc-name 替换为 PVC 名称。
解决容器组删除问题
如果您无法删除容器组,请检查是否存在以下问题:
- 检查容器组是否无法响应终止信号
- 验证容器组是否有尚未完成的关联终结器
容器组无法响应终止信号
**重要事项:**以下解决方案会在不确认您终止正在运行的容器组的情况下立即删除该容器组。确保容器组未在运行。否则,容器组可能会无限期地在集群上运行。
容器组通常在默认宽限期 30 秒后删除。如果您的容器组在 30 秒后未删除,则运行以下命令强制删除该容器组:
kubectl delete pod --force --grace-period=0 -n namespace-name pod-name
**注意:**将 namespace-name 替换为容器组命名空间,将 pod-name 替换为容器组名称。您必须将 --grace-period 标志设置为 0 才能立即移除容器组。
容器组的关联终结器尚未完成
要检查容器组是否有终结器,请运行以下命令:
kubectl get pod -o yaml -n namespace-name pod-name
**注意:**将 namespace-name 替换为容器组命名空间,将 pod-name 替换为容器组名称。在输出中,检查 metadata.finalizers 以识别终结器。
输出示例:
apiVersion: v1 kind: Pod metadata: creationTimestamp: "2024-09-16T19:32:01Z" finalizers: - kubernetes labels: app: nginx pod-template-hash: 7c79c4bf97 namespace: default spec: containers: - image: nginx:latest imagePullPolicy: Always name: nginx ports: - containerPort: 80 protocol: TCP
要移除终结器,请运行以下命令:
kubectl patch pod -p '{"metadata":{"finalizers":null}}' -n namespace-name pod-name
**注意:**将 namespace-name 替换为容器组命名空间,将 pod-name 替换为容器组名称。
解决集群删除问题
通常,出现群集删除问题是因为有托管节点组连接到群集。要解决此问题,请移除托管节点组。有关详细信息,请参阅为什么无法删除我的 Amazon EKS 集群?
如果集群有关联的托管抓取器,则您可能还会遇到删除问题。在这种情况下,您无法删除抓取器使用的虚拟专用网络 (VPC) 或弹性网络接口。
要识别抓取器 ID,请运行以下 list-scrapers AWS CLI 命令:
aws amp list-scrapers
然后,运行以下 delete-scraper 命令来删除抓取器:
aws amp delete-scraper --scraper-id scraper-example
**注意:**将 scraper-example 替换为抓取器 ID。
解决 Amazon EKS 托管节点组删除问题
如果您无法删除托管节点组,请检查是否存在以下问题:
- 验证资源是否有依赖对象
- 检查 Amazon EC2 Auto Scaling 组终止流程是否已暂停
- 检查您的节点组是否存在运行状况错误
- 验证容器组是否卡滞在节点中
资源有依赖对象
当托管节点组创建的资源与 AWS 账户中的其他资源关联时,将会出现依赖性问题。通常,资源是一个安全组。要解决此问题,请确定与安全组关联的对象。然后,取消安全组与资源的关联。如果您遇到问题,请参阅为什么我无法删除附加到 Amazon VPC 的安全组?
EC2 Auto Scaling 组终止流程已暂停
要解决此问题,请重启终止流程。
您的节点组存在运行状况错误
有关您的托管节点组中可能发生的运行状况错误类型的信息,请参阅 Issue。
要解决运行状况问题,请参阅如何解决 Amazon EKS 集群中的托管节点组错误?
容器组卡滞在节点中
删除托管节点组时,您可能会收到以下错误消息:
“1 个容器组无法从节点 ip-192-168-29-140.ec2.internal 中被驱逐”
如果集群中的容器组卡滞在 Terminating(正在终止)状态,则可能会出现此问题。要解决此问题,请获得 kubectl 对集群的访问权限,然后运行以下命令:
kubectl get pod -A
出现容器组无法被驱逐错误,可能是因为您对 PodDisruptionBudget 的配置不当或者没有足够的中断可用来驱逐容器组。要解决此问题,请参阅如何解决 Amazon EKS 的托管节点组更新问题?
- 语言
- 中文 (简体)
