🐈

k8sでnamespace(pod)が削除できない

2023/03/25に公開

以下のようにとあるnamespaceを削除しようとするとステータスがTerninating状態だと削除されないことがある。

user$ kubectl get po <namespace>
NAME                             READY   STATUS        RESTARTS   AGE
xxxxxxxxxxxxxxxxxxxx   1/1     Terminating   0          23h

解決方法

Terminating状態のpodを確認する

kubectl get po <namespace>

jsonファイルを以下コマンドで作成する

 kubectl get namespace <namespace> -o json > tmp.json

tmp.json ファイルを編集し、finalizersフィールドからkubernetes値を削除して、ファイルを保存する。

以下のように

  {
      "apiVersion": "v1",
      "kind": "Namespace",
      "metadata": {
          "creationTimestamp": "2018-11-19T18:48:30Z",
          "deletionTimestamp": "2018-11-19T18:59:36Z",
          "name": "<terminating-namespace>",
          "resourceVersion": "1385077",
          "selfLink": "/api/v1/namespaces/<terminating-namespace>",
          "uid": "b50c9ea4-ec2b-11e8-a0be-fa163eeb47a5"
      },
      "spec": {
         "finalizers": 
      },
      "status": {
          "phase": "Terminating"
      }
  }

一時プロキシーIPおよびポートを設定するには、以下のコマンドを実行する。
スタックしている名前空間を削除するまで、端末ウィンドウは必ず開いたままにしておく。

 kubectl proxy

以下のような出力になる

 Starting to serve on 127.0.0.1:8001

別のターミナル(別タブ)から以下のcurlを叩く

 curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json http://127.0.0.1:8001/api/v1/namespaces/<terminating-namespace>/finalize

すると、以下のような出力がでてくる

一時プロキシーIPおよびポートを設定するには、以下のコマンドを実行する。
スタックしている名前空間を削除するまで、端末ウィンドウは必ず開いたままにしておく。

 kubectl proxy

以下のような出力になる

 Starting to serve on 127.0.0.1:8001

別のターミナル(別タブ)から以下のcurlを叩く

 curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json http://127.0.0.1:8001/api/v1/namespaces/<terminating-namespace>/finalize

すると、以下のような出力がでてくる

Discussion