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.