跳至內容

為什麼我無法刪除 Amazon EKS 叢集資源?

3 分的閱讀內容
0

我無法從 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集中刪除資源。

解決方法

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

根據卡在終止狀態的 Amazon EKS 資源,執行下列疑難排解動作。完成項會提醒控制器刪除資源並防止意外刪除。如果您的資源卡在終止狀態,則必須先從資源中移除完成項,然後才能刪除資源。如需完成項的詳細資訊,請參閱 Kubernetes 網站上的完成項

對命名空間刪除問題進行疑難排解

若要檢查命名空間中是否有資源處於終止狀態,請執行下列命令:

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 網站上的資源屬性

然後,執行以下命令刪除該服務:

kubectl delete svc service-name -n namespace-name

**注意:**將 service-name 替換為您的服務帳戶名稱,將 namespace-name 替換為您的命名空間。

對 PV 和 PVC 刪除問題進行疑難排解

如果您無法刪除 PersistentVolume (PV) 或 PersistentVolumeClaim (PVC),請檢查以下問題:

  • 確認您是否在移除繫結 PVC 之前就刪除了 PV
  • 檢查您是否在 Pod 仍在執行且已附加到 PVC 的情況下就將 PVC 移除

您刪除了 PV

若要解決此問題,請刪除已繫結至 PV 的 PVC。

若要識別與處於終止狀態的 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 的 Pod。

若要識別與 PVC 相關聯的 Pod,請執行下列命令來描述 PVC:

kubectl describe pvc -n namespace-name pvc-name

注意:namespace-name 替換為 PVC 命名空間,將 pvc-name 替換為 PVC 名稱。在輸出中,檢查使用者屬性。

輸出範例:

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 Pod 使用 PVC。

若要刪除 Pod,請執行以下命令:

kubectl delete pod -n namespace-name pod-name

**注意:**將 namespace-name 替換為 PVC 命名空間,將 pod-name 替換為 Pod 名稱。

如果您仍然無法刪除 PVC,請執行下列命令以移除其完成項:

kubectl patch pvc -p '{"metadata":{"finalizers":null}}' -n namespace-name pvc-name

**注意:**將 namespace-name 替換為 PVC 命名空間,將 pvc-name 替換為 PVC 名稱。

對 Pod 刪除問題進行疑難排解

如果無法刪除 Pod,請檢查下列問題:

  • 檢查 Pod 是否未能回應終止訊號
  • 確認 Pod 是否有尚未完成的關聯完成項

Pod 未能回應終止訊號

**重要:**以下解決方案將立即刪除該 Pod,而不會確認您是否終止了正在執行的 Pod。確認 Pod 並未在執行中。如果您沒有這樣做,Pod 可能會在叢集上無限期地執行。

Pod 通常會在預設的 30 秒寬限期後刪除。如果您的 Pod 在 30 秒後沒有刪除,請執行以下命令強制刪除該 Pod:

kubectl delete pod --force --grace-period=0 -n namespace-name pod-name

**注意:**將 namespace-name 替換為 Pod 命名空間,將 pod-name 替換為 Pod 名稱。您必須將 --grace-period 旗標設為 **0 **才能立即移除該 Pod。

該 Pod 有尚未完成的關聯完成項

若要檢查 Pod 是否具有完成項,請執行下列命令:

kubectl get pod -o yaml -n namespace-name pod-name

**注意:**將 namespace-name 替換為 Pod 命名空間,將 pod-name 替換為 Pod 名稱。在輸出中,檢查 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 命名空間,將 pod-name 替換為 Pod 名稱。

對叢集刪除問題進行疑難排解

通常,叢集刪除問題是因為有受管節點群組附加在叢集上。若要解決此問題,請移除受管節點群組。如需詳細資訊,請參閱為什麼我無法刪除 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 群組終止程序是否已暫停
  • 檢查您的節點群組是否有運作狀態錯誤
  • 確認 Pod 是否卡在節點中

資源具有相依物件

當受管節點群組建立的資源與 AWS 帳戶中的另一個資源關聯時,就會發生相依性問題。通常,資源是一個安全群組。若要解決此問題,請識別與安全群組關聯的物件。然後,取消安全群組與資源的關聯。如果遇到問題,請參閱為什麼我無法刪除附加至 Amazon VPC 的安全群組?

EC2 Auto Scaling 群組終止程序已暫停

若要解決此問題,請重新啟動「終止」程序

您的節點群組出現運作狀態錯誤

如需了解受管節點群組中可能發生的運作狀態錯誤類型,請參閱問題

若要對運作狀態問題進行疑難排解,請參閱如何解決 Amazon EKS 叢集中的受管節點群組錯誤?

Pod 卡在節點中

刪除受管節點群組時,您可能會收到以下錯誤訊息:

「1 個 Pod 無法從節點 ip-192-168-29-140.ec2.internal 中驅逐」

如果叢集中的 Pod 卡在終止狀態,就可能會出現此問題。若要解決此問題,請取得 kubectl 對叢集的存取權,然後執行下列命令:

kubectl get pod -A

Pod 無法驅逐錯誤可能是因為您的 PodDisruptionBudget 設定錯誤,或沒有足夠的中斷可用來允許 Pod 驅逐。若要對此問題進行疑難排解,請參閱如何對 Amazon EKS 的受管節點群組更新問題進行疑難排解?

AWS 官方已更新 1 年前