問題
Namespace を消そうとしてもコマンドが終わらないってこと、たまにありますよね。
$ kubectl delete ns vault
namespace "vault" deleted
...
今回は、「ファイナライザを削除して Namespace を強制削除する卍」といった方法はとりたくない環境だったので、ちゃんと原因を特定してみました。
状況
消えない Namespace の状態を確認すると、Terminating で止まっていました。
$ kubectl get ns vault
NAME STATUS AGE
vault Terminating 76d
解決方法
Kubernetes で Namespace 内に存在するすべての種類のリソースを取得する魔法のようなワンライナーがあるらしいので使ってみます。
$ kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get -n vault
No resources found in vault namespace.
...
No resources found in vault namespace.
NAME STORE REFRESH INTERVAL STATUS READY
vault-eso-test vault-backend-k8s-auth 15s SecretSyncedError False
No resources found in vault namespace.
...
No resources found in vault namespace.
どうやらこのリソースが残ってしまっているみたいでした。
NAME STORE REFRESH INTERVAL STATUS READY
vault-eso-test vault-backend-k8s-auth 15s SecretSyncedError False
消してみる。
$ kubectl delete ExternalSecret vault-eso-test
Error from server (InternalError): Internal error occurred: failed calling webhook "validate.externalsecret.external-secrets.io": failed to call webhook: Post "https://external-secrets-webhook.vault.svc:443/validate-external-secrets-io-v1beta1-externalsecret?timeout=5s": service "external-secrets-webhook" not found
うーん消せない...
どうやら、「Webhook がもう存在しないのに、それを参照してるリソースが残ってる」らしいので、Webhook一覧を見てみます。
$ kubectl get validatingwebhookconfigurations --all-namespaces
NAME WEBHOOKS AGE
externalsecret-validate 1 76d
xxx 1 448d
xxx 9 451d
xxx 1 451d
xxx 1 451d
secretstore-validate 2 76d
怪しそうなWebhookが2つほどありました。
まずは、エラーメッセージに出ている「externalsecret-validate」を消してみます。
$ kubectl delete validatingwebhookconfiguration externalsecret-validate
validatingwebhookconfiguration.admissionregistration.k8s.io "externalsecret-validate" deleted
お、リソースが消せました!
$ kubectl delete ExternalSecret vault-eso-test
externalsecret.external-secrets.io "vault-eso-test" deleted
でも、Namespace は Termination のままでした...
なので「secretstore-validate」も消してみます。
$ kubectl delete validatingwebhookconfigurations secretstore-validate
validatingwebhookconfiguration.admissionregistration.k8s.io "secretstore-validate" deleted
削除後、Namespace を削除する途中で固まっていたシェルを確認すると、コマンドが終わっており Namespace も消えていました!
おわりに
今回は、カスタムリソース(Operator)をインストールしていた Namespace を削除しようしたら、うまくリソースを消せなかったことが原因で Namespace が Termination のまま止まっていました。そもそも、カスタムリソースをインストールすると CRD もインストールされると思いますが、CRD はクラスタスコープのリソースなので Namespace を消すだけでは消えないんですよね...
なので、カスタムリソースをどの Namespace にインストールしたかは、ちゃんとhelmfile等のコードに残して確認できるようにしておくことが大切と学びました。