如何在 Amazon EKS 叢集中對卡住的 Pod 和命名空間進行疑難排解?
我無法在 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集中刪除 Pod 或命名空間。Pod 或命名空間卡在終止中狀態。
簡短說明
在 Amazon EKS 中刪除 Pod 或命名空間之後,資源會進入終止中狀態。如果此程序未完成,您必須手動解決問題。
Pod 可能因為以下任一原因而發生終止問題:
- 完成項阻止刪除
- Pod 無法回應終止訊號
- PreStop 勾點失敗,或 terminationGracePeriodSeconds 服務延長時間過長
- 網路中斷會阻擋工作節點與控制平面的通訊
- 資源使用率過高會影響工作節點
命名空間可能因為以下任一原因而發生終止問題:
- Kubernetes 無法刪除特定資源
- API 伺服器回報 False 狀態
- 完成項阻止刪除
解決方法
使用以下各節針對卡住的 Pod 或命名空間進行疑難排解。
對卡住的 Pod 進行疑難排解
完成以下任務來對卡住的 Pod 進行疑難排解。
檢查 Pod 狀態
請完成以下步驟:
-
若要檢查受影響節點上的 kubelet 日誌,請執行以下命令:
kubectl get pods -A --field-selector=status.phase==Terminating -o wide -
檢閱輸出中的 NODE 欄,以找出受影響的節點。如果所有卡住的 Pod 都在同一個節點上,請執行以下 journalctl 命令來檢查受影響節點上的 kubelet 日誌:
journalctl -u kubelet -
重新啟動 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 檔案,請完成以下步驟:
- 請執行以下命令來建立命名空間組態檔:
**注意:**將 TERMINATING_NAMESPACE 替換為卡住的命名空間名稱。kubectl get namespace TERMINATING_NAMESPACE -o json > tempfile.json - 從 JSON 檔案的規格區段中移除完成項陣列。
- 請執行以下命令來套用變更:
**注意:**將 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。
- 語言
- 中文 (繁體)

相關內容
- 已提問 10 天前