İçeriğe geç
Velero ile Kubernetes Yedekleme ve Felaket Kurtarma Kurulumu

Velero ile Kubernetes Yedekleme ve Felaket Kurtarma Kurulumu

5 dk okuma DevOps

Velero, Kubernetes cluster'ları için açık kaynaklı bir yedekleme ve felaket kurtarma aracıdır. Eski adıyla Heptio Ark olarak bilinen bu proje, cluster içindeki tüm kaynakların (deployment, service, configmap, secret, pv/pvc gibi) yedeklenmesini ve gerektiğinde geri yüklenmesini sağlar. Özellikle multi-cluster ortamlarda ve kritik altyapılarda standart bir yedekleme çözümü olarak yaygın kullanılır. Her Velero işlemi (backup, schedule, restore) birer Kubernetes custom resource olarak tanımlanır ve etcd üzerinde saklanır; Velero içindeki controller'lar bu nesneleri izleyip ilgili işlemleri koşturur.

Object storage hazırlığı

Kurulum sürecine geçmeden önce storage backend hazırlığı yapılmalıdır. Velero, yedekleri saklamak için bir object storage servisi bekler. AWS S3, Azure Blob Storage, Google Cloud Storage veya MinIO gibi birçok seçenek kullanılabilir. MinIO, test ortamları ve on-prem kurulumlar için popüler bir tercihtir çünkü S3 uyumlu API sayesinde Velero tarafında ek bir plugin gerektirmeden çalışır. Üretim ortamı için cloud provider sunucularının native storage servisleri tercih edilmelidir.

Velero CLI kurulumu

Öncelikle velero client kurulumu ile başlanır. Linux sistemlerde aşağıdaki komut ile indirilir:

curl -L https://github.com/vmware-tanzu/velero/releases/download/v1.14.0/velero-v1.14.0-linux-amd64.tar.gz -o velero.tar.gz
tar -xzf velero.tar.gz
sudo mv velero-v1.14.0-linux-amd64/velero /usr/local/bin/velero
rm -rf velero-v1.14.0-linux-amd64 velero.tar.gz

Versiyon numarası değiştirilerek farklı sürümler de kurulabilir; dağıtım sayfasındaki asset adı bu formata uyar. Kurulum sonrasında velero version komutu ile doğrulama yapılır.

Credential dosyası ve server kurulumu

AWS S3 kullanılacaksa IAM üzerinden programmatic erişim izni olan bir user oluşturulur ve access key bilgileri bir credential dosyasına yazılır. Velero bu dosyayı kurulum sırasında cluster içindeki bir secret olarak kendisi oluşturur, ayrıca elle base64 encode etmeye gerek yoktur:

[default]
aws_access_key_id = YOUR_ACCESS_KEY_ID
aws_secret_access_key = YOUR_SECRET_ACCESS_KEY

Velero server, kendi namespace içinde çalışan bir deployment olarak kurulur. Aşağıdaki komut AWS S3 bucket kullanarak kurulum yapar:

velero install \
    --provider aws \
    --plugins velero/velero-plugin-for-aws:v1.14.0 \
    --bucket velero-backups \
    --secret-file ./credentials-velero \
    --backup-location-config region=us-east-1 \
    --snapshot-location-config region=us-east-1 \
    --namespace velero

MinIO gibi S3 uyumlu bir servis kullanılıyorsa region=minio,s3ForcePathStyle=true,s3Url=http://minio.velero.svc:9000 şeklinde bir backup-location-config ile endpoint adresi verilir ve snapshot tarafı --use-volume-snapshots=false ile kapatılır. Dosya seviyesinde volume yedeği isteniyorsa kurulumuna --use-node-agent flag'i eklenir; bu, nodeagent daemonsetini devreye alır ve --default-volumes-to-fs-backup ile tüm PVC verileri dosya sistemi yedeğine dahil edilir. Kurulum birkaç dakika sürer, kubectl get pods -n velero komutu ile pod durumları kontrol edilir.

İlk yedek ve zamanlanmış çalışma

İlk yedek oluşturmak için velero backup create ilk-yedek --include-namespaces default komutu kullanılır. Bu komut default namespace içindeki tüm kaynakları yedekler. Belirli bir deployment veya service seçilecekse --selector parametresi ile filtreleme yapılır. Yedekleme durumu velero backup get ile görüntülenir. Volume snapshotları varsayılan olarak alınır; bunu kapatmak için --snapshot-volumes=false belirtilir.

Zamanlanmış yedekleme için schedule oluşturulur:

velero schedule create gunluk-yedek \
    --schedule="0 2 * * *" \
    --include-namespaces default,kube-system \
    --ttl 720h

Bu komut her gün saat 02:00'de yedek alır ve 30 gün (720 saat) sonra eski yedekleri otomatik siler. TTL verilmezse varsayılan değer zaten 30 gündür; süre dolduğunda backup kaynağı, object storage daki dosya, volume snapshotları ve ilişkili restore kayıtları birlikte temizlenir.

Felaket sonrası geri yükleme

Felaket kurtarma senaryosunda yedekten geri yükleme yapılır:

velero restore create --from-backup ilk-yedek

Velero default davranış olarak yıkıcı olmayan bir restore uygular; hedef clusterda aynı isimde kaynak varsa o kaynağı atlar, üzerine yazmaz. Var olan kaynakların backup ile eşitlenmesi isteniyorsa --existing-resource-policy=update belirtilir. Service nesnelerinde otomatik atanan nodeportlar restore sırasında yeniden atanır; orijinal portların korunması gerekiyorsa --preserve-nodeports flag'i kullanılır. Bu flag port aralığı farklı ya da port dolu olan bir hedef clusterda çakışma hatası üretebilir, restore devam eder ama ilgili service yine de oluşmayabilir.

Volume tarafında snapshotlardan geri dönüş için velero restore create komutuna --restore-volumes verilir. Bunun çalışabilmesi için yedeğin alındığı storage providerın snapshot desteği olmalıdır; snapshot alınamayan ortamlarda dosya sistemi yedeği (nodeagent ile restic veya kopia) kullanılır.

Clusterlar arası taşıma

Velero'nun en güçlü yanlarından biri cluster'lar arası yedek taşıma imkanıdır. Bir clusterda oluşturulan yedek, farklı bir cluster'a taşınabilir. Velero object storage'ı doğruluk kaynağı olarak görür: bucketta düzgün formatta duran bir yedek dosyası varsa ama hedef clusterda karşılığı yoksa, bilgi object storage üzerinden Kubernetes API sine senkronize edilir. Yeni clustera Velero kurulup aynı bucket gösterildiğinde yedekler orada görünür hale gelir ve restore edilebilir.

Birkaç pratik not: Velero etcd veritabanını yedeklemez, Kubernetes API nesnelerini yedekler. Etcd snapshotı için kubeadm gibi araçlarla ayrıca işlem yapmak gerekir. Yedek alma anında yaratılan ya da düzenlenen nesneler yedeğe düşmeyebilir; cluster yedekleri kesin olarak atomik değildir. Restore sırasında pod zaman aşımı, nodeport çakışması gibi hatalar restore loglarına velero restore logs ile bakılarak incelenmeli, schedule saatleri de yoğunluk dışında seçilmelidir.