跳至內容

如何在 Amazon EKS 叢集中對卡住的 Pod 和命名空間進行疑難排解?

3 分的閱讀內容
0

我無法在 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集中刪除 Pod 或命名空間。Pod 或命名空間卡在終止中狀態。

簡短說明

在 Amazon EKS 中刪除 Pod 或命名空間之後,資源會進入終止中狀態。如果此程序未完成,您必須手動解決問題。

Pod 可能因為以下任一原因而發生終止問題:

  • 完成項阻止刪除
  • Pod 無法回應終止訊號
  • PreStop 勾點失敗,或 terminationGracePeriodSeconds 服務延長時間過長
  • 網路中斷會阻擋工作節點與控制平面的通訊
  • 資源使用率過高會影響工作節點

命名空間可能因為以下任一原因而發生終止問題:

  • Kubernetes 無法刪除特定資源
  • API 伺服器回報 False 狀態
  • 完成項阻止刪除

解決方法

使用以下各節針對卡住的 Pod 或命名空間進行疑難排解。

對卡住的 Pod 進行疑難排解

完成以下任務來對卡住的 Pod 進行疑難排解。

檢查 Pod 狀態

請完成以下步驟:

  1. 若要檢查受影響節點上的 kubelet 日誌,請執行以下命令:

    kubectl get pods -A --field-selector=status.phase==Terminating -o wide
  2. 檢閱輸出中的 NODE 欄,以找出受影響的節點。如果所有卡住的 Pod 都在同一個節點上,請執行以下 journalctl 命令來檢查受影響節點上的 kubelet 日誌:

    journalctl -u kubelet
  3. 重新啟動 kubelet。

檢查 Pod 完成項

若要檢查完成項,請執行以下命令:

kubectl get pod POD_NAME -n NAMESPACE -o yaml

**注意:**將 POD_NAME 替換為您的 Pod 名稱。將 NAMESPACE 替換為 Pod 所在的命名空間名稱。

如果存在完成項,請執行以下其中一個命令:

若要進行簡單移除,請使用以下命令:

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 替換為您的 Pod 名稱。將 NAMESPACE 替換為 Pod 所在的命名空間名稱。

強制刪除 Pod

**重要:**只有在其他方法失敗時,才建議使用此選項,以避免資料遺失或損毀。

請執行以下命令來強制刪除 Pod:

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

**注意:**將 POD_NAME 替換為您的 Pod 名稱,並將 NAMESPACE 替換為 Pod 所在的命名空間名稱。

對卡住的命名空間進行疑難排解

完成以下任務來對卡住的命名空間進行疑難排解。

檢查命名空間狀態

當命名空間卡在終止中狀態時,命名空間內可能包含 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」

若要移除命名空間完成項,您可以執行 patch 命令、使用 JSON 檔案,或強制刪除命名空間。

若要使用 patch 作業移除完成項,請執行以下命令:

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 檔案的規格區段中移除完成項陣列。
  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 個月前