Met VolumeSnapshots maak je een momentopname van een PersistentVolumeClaim (PVC) in je Kubernetes-cluster. Zo leg je de inhoud van een volume vast op een specifiek moment, bijvoorbeeld voordat je een applicatie-upgrade uitvoert of voordat je data wijzigt.
In deze handleiding leggen we uit wanneer je VolumeSnapshots gebruikt, wat de kosten zijn, hoe je een snapshot maakt en hoe je een snapshot herstelt naar een nieuwe PersistentVolumeClaim.
- VolumeSnapshots zijn beschikbaar voor volumes die via de TransIP CSI-driver worden aangemaakt, zoals volumes met StorageClass transip-fast-storage of transip-big-storage.
- Een restore overschrijft je bestaande volume niet. Kubernetes maakt een nieuwe PersistentVolumeClaim met de data uit de snapshot.
- VolumeSnapshots zijn handig als herstelpunt binnen je cluster, maar vervangen geen externe back-upstrategie voor disaster recovery.
- De prijs is €0,06 per 10 GB per maand. Een snapshot van 100 GB kost daarmee €0,60 per maand.
Voor je begint
Voor deze handleiding heb je het volgende nodig:
- Een Kubernetes-cluster met een bestaande PersistentVolumeClaim.
- kubectl met toegang tot je cluster.
- Een volume dat is aangemaakt met de TransIP CSI-driver. Gebruik hiervoor bijvoorbeeld de StorageClass transip-fast-storage of transip-big-storage.
Controleer eerst of VolumeSnapshots beschikbaar zijn in je cluster:
kubectl api-resources | grep -i volumesnapshotControleer daarna welke VolumeSnapshotClass beschikbaar is:
kubectl get volumesnapshotclassIn een TransIP Kubernetes-cluster gebruik je de VolumeSnapshotClass team-blue-k8s. Deze class gebruikt de driver bs.csi.transip.nl.
Controleer tot slot de PersistentVolumeClaim waarvan je een snapshot wilt maken:
kubectl get pvc -n <namespace>Vervang <namespace> door de namespace waarin je PVC staat.
Een VolumeSnapshot maken
In dit voorbeeld maken we een snapshot van een PVC met de naam webdata in de namespace productie. Vervang deze namen door de namen uit jouw cluster.
Stap 1
Maak een bestand met de naam volume-snapshot.yaml:
nano volume-snapshot.yamlPlaats de volgende inhoud in het bestand:
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: webdata-before-upgrade
namespace: productie
spec:
volumeSnapshotClassName: team-blue-k8s
source:
persistentVolumeClaimName: webdataVervang de volgende waarden:
- webdata-before-upgrade: de naam van de snapshot.
- productie: de namespace waarin je PVC staat.
- webdata: de naam van de PVC waarvan je een snapshot maakt.
Sla de wijzigingen op en sluit het bestand (ctrl + x > y > enter).
Stap 2
Maak de VolumeSnapshot aan:
kubectl apply -f volume-snapshot.yaml
Stap 3
Controleer of de snapshot klaar is voor gebruik:
kubectl get volumesnapshot -n productieWacht tot READYTOUSE op true staat. Gebruik hiervoor eventueel dit commando:
kubectl wait --for=jsonpath='{.status.readyToUse}'=true volumesnapshot/webdata-before-upgrade -n productie --timeout=10mBekijk extra details met:
kubectl describe volumesnapshot webdata-before-upgrade -n productie
Een VolumeSnapshot herstellen
Een restore vanuit een VolumeSnapshot maakt een nieuwe PersistentVolumeClaim. Kubernetes overschrijft de oorspronkelijke PVC niet. Koppel je applicatie pas aan de herstelde PVC nadat je hebt gecontroleerd dat de data klopt.
Stap 1
Controleer welke StorageClass de oorspronkelijke PVC gebruikt:
kubectl get pvc webdata -n productie -o jsonpath='{.spec.storageClassName}{"\n"}'Gebruik bij de restore dezelfde StorageClass, bijvoorbeeld transip-fast-storage of transip-big-storage.
Stap 2
Maak een bestand met de naam volume-snapshot-restore.yaml:
nano volume-snapshot-restore.yamlPlaats de volgende inhoud in het bestand:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: webdata-restore
namespace: productie
spec:
accessModes:
- ReadWriteOnce
storageClassName: transip-fast-storage
resources:
requests:
storage: 20Gi
dataSource:
name: webdata-before-upgrade
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.ioVervang de volgende waarden:
- webdata-restore: de naam van de nieuwe PVC.
- productie: de namespace waarin de snapshot staat.
- transip-fast-storage: de StorageClass van de nieuwe PVC.
- 20Gi: de grootte van de nieuwe PVC. Gebruik minimaal de restoreSize van de snapshot.
- webdata-before-upgrade: de naam van de VolumeSnapshot.
Sla de wijzigingen op en sluit het bestand (ctrl + x > y > enter).
Stap 3
Maak de herstelde PVC aan:
kubectl apply -f volume-snapshot-restore.yamlControleer of de PVC is aangemaakt:
kubectl get pvc webdata-restore -n productieWacht tot STATUS op Bound staat.
Stap 4
Controleer de data op de herstelde PVC voordat je je productie-workload aanpast. Maak hiervoor bijvoorbeeld een tijdelijke pod:
apiVersion: v1
kind: Pod
metadata:
name: check-restored-volume
namespace: productie
spec:
restartPolicy: Never
containers:
- name: shell
image: busybox:1.36
command: ["sh", "-c", "ls -la /data && sleep 3600"]
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: webdata-restoreSla dit bestand bijvoorbeeld op als check-restored-volume.yaml en maak de pod aan:
kubectl apply -f check-restored-volume.yamlBekijk daarna de inhoud van het volume:
kubectl exec -n productie check-restored-volume -- ls -la /dataVerwijder de tijdelijke pod nadat je de data hebt gecontroleerd:
kubectl delete pod check-restored-volume -n productie
Je workload aan de herstelde PVC koppelen
Nadat je de data hebt gecontroleerd, koppel je je applicatie aan de herstelde PVC. De exacte stappen hangen af van je workload en deploymentmethode.
Gebruik je een Deployment met een vaste claimName, schaal de Deployment dan eerst terug:
kubectl scale deployment <deploymentnaam> -n productie --replicas=0Pas daarna je manifest, Helm chart of Kustomize-configuratie aan zodat de workload webdata-restore gebruikt in plaats van webdata:
volumes:
- name: data
persistentVolumeClaim:
claimName: webdata-restorePas de gewijzigde configuratie toe en schaal je Deployment daarna weer op:
kubectl apply -f deployment.yaml
kubectl scale deployment <deploymentnaam> -n productie --replicas=1Gebruik je een StatefulSet, controleer dan eerst hoe je applicatie de PVC gebruikt. Een StatefulSet maakt vaak PVC's aan via volumeClaimTemplates. Die PVC-namen zijn gekoppeld aan de StatefulSet en podnaam. Maak in dat geval eerst een herstelplan dat past bij je applicatie, bijvoorbeeld door data uit de herstelde PVC terug te kopiëren naar een nieuw volume met de verwachte naam.
VolumeSnapshots opruimen
Verwijder snapshots die je niet meer nodig hebt. De VolumeSnapshotClass team-blue-k8s gebruikt deletionPolicy Delete. Dit betekent dat de onderliggende snapshot in de storage-omgeving ook wordt verwijderd wanneer je het VolumeSnapshot-object verwijdert.
kubectl delete volumesnapshot webdata-before-upgrade -n productieControleer daarna of de snapshot weg is:
kubectl get volumesnapshot -n productieLet op: het verwijderen van een VolumeSnapshot verwijdert niet automatisch PVC's die je eerder vanuit die snapshot hebt hersteld. Verwijder herstelde PVC's apart wanneer je ze niet meer gebruikt.
Veelvoorkomende problemen
- kubectl kent VolumeSnapshot niet: controleer of je verbonden bent met het juiste cluster en of de VolumeSnapshot-CRD's beschikbaar zijn.
- De snapshot blijft op READYTOUSE false staan: wacht eerst enkele minuten en controleer daarna de events met kubectl describe volumesnapshot <snapshotnaam> -n <namespace>.
- De restore-PVC blijft Pending: controleer of de StorageClass bestaat, of de gevraagde storagegrootte minimaal gelijk is aan de restoreSize, en of je dataSource naar de juiste VolumeSnapshot verwijst.
- Je workload start niet met de herstelde PVC: controleer of de accessMode past bij je workload. Een ReadWriteOnce-volume wordt op één node tegelijk gekoppeld.
- Je wilt naar een andere namespace herstellen: gebruik voor de standaardworkflow dezelfde namespace. Cross-namespace restores vereisen aanvullende Kubernetes-functionaliteit en zijn niet de basisworkflow in deze handleiding.
Je hebt nu een VolumeSnapshot gemaakt, gecontroleerd en hersteld naar een nieuwe PersistentVolumeClaim. Gebruik snapshots als snel herstelpunt voor onderhoud en wijzigingen, en ruim oude snapshots op zodra je ze niet meer nodig hebt.