case-dr

Yedek var mı? Geri yükleme provası yoksa yok

Kubernetes'te Velero, Longhorn disk yedeği ve etcd snapshot'larıyla üç katmanlı yedek kurmak ve asıl önemli adımı, geri yükleme provasını yapmak.

  • Kubernetes
  • Velero
  • Longhorn
  • etcd
  • felaket kurtarma

"Yedek var mı?" sorusunun en sık cevabı "var, kurulu"dur. Ama bir yedekleme aracının kurulu olması, yedek alındığı anlamına gelmez. Arayüzü yeşil görünen, lisansı olan ama tek bir yedekleme politikası tanımlanmamış kurulumlar şaşırtıcı derecede yaygındır.

Bu yazı, "kurulu" noktasından "bir namespace'i silip geri getirebiliyoruz" noktasına giden yolu anlatıyor.

1. Neyi kaybedebilirsiniz?

Kubernetes'te "yedek" tek bir şey değildir. Üç ayrı kayıp senaryosu vardır ve her biri ayrı bir yedek ister:

Kayıp Örnek Yedek
Kubernetes nesneleri Silinen bir namespace, bozulan bir ConfigMap Velero
Disk içeriği (PVC) Grafana, Loki ya da uygulama verisi Velero + Longhorn disk yedeği
Cluster'ın kendisi Bütün master'ların kaybı, etcd'ye yayılan hatalı işlem etcd snapshot

Veritabanları cluster dışındaysa onlar da ayrı bir katmandır (PostgreSQL için WAL arşivi ile zamana dönük geri dönüş, PITR).

2. Kurulum: üç katman, tek hedef

  • Velero, bütün Kubernetes nesnelerini yedekler ve disklerin CSI snapshot'ını tetikler.
  • Longhorn backup target, bu snapshot'ları S3 uyumlu bir depoya (MinIO) taşır. Velero'nun VolumeSnapshotClass'ı Longhorn'un yedek tipini (type: bak) kullanır.
  • RKE2 etcd snapshot'ları 12 saatte bir hem yerel diske hem S3'e yazılır.
apiVersion: velero.io/v1
kind: Schedule
metadata:
  name: velero-gunluk
  namespace: velero
spec:
  schedule: "0 2 * * *"      # her gece 02:00
  template:
    ttl: 336h0m0s            # 14 gün
    excludedNamespaces: [velero]
    snapshotMoveData: false

Yedek hedefi ayrı bir lokasyonda olmalı. Aynı veri merkezindeki bir disk, o veri merkezi gittiğinde işe yaramaz.

En az yetki

Her cluster'ın yedek kullanıcısı S3'te yalnız kendi klasörüne yazabilir. Bir cluster ele geçirilirse diğer cluster'ların yedeklerini silemez. Silme yetkisi sadece eski snapshot'ları temizlemesi gereken yere verilir.

3. Asıl iş: geri yükleme provası

Kurulumdan sonra yedek listesi dolmaya başlar ve herkes rahatlar. Ama bir yedeğin çalıştığını gösteren tek kanıt, ondan geri dönebilmektir.

Prova basit ve tekrarlanabilir olmalı:

# 1. Deneme namespace'i: küçük bir PVC ve içinde rastgele bir dosya
kubectl create ns velero-deneme
# ... PVC + pod, dosyanın md5'i not edilir

# 2. Yedek al
velero backup create deneme-1 --include-namespaces velero-deneme --wait

# 3. Namespace'i sil
kubectl delete ns velero-deneme

# 4. Geri yükle ve dosyanın md5'ini karşılaştır
velero restore create --from-backup deneme-1 --restore-volumes=true --wait

Dosyanın md5'i aynı çıktıysa iki katman (nesne + disk) birlikte çalışıyor demektir. Bu provayı her cluster'da ayrı ayrı yapın; bir cluster'da çalışması diğerinde çalışacağını göstermez.

4. Provada neler çıkabilir?

Prova yapılmasa görülmeyecek iki örnek:

  • Velero bellek limiti: Cluster'da çok sayıda özel kaynak (ör. güvenlik tarama raporları) birikirse Velero varsayılan bellek limitine takılıp OOM olabilir. Yedek "kurulu" görünür, ama o gece alınmamıştır. Yedek işlerinin sonucu için mutlaka alarm kurun.
  • Geri yükleme için gereken sırlar: etcd snapshot'ından dönmek için RKE2 server token'ı, şifreli Rancher yedeğinden dönmek için şifreleme anahtarı gerekir. Bunlar sunucunun dışında, parola kasasında durmalı. Sunucuyla birlikte kaybolan anahtar, yedeği de kullanılmaz yapar.

5. "Hangi yedek, hangi ihtiyaç" tablosu

Gece 03:00'te bir şey bozulduğunda kimse doküman okumak istemez. Devir dokümanına tek bir tablo koyun:

İhtiyaç Yedek Yol
Silinen namespace / deployment Velero (günlük) velero restore create --include-namespaces <ns>
Bir diskin içeriği Velero + Longhorn Aynı restore, --restore-volumes=true
Bütün cluster (etcd) etcd snapshot rke2 server --cluster-reset --cluster-reset-restore-path=<dosya>
"14:32'deki WHERE'siz DELETE" PostgreSQL PITR Ayrı sunucuya yedek + WAL oynatma

Henüz prova edilmemiş satırların yanına açıkça "prova edilmedi" yazın. Dürüst bir tablo, iyimser bir tablodan daha değerlidir.

Ders

Yedekleme aracı kurmak işin yarısı bile değildir. Politika, alarm, ayrı lokasyon, kasadaki anahtarlar ve en önemlisi düzenli geri yükleme provası. Provası yapılmamış yedek, sadece umut verir.

Kurum ve ortam bilgileri çıkarılmış, komut ve yapılandırma örnekleri genelleştirilmiştir. Kendi ortamınızda önce test edin.

Bu not, sitedeki vaka dosyalarından birinin uzun hâlidir. Taslağı Claude ile hazırlandı.

ls ~/notlar

Diğer notlar

Tüm notlar

Bir altyapı sorusu, proje ya da rota önerisi mi var?

En hızlı yol e-posta. Seyahatteysem bir sonraki Wi-Fi'da dönerim.

E-posta gönder