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で保護されていることがあるので、そのあたりを見直してみてください。お疲れ様でした。