kubernetes の namespace が terminating になっていて消せない
kubernetes の namespace が terminating になっていて消せなかった時のメモです。
TL;DR
finalizar ってのがいてその処理があるので termine 待ちになっている。 そこを調査するなり、強制的に finalizar が走らないようにする。
finalizar について
以下がわかりやすいかなと思います。
Extend the Kubernetes API with CustomResourceDefinitions - Kubernetes
Finalizers allow controllers to implement asynchronous pre-delete hooks. Let’s say you create an external resource (such as a storage bucket) for each object of your API type, and you want to delete the associated external resource on object’s deletion from Kubernetes, you can use a finalizer to do that.
もうちょっと深くしりたいよって人は以下を見ると内部の話が乗ってます。 delete を完了するに kuberenetes の外部にある依存性しているリソースを消したい時につかうものです。
Using Finalizers - The Kubebuilder Book
削除方法
強制的に消す方法です。
$ kubectl get ns NAME STATUS AGE default Active 25d kube-public Active 25d kube-system Active 25d test Terminating 5d
$ kubectl get ns test -o json > tmp.json
finalizers に記載されている箇所を消す。
"spec": { "finalizers": [ ] },
これなんですけど、処理が終わらないダミーの finalizer が記載されていたりするとずっと終わらないです。 なので、このように強制的に消す必要が出てくる場合があります。
FIELDS: finalizers <[]string> Finalizers is an opaque list of values that must be empty to permanently remove object from storage. More info: https://kubernetes.io/docs/tasks/administer-cluster/namespaces/
消し方の続きです。master node で以下を叩きます。
$ kubectl proxy Starting to serve on 127.0.0.1:8001
で、先ほど作った tmp.json で上書きます
$ curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json http://127.0.0.1:8001/api/v1/namespaces/test/finalize
そうすると消えているはずです。
$ kubectl get ns NAME STATUS AGE default Active 25d kube-public Active 25d kube-system Active 25d
その他
crd が消えないとかもありました。同様に finalizer を対処すれば強制的に消せます。 本来、finalizer の指定が間違っているとか、処理が終わらないのはどこで詰まっているんだろうとか調べた方がいいですが。
$ kubectl edit crd tests.test.io
最後に kubernetes を勉強する上でのオススメ本を一冊だけ紹介しておきます。
Kubernetes完全ガイド (impress top gear)
- 作者: 青山真也
- 出版社/メーカー: インプレス
- 発売日: 2018/09/21
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
シェアして頂けると嬉しいです。
参考になったという方がいれば是非お願いしますm(_ _ )m
モチベーション維持の観点で非常に励みになります。