Rook を構築した時、rook-ceph
という namespace が消えなくなってしまいしました。
$ kubectl get ns rook-ceph
NAME STATUS AGE
rook-ceph Terminating 2d
このときの対処法を紹介します。
etcd のコンテナーに入って無理やり削除しました。 中身を見てみると、関連するリソースが残っていたみたいで、これが原因でnamespaceが削除されなかったみたいです。
$ kubectl exec -n kube-system -it etcd-tb1 -- sh
#
# export ETCDCTL_API=3
#
# etcdctl get / --prefix --keys-only | grep rook
/registry/apiextensions.k8s.io/customresourcedefinitions/cephclusters.ceph.rook.io
/registry/apiregistration.k8s.io/apiservices/v1.ceph.rook.io
/registry/ceph.rook.io/cephclusters/rook-ceph/rook-ceph
/registry/csidrivers/rook-ceph.cephfs.csi.ceph.com
/registry/csidrivers/rook-ceph.rbd.csi.ceph.com
/registry/namespaces/rook-ceph
/registry/storageclasses/rook-cephfs
#
# etcdctl get / --prefix --keys-only | grep rook | xargs etcdctl del {}
Error: del command needs one argument as key and an optional argument as range_end
#
# for registry in $(etcdctl get / --prefix --keys-only | grep rook);do etcdctl del $registry;done
1
0
1
1
1
1
1
# etcdctl get / --prefix --keys-only | grep rook
#
xargs
コマンドは使用できなかったので、forで一括削除しました。
無事にnamespaceも消えていました。
kubectl get ns rook-ceph
Error from server (NotFound): namespaces "rook-ceph" not found
cert-manager の公式ドキュメントにも似たような記述がありました。
cert-managerインストールを削除せずにネームスペースを削除するようにマークした場合、ネームスペースが終了状態で立ち往生することがあります。これは通常、APIService リソースはまだ存在するが、Webhook が実行されていないため、到達できなくなることが原因です。この問題を解決するには、上記のコマンドを正しく実行したことを確認し、それでも問題が発生する場合は、次のコマンドを実行します。
kubectl delete apiservice v1beta1.webhook.cert-manager.io
namespace のみを削除した場合、APIService
が残っていることが原因で Terminating 状態のまま namespace が消えないようです。
作成されるリソースは把握しておくことが大事です。