Menyiapkan rencana pemulihan saat klaster hilang: strategi backup dengan Git sebagai sumber kebenaran, backup state klaster dengan Velero, snapshot etcd, ekspor konfigurasi Flux, prosedur rebuild klaster dan re-bootstrap, hingga latihan disaster recovery dengan target RTO dan RPO yang terukur.

Di episode 25 kalian sudah membangun observability penuh untuk Flux — metrik, dashboard, log, tracing, dan alerting. Kalian bisa melihat semuanya dan tahu persis kapan sesuatu mulai bermasalah. Namun ada satu pertanyaan yang belum dijawab: apa yang terjadi ketika semuanya hilang? Sebuah klaster bisa hancur oleh kesalahan konfigurasi, bencana di region cloud, atau penghapusan yang tidak disengaja.
Ini saatnya jujur terhadap diri sendiri: observability tidak menyelamatkan data. Semua dashboard dan alert yang indah itu tidak ada artinya jika tidak ada rencana untuk membangun kembali dari nol. Tim yang hanya fokus pada monitoring tanpa persiapan disaster recovery (DR) akan menghabiskan insiden berikutnya dengan panik mencari tahu langkah mana yang harus dijalankan.
Pada episode ini kita akan menyusun strategi DR yang nyata untuk stack Flux: strategi backup dengan Git, Velero, dan snapshot etcd, backup konfigurasi Flux secara spesifik, prosedur rebuild klaster dari nol hingga aplikasi berjalan, serta pengujian DR yang terukur dengan RTO dan RPO. Karena rencana yang tidak pernah diuji hanyalah sekumpulan tulisan.
Keunggulan terbesar GitOps adalah ia membuat infrastruktur mudah dibackup secara intrinsik. Semua manifest — Kustomization, GitRepository, HelmRelease, dan konfigurasi lain — hidup di repository Git. Selama repository aman, definisi infrastruktur tidak pernah hilang. Ini membuat Git sendiri menjadi lapisan backup pertama yang paling murah dan paling mudah diverifikasi: cukup pastikan repo di-push dan punya riwayat yang benar.
Namun Git bukan segalanya. Git menyimpan keinginan (desired state), bukan kenyataan (actual state). State ephemeral — seperti data aplikasi, Secret yang tidak di-commit, dan resource yang dibuat dinamis — tidak ada di Git. Itulah mengapa Git sebagai backup harus dilengkapi lapisan lain.
Velero adalah tool standard untuk membackup state klaster Kubernetes. Velero membuat snapshot resource Kubernetes (dan opsional volume) ke storage eksternal seperti S3 atau GCS. Backup dibuat dalam beberapa langkah:
velero install --provider aws --bucket gitops-backups \
--backup-location-config region=ap-southeast-1
velero backup create full-backup \
--include-namespaces default,payments,checkoutBackup Velero menyimpan objek Kubernetes beserta konten volume jika dikonfigurasi. Untuk memulihkan, satu perintah saja:
velero restore create --from-backup full-backupVelero cocok untuk memulihkan resource yang tidak ada di Git — misalnya Secret yang dibuat secara imperatif atau resource dari operator lain. Pastikan jadwal backup otomatis dibuat, bukan manual:
velero schedule create daily-backup --schedule "0 2 * * *" \
--include-namespaces default,payments,checkoutetcd adalah database kontrol plane Kubernetes — tempat menyimpan semua objek klaster. Snapshot etcd adalah lapisan paling dalam: jika etcd rusak, seluruh klaster bisa mati. Untuk klaster yang dikelola sendiri, ambil snapshot etcd secara berkala:
ETCDCTL_API=3 etcdctl \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
snapshot save /backup/etcd-snapshot.dbPerhatikan bahwa snapshot etcd memulihkan kondisi klaster ke titik waktu tertentu — termasuk resource yang sudah dihapus. Ini beda dengan Git yang selalu menuju desired state. Di banyak kasus, kombinasi yang sehat adalah snapshot etcd sebagai cadangan darurat dan Git sebagai kebenaran jangka panjang.
Warning
Snapshot etcd bukan pengganti backup aplikasi. Memulihkan snapshot etcd bisa mengembalikan state yang sudah "ketinggalan zaman" dibanding Git, dan setelah restore Flux akan segera mereconcile kembali ke desired state Git. Pastikan urutan restore dipikirkan agar reconciliation tidak menghapus data yang baru.
Kadang yang dibutuhkan bukan backup penuh, melainkan ekspor konfigurasi saat ini. kubectl get dengan opsi export bisa menangkap konfigurasi resource tertentu untuk disimpan sebagai catatan. Ini berguna sebagai snapshot dokumentasi, tetapi jangan dijadikan satu-satunya strategi — ekspor manual mudah terlupakan dan tidak konsisten.
Flux menyediakan perintah khusus untuk mengekspor seluruh konfigurasi Flux dari klaster:
flux export > flux-export.yamlflux export menghasilkan semua custom resource Flux — Kustomization, GitRepository, HelmRelease, Provider, Alert, dan lainnya — dalam satu file YAML. Ini adalah cara tercepat untuk menangkap "siapa yang mereconcile apa" sebelum klaster berubah atau hilang. Jalankan secara berkala dan simpan outputnya ke lokasi yang aman di luar klaster.
Repository GitOps itu sendiri adalah aset paling berharga. Backup-nya berarti memastikan:
Untuk repository self-hosted atau mirror lokal, jadwalkan backup berkala:
git clone --mirror \
https://github.com/devvnull/gitops-production.git \
/backup/gitops-production.gitClone mirror menyimpan seluruh referensi dan riwayat — bahkan branch yang tidak aktif — sehingga bisa memulihkan repository meskipun remote utama hilang.
Secret adalah bagian yang paling sulit dibackup: menyimpannya dalam teks biasa di Git adalah pelanggaran prinsip GitOps. Solusinya adalah enkripsi — seperti yang sudah kalian pelajari di episode SOPS dan Sealed Secrets. Pola yang benar:
Aturan emasnya: kunci dan data terenkripsi jangan pernah disimpan di tempat yang sama. Jika keduanya hilang bersama, enkripsi tidak lagi berguna.
Important
Latih skenario "kunci hilang" dalam latihan DR. Enkripsi yang kuncinya tidak bisa dipulihkan sama saja dengan data yang tidak pernah dibackup — bedanya, ia memberi rasa aman palsu.
Disaster recovery dimulai dari asumsi paling buruk: klaster tidak bisa diselamatkan dan harus dibangun baru. Prosedur rebuild yang baik adalah urutan langkah yang terdokumentasi dan berulang:
Urutan ini penting: Flux harus reconcile dulu sebelum restore Velero, agar tidak menimpa desired state Git dengan state lama.
Re-bootstrap Flux ke klaster baru adalah langkah yang harus berjalan mulus jika repository GitOps dirawat dengan benar:
flux bootstrap github \
--owner=devvnull \
--repository=gitops-production \
--branch=main \
--path=clusters/productionBootstrap membaca Kustomization dari clusters/production/flux-system dan selanjutnya mereconcile semua yang dirujuk. Selama struktur repo konsisten dan secret yang dirujuk (misal webhook token) tersedia, klaster akan terbangun dengan sendirinya.
Tip
Dokumenkan variabel bootstrap di README repository GitOps: owner, repo, branch, dan path untuk setiap environment. Saat klaster hancur, hal terakhir yang ingin kalian lakukan adalah menebak-nebak nilai flag bootstrap di tengah panik.
Setelah Flux berjalan, aplikasi di-restore dalam dua aliran. Aliran pertama dari Git: manifest aplikasi langsung di-deploy oleh Flux. Aliran kedua dari backup: state yang tidak ada di Git, terutama data di volume dan Secret. Kombinasi keduanya adalah alasan mengapa strategi backup ganda (Git + Velero) diperlukan.
Saat restore, perhatikan urutan dependensi: database harus pulih sebelum aplikasi yang bergantung padanya dianggap sehat. Gunakan flux get kustomization untuk memantau urutan reconciliation dan pastikan semuanya mencapai status Ready:
flux get kustomization -A
kubectl get pods -A | grep -v RunningSetelah restore, klaster mungkin memiliki perbedaan antara state Git dan state hasil restore. Flux akan segera mereconcile perbedaan ini — kadang hal itu tidak diinginkan. Misalnya, restore Velero yang mengembalikan resource lama bisa langsung di-overwrite oleh Flux menuju desired state Git, atau sebaliknya.
Kunci untuk menghindari konflik: suspend Kustomization sementara saat restore, lalu resume setelah state selesai dipulihkan:
flux suspend kustomization apps
velero restore create --from-backup full-backup
flux resume kustomization appsIni memberi kontrol penuh: restore data dulu, baru biarkan Flux menyesuaikan konfigurasi menuju desired state.
Rencana DR yang tidak pernah diuji adalah teks belaka. Latihan DR adalah ujian nyata terhadap prosedur rebuild: buat klaster baru, jalankan seluruh prosedur dari nol, dan ukur berapa lama waktu yang dibutuhkan. Jadwalkan latihan berkala — misalnya kuartalan — dengan cakupan yang naik bertahap: dari hanya memulihkan Flux, menjadi memulihkan Flux plus aplikasi, hingga memulihkan aplikasi plus data.
Hasil latihan selalu membawa temuan: flag bootstrap yang terlupakan, secret yang tidak tersedia, atau langkah yang urutannya salah. Setiap temuan harus diperbaiki di prosedur dan diujikan lagi di latihan berikutnya.
Dua metrik yang membuat DR terukur:
Hubungan keduanya dengan strategi:
| Target | Strategi yang cocok |
|---|---|
| RTO pendek, RPO pendek | Backup Velero sering + snapshot volume + runbook otomatis |
| RTO menengah, RPO menengah | Git + Velero harian + prosedur semi-manual |
| RTO panjang, RPO panjang | Git saja + dokumentasi rebuild |
Tentukan target yang realistis berdasarkan dampak bisnis, lalu ukur latihan terhadap target tersebut.
Semakin banyak langkah yang otomatis, semakin sedikit kesalahan manusia saat panik. Otomasi untuk DR bisa berupa:
Contoh skrip sederhana yang menggabungkan bootstrap dan verifikasi:
flux bootstrap github \
--owner=devvnull \
--repository=gitops-production \
--branch=main \
--path=clusters/production \
--timeout=15m
flux get kustomization -A --wait
flux tree kustomization flux-system --namespaces=flux-systemflux get kustomization --wait menunggu semua resource siap; flux tree menampilkan struktur dependency. Skrip yang sama bisa dijadikan dasar latihan DR dan verifikasi produksi.
Pada episode 26 ini kalian telah menyusun strategi disaster recovery untuk stack Flux: Git sebagai backup infrastruktur yang paling murah, Velero untuk state klaster dan volume, snapshot etcd sebagai lapisan terdalam, ekspor dan backup konfigurasi Flux termasuk Secret terenkripsi, prosedur rebuild klaster dengan re-bootstrap dan restorasi aplikasi, serta pengujian DR yang diukur dengan RTO dan RPO.
Inti yang harus dibawa pulang:
flux export dan pastikan repository GitOps punya mirror.Sekarang klaster kalian bisa dipulihkan kapan pun. Namun siklus hidup tidak berhenti di deployment manual — saatnya menghubungkan semuanya dengan pipeline. Di episode 27 selanjutnya kita akan membahas CI/CD Pipeline Integration — memisahkan tanggung jawab CI dan CD, membangun pipeline dari checkout hingga security scanning, menghubungkan CD ke GitOps, dan integrasi dengan GitHub Actions, GitLab CI/CD, serta Jenkins. Pastikan tetap semangat!