Amazon EKS クラスターでスタックしているポッドと名前空間のトラブルシューティング方法を教えてください。
Amazon Elastic Kubernetes Service (Amazon EKS) クラスターのポッドや名前空間を削除できません。ポッドや名前空間が Terminating 状態でスタックしています。
簡単な説明
Amazon EKS でポッドや名前空間を削除すると、リソースは Terminating 状態になります。このプロセスが完了しない場合は、問題を手動で解決する必要があります。
ポッドの終了に関する問題は、次のいずれかの理由で発生する可能性があります。
- ファイナライザーが削除を妨げている
- ポッドが終了シグナルに応答しない
- PreStop フックが失敗するか、terminationGracePeriodSeconds サービスが長すぎる
- ネットワークの中断によりワーカーノードとコントロールプレーンの通信がブロックされている
- リソース使用率が高く、ワーカーノードに影響している
名前空間の終了に関する問題は、次のいずれかの理由で発生する可能性があります。
- 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"
名前空間ファイナライザーを削除するには、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 ファイルの 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 のみを削除してください。
- トピック
- Containers
- 言語
- 日本語

関連するコンテンツ
- 質問済み 1年前