Apa itu Finalizer di Kubernetes? Cara Menangani Penghapusan

Penghapusan objek Kubernetes tidak sesederhana yang terlihat di permukaan. Penghapusan objek adalah proses yang terlibat yang mencakup pemeriksaan bersyarat untuk menentukan apakah penghapusan yang aman mungkin dilakukan. Ini dicapai oleh objek API yang disebut Finalizers.

Dalam artikel ini, kita akan melihat apa itu Finalizer, bagaimana mereka dikelola, dan tantangan yang dapat ditimbulkannya saat Anda ingin menghapus sesuatu. Memiliki pemahaman yang lebih baik tentang proses penghapusan akan membantu Anda men-debug masalah di mana sumber daya tampaknya tidak selesai tepat waktu.

Apa itu Finalizer?

Finalizer adalah mekanisme untuk menegakkan kondisi tertentu yang harus dipenuhi sebelum objek dihapus. Saat Anda menjalankan perintah seperti kubectl delete namespace/example, Kubernetes mengevaluasi Finalizer yang ditentukan pada objek yang direferensikan. Mereka terdaftar di dalamnya metadata.finalizers bidang. Setiap Finalizer mendapat kesempatan untuk menunda penghapusan sampai menyelesaikan tindakannya.

Proses penghapusan yang sebenarnya berakhir seperti ini:

  1. Mengeluarkan perintah penghapusan. – Kubernetes menandai objek sebagai penghapusan yang tertunda. Ini meninggalkan sumber daya dalam status “Penghentian” hanya-baca.
  2. Jalankan setiap tindakan yang terkait dengan Finalizers objek. – Setiap kali tindakan Finalizer selesai, Finalizer itu terlepas dari objek, sehingga tidak lagi muncul di metadata.finalizers bidang.
  3. Kubernetes melacak Finalizer yang dilampirkan ke objek. – Objek akan dihapus ketika metadata.finalizers bidang kosong, karena semua Finalizer telah dihapus dengan menyelesaikan tindakan mereka.

Finalizer biasanya digunakan untuk menjalankan prosedur pembersihan dan pengumpulan sampah sebelum menghapus objek dari cluster. Anda dapat menambahkan Finalizer Anda sendiri menggunakan Kubernetes API; Finalizer bawaan juga secara otomatis diterapkan ke beberapa tipe objek.

Sebagai contoh, sumber daya PersistentVolume mencakup a kubernetes.io/pv-protection Finalizer yang mencegah penghapusan volume yang digunakan secara aktif oleh Pod secara tidak sengaja. Finalizer memberlakukan bahwa PersistentVolume tidak dapat dihapus dari cluster sampai tidak ada Pod yang menggunakannya. Mengeluarkan perintah delete saat masih ada Pod yang aktif akan menyebabkan volume ditandai sebagai Terminating; itu akan tetap dalam status ini selama Pod membutuhkan volume, lalu secara otomatis menghapus sesegera mungkin setelahnya.

Tantangan Finalis

Finalizer yang berjalan lama menunggu kondisi yang melibatkan sumber daya lain dapat menyebabkan penghapusan muncul macet Terminating negara. Anda mungkin juga mengalami masalah saat Finalizer memblokir penghapusan objek dependen yang mencegah induk berhasil dihentikan.

Masalah-masalah ini secara teratur menyebabkan kebingungan – pengembang dan operator cenderung melihat penghapusan sebagai prosedur sederhana ketika proses sebenarnya bernuansa dan variabel. Persyaratan untuk penghapusan yang berhasil bergantung pada hubungan sumber daya dan Finalizernya, serta objek target itu sendiri.

Ketika sesuatu menjadi Terminating untuk waktu tambahan, periksa Finalizer-nya dengan memeriksa metadata.finalizers bidang di YAML-nya:

kubectl get pod example-pod --namespace example -o json | jq
 

 

Setelah mengetahui finalizer mana yang ditentukan, Anda dapat mulai mengidentifikasi finalizer yang kemungkinan akan memblokir penghapusan. Melihat peristiwa dan perubahan status objek dapat membantu proses debug dengan menunjukkan tindakan yang telah terjadi sejak perintah hapus dikeluarkan. Kondisi ditampilkan di YAML’s spec.status.conditions bidang; acara terlihat saat berjalan kubectl describe pod example-pod.

Anda dapat menghapus Finalizers objek secara manual dengan menambal spec.finalizers lapangan untuk null. Metode ini tidak boleh digunakan kecuali benar-benar diperlukan. Finalizer adalah perlindungan yang dimaksudkan untuk melindungi cluster Anda; menimpanya dapat menyebabkan objek yatim piatu dan rantai ketergantungan yang rusak.

kubectl patch pod example-pod -p '{"metadata: {"finalizers": null}}'

Kebijakan Kepemilikan dan Distribusi

Topik terkait adalah pemilik objek dan kebijakan propagasi penghapusan. Referensi pemilik mendefinisikan hubungan antar objek. Mereka digunakan untuk menghapus seluruh pohon objek ketika orang tua dihapus. Misalnya, jika Anda menghapus Deployment, Kubernetes juga harus menghancurkan Pod di dalam Deployment tersebut.

Referensi pemilik ditentukan oleh metadata.ownerReferences bidang dalam objek. Setiap referensi termasuk: kind dan name dari objek yang akan menjadi induk dari sumber daya saat ini.

Saat referensi pemilik digunakan, menghapus induk akan otomatis menghapus semua turunannya. Ini disebut penghapusan berjenjang. Dimungkinkan untuk menonaktifkan kaskade dengan menambahkan --cascade=orphan bendera di kubectl delete. Kubernetes akan mengizinkan anak-anak objek untuk tetap berada di cluster, membiarkan mereka tersedia tetapi yatim piatu.

Kubernetes juga mendukung berbagai penghapusan “kebijakan propagasi”. Ini menentukan apakah akan menghapus induk atau anaknya terlebih dahulu. Standarnya Foreground kebijakan menghapus anak-anak dan kemudian orang tua, memastikan bahwa tidak ada yang yatim piatu. Background membalikkan urutan sehingga orang tua dihapus terlebih dahulu. Aturan ketiga, Orphanmemberitahu Kubernetes untuk mengabaikan referensi pemilik sama sekali.

Itu kubectl delete perintah tidak mendukung aturan propagasi. Anda harus membuat permintaan API langsung jika ingin mengubah kebijakan untuk operasi penghapusan:

curl -X DELETE 
    localhost/api/v1/namespaces/default/deployments/example 
    -d '{"apiVersion": "v1", "kind": "DeleteOptions", "propagationPolicy": "Background"}'
    -H "Content-Type: application/json"

Finalizers dihormati ketika penghapusan disebarkan atau mengalir ke objek terkait. Dalam kasus Foreground aturan, ini berarti bahwa semua Finalizer di semua anak harus diselesaikan sebelum orang tua dapat dihentikan. Untuk Background kebijakan, anak-anak akan tetap hidup sampai Finalizer orang tua mereka selesai.

Implementasi Finalizer

Anda dapat mengimplementasikan Finalizer Anda sendiri menggunakan Kubernetes API dan Go SDK. Finalizer dibuat dengan mendaftarkan kait di Reconcile metode pengontrol.

Metode harus memeriksa apakah objek yang akan dinegosiasikan memiliki nilainya DeletionTimestamp bidang. Ini berarti sedang menunggu penghapusan dan aktif Terminating negara. Pilih pengidentifikasi untuk finalizer Anda dan periksa apakah objek menyertakan nilainya metadata.finalizers bidang. Jika ini terjadi, Anda harus menjalankan tindakan yang diperlukan dan kemudian menghapus Finalizer dari objek. Contoh implementasi disertakan dalam panduan Kubebuilder untuk menulis tipe objek Kubernetes Anda sendiri menggunakan CRD (definisi sumber daya khusus).

Finalizer selalu diimplementasikan sebagai kode dalam metode pengontrol. Itu metadata.finalizers fungsi bidang dalam kapasitas yang mirip dengan anotasi dan label, mencantumkan Finalizer untuk diterapkan ke objek itu tanpa secara langsung menentukan kode yang akan dieksekusi.

Kesimpulan

Finalizer mengontrol siklus hidup objek Kubernetes setelah penghapusan dimulai. Mereka digunakan untuk menegakkan pengumpulan sampah, memberi tahu pengontrol tentang penghapusan yang akan datang, dan mencegah penghapusan objek yang tidak disengaja yang masih direferensikan oleh sumber daya lain.

Karena Finalizers dapat memblokir penghapusan objek untuk jangka waktu yang lama, mereka adalah sumber umum frustrasi ketika tim operasi tidak mengerti mengapa sebuah objek “macet” pada finalisasi. Dalam situasi ini, yang terbaik adalah memeriksa sumber daya yang terpengaruh, melihat Finalizer mana yang aktif, dan memeriksa hubungan antar-objek yang mungkin memblokir dependensi. Menghapus Finalizer secara paksa harus menjadi pilihan terakhir Anda jika Anda perlu segera menghapus objek Finalizing atau Anda telah kehabisan semua opsi lainnya.

Leave a Comment

Your email address will not be published. Required fields are marked *