Kubernetes’te PersistentVolume Snapshot ile Yedek Alma ve Geri Yükleme

Kubernetes’te PersistentVolume Snapshot ile Yedek Alma ve Geri Yükleme

Kubernetes’te çalışan uygulamalar verilerini genelde PersistentVolumeClaim (PVC) ile saklar. Özellikle veritabanı gibi durumlarda bu veriler oldukça kritik hale gelir. İşte tam bu noktada, verileri herhangi bir ek yedekleme yazılımına ihtiyaç duymadan, Kubernetes'in sunduğu snapshot desteğiyle yedekleyebiliriz.

Bu yazıda, bir PVC’nin nasıl yedekleneceğini ve daha sonra bu yedeğin nasıl yeni bir namespace altında geri yükleneceğini göstereceğim. Velero gibi harici çözümler yok, sadece Kubernetes’in kendi kaynaklarıyla ilerleyeceğiz.


1. Snapshot Özelliği Var mı? Kontrol Edelim

İlk olarak cluster’ımızda snapshot özelliği etkin mi diye kontrol edelim:

kubectl api-resources | grep volumesnapshot

Eğer aşağıdaki gibi bir çıktı alıyorsanız devam edebiliriz:

volumesnapshots                       snapshot.storage.k8s.io       true         VolumeSnapshot
volumesnapshotcontents               snapshot.storage.k8s.io       false        VolumeSnapshotContent
volumesnapshotclasses                snapshot.storage.k8s.io       false        VolumeSnapshotClass

Eğer hiçbiri görünmüyorsa, snapshot desteği yüklü değildir. Kurmamız gerekir.


2. Snapshot Controller Kurulumu (Kustomize ile)

Eğer snapshot kaynakları yoksa, aşağıdaki adımlarla en güncel snapshot bileşenlerini cluster’a kurabilirsin.

a) Snapshot bileşenlerini klonlayalım

git clone --branch v8.2.0 --single-branch https://github.com/kubernetes-csi/external-snapshotter.git
cd external-snapshotter

b) CRD’leri yükleyelim

kubectl kustomize client/config/crd | kubectl create -f -

c) Snapshot Controller’ı yükleyelim

kubectl -n kube-system kustomize deploy/kubernetes/snapshot-controller | kubectl create -f -

d) Kontrol edelim

kubectl get pods -n kube-system | grep snapshot

Eğer snapshot-controller pod’u Running durumundaysa her şey hazır.


3. VolumeSnapshotClass Tanımlayalım

Snapshot işleminin nasıl yapılacağını belirleyen sınıfı tanımlıyoruz.

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
  name: csi-snapshot-class
driver: csi-hostpath-driver  # <-- Kendi CSI driver'ını buraya yaz
deletionPolicy: Retain       # "Retain" veya "Delete"
kubectl apply -f volumesnapshotclass.yaml
⚠️ driver kısmı senin storage altyapına göre değişebilir:
AWS kullanıyorsan: ebs.csi.aws.com,
Longhorn kullanıyorsan: driver.longhorn.io,
Ceph/Rook için: rook-ceph.rbd.csi.ceph.com gibi.

4. PVC’den Snapshot Alalım

Şimdi default namespace'inde bulunan bir PVC’yi yedekleyeceğiz.

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: my-pvc-snapshot
  namespace: default  # <-- PVC hangi namespace'teyse
spec:
  volumeSnapshotClassName: csi-snapshot-class
  source:
    persistentVolumeClaimName: my-app-pvc  # <-- Yedek alınacak PVC adı
kubectl apply -f volumesnapshot.yaml

Snapshot durumunu kontrol edelim:

kubectl get volumesnapshot -n default

ReadyToUse: true olduğunda snapshot hazırdır.


5. Snapshot’tan Yeni PVC Oluştur (Yeni Namespace)

Yedeğimizi farklı bir namespace’e geri yükleyeceğiz.

a) Yeni bir namespace oluşturalım:

kubectl create namespace restore-test

b) Snapshot’tan yeni PVC oluşturalım:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: restored-pvc
  namespace: restore-test
spec:
  storageClassName: csi-hostpath-sc  # <-- Orijinal PVC’nin storageClass’ı
  dataSource:
    name: my-pvc-snapshot            # <-- Snapshot ismi
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi  # <-- Snapshot boyutundan büyük olmasın
kubectl apply -f restored-pvc.yaml

PVC Bound olduğunda kullanılabilir.


6. Geri Yüklenen PVC’yi Test Edelim

Veri gerçekten gelmiş mi bakalım. Basit bir busybox pod’u çalıştıralım:

apiVersion: v1
kind: Pod
metadata:
  name: snapshot-checker
  namespace: restore-test
spec:
  containers:
  - name: busybox
    image: busybox
    command: [ "sleep", "3600" ]
    volumeMounts:
    - mountPath: /data
      name: restore-vol
  volumes:
  - name: restore-vol
    persistentVolumeClaim:
      claimName: restored-pvc
kubectl apply -f snapshot-checker.yaml
kubectl exec -it snapshot-checker -n restore-test -- sh

İçerideyken:

ls /data

Eğer orijinal PVC’de ne varsa burada da aynılarını görüyorsan geri yükleme başarılı demektir.


Özelleştirme Yapabileceğiniz Alanlar

YAML Alanı Açıklama
driver Kullandığınız CSI driver adı
storageClassName PVC’nin bağlı olduğu storage sınıfı
persistentVolumeClaimName Yedek alınacak PVC adı
volumeSnapshotClassName Snapshot alma ayarını tanımlayan sınıf
namespace Snapshot alma ve restore namespace’leri

Kubernetes’in CSI destekli snapshot özelliği sayesinde verilerinizi harici çözümlere gerek kalmadan kolayca yedekleyebilir ve geri yükleyebilirsiniz. Geri yükleme işlemini farklı namespace altında yapmak da olası test ve migration senaryolarında büyük kolaylık sağlar.

Read more

Systemd ile Kendi Servisini Yaz: Flask ve Yedekleme Script’i Üzerinden Uygulamalı Rehber

Systemd ile Kendi Servisini Yaz: Flask ve Yedekleme Script’i Üzerinden Uygulamalı Rehber

Linux’ta çalışan bir script ya da uygulamayı sürekli aktif halde tutmak, hata durumunda yeniden başlatmak veya sistemi yeniden başlattığınızda otomatik olarak ayağa kaldırmak istiyorsanız systemd tam aradığınız şey. Bu rehberde hem bir Flask uygulamasını, hem de günlük çalışan basit bir yedekleme script’ini systemd servislerine dönüştüreceğiz. Gereksiz terimler yok,