k8sのPersistentVolume(PV)を削除したときに、ステータスがTerminatingのままで削除できない問題に直面したので、対象方法を紹介します。
目次
発生していた問題
pvを削除しようと(kubectl delete pv postgres-pvc-test-postgres-sts-0)を行い、しばらくまっても下記コマンドを実行したところ”Terminationg”のままになっていたという現象が発生していました。
$kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-7b5f1f81-091d-467f-b1cc-4ddc14cb1527 3Gi RWO Delete Terminating stage/postgres-pvc-test-postgres-sts-0 standard 22m
describeで確認すると
$kubectl describe pv Name: pvc-7b5f1f81-091d-467f-b1cc-4ddc14cb1527 Labels: Annotations: kubernetes.io/createdby: hostpath-dynamic-provisioner pv.kubernetes.io/bound-by-controller: yes pv.kubernetes.io/provisioned-by: kubernetes.io/host-path Finalizers: [kubernetes.io/pv-protection] StorageClass: standard Status: Terminating (lasts 20m) 〜省略〜
Finalizersに”pv-protection”という処理が実行されるようになっています。
Finalizer
Custom Resource Contollerなどを作ったことがある人には、馴染みがあるかもしれませんが、Finalizerはオブジェクト削除前の処理を定義します。今回は、”kubernetes.io/pv-protection”を行うようになるのですが、ここでpvが保護されているという状況になっていたとうことです。
対処方法としては、保護設定をはずしてあげればよいということになります。コマンド例としては、下記のようになります。
$kubectl patch pv pvc-7b5f1f81-091d-467f-b1cc-4ddc14cb1527 -p '{"metadata":{"finalizers":null}}'
まとめ
pvcやpvなどは、Finalizerで保護されていることがあるので、そのあたりを見直してみてください。お疲れ様でした。