Namespace が終了状態のままになる場合のトラブルシューティング


このページでは、Namespace が Terminating 状態のままになる問題を解決する方法について説明します。

Namespace は、Kubernetes のファイナライザを使用して、Namespace 内にまだリソースが残っている場合の削除を防いでいます。kubectl delete コマンドを使用して Namespace を削除すると、Namespace は Terminating 状態になります。Kubernetes が依存リソースを削除してすべてのファイナライザをクリアするまで、Namespace は Terminating 状態のままになります。Namespace ライフサイクル コントローラは、まず Namespace 内で GKE が削除する必要のあるリソースのリストを作成します。

GKE が依存リソースを削除できない場合か、Namespace ライフサイクル コントローラが Namespace が空の状態であることを確認できない場合、問題を解決するまで Namespace は Terminating 状態のままになります。

Namespace が Terminating 状態のままになっている問題を解決するには、削除を妨げている異常なコンポーネントを特定して削除します。以下の解決策を順番に試してください。

  1. 利用できない API サービスを見つけて削除する
  2. 残存しているリソースを見つけて削除する
  3. Namespace を強制削除する

利用できない API サービスを見つけて削除する

  1. 使用できない API サービスの一覧を取得します。

    kubectl get apiservice | grep False
    
  2. 応答していないサービスのトラブルシューティングを行います。

    kubectl describe apiservice API_SERVICE
    

    API_SERVICE は、応答していないサービスの名前に置き換えます。

  3. Namespace のステータスが引き続き Terminating かどうかを確認します。

    kubectl get ns | grep Terminating
    

残存しているリソースを見つけて削除する

  1. 終了処理中の Namespace に残っているリソースの一覧を取得します。

    kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get -n NAMESPACE
    

    NAMESPACE は、削除する Namespace の名前に置き換えます。

  2. 出力にあるリソースをすべて削除します。

  3. Namespace のステータスが引き続き Terminating かどうかを確認します。

    kubectl get ns | grep Terminating
    

Namespace を強制削除する

Namespace の削除を妨げているファイナライザを削除して、Namespace を強制終了します。

  1. 次のマニフェストを YAML ファイルとして保存します。

    kubectl get ns NAMESPACE -o yaml > ns-terminating.yml
    
  2. テキスト エディタでマニフェストを開き、spec.finalizers フィールドのすべての値を削除します。

    vi ns-terminating.yml
    
  3. ファイナライザ フィールドが空であることを確認します。

    cat ns-terminating.yml
    

    出力は次のようになります。

    apiVersion: v1
    kind: Namespace
    metadata:
      annotations:
      name: NAMESPACE
    spec:
      finalizers:
    status:
      phase: Terminating
    
  4. HTTP プロキシを開始して Kubernetes API にアクセスします。

    kubectl proxy
    
  5. curl を使用して Namespace マニフェストを置き換えます。

    curl -H "Content-Type: application/yaml" -X PUT --data-binary @ns-terminating.yml http://127.0.0.1:8001/api/v1/namespaces/NAMESPACE/finalize
    
  6. Namespace のステータスが引き続き Terminating かどうかを確認します。

    kubectl get ns | grep Terminating
    

次のステップ

さらにサポートが必要な場合は、Cloud カスタマーケアにお問い合わせください。