Questo documento mostra come creare uno snapshot del volume e come utilizzarlo per ripristinare il volume. Le istruzioni qui riportate si applicano ai cluster che utilizzano il driver CSI vSphere.
Prima di iniziare
Consulta Utilizzo del driver vSphere Container Storage Interface.
Verifica che il cluster abbia un oggetto StorageClass denominato standard-rwo e che il driver CSI vSphere sia installato.
La versione di vSphere, ESXi e vCenter Server deve essere 7.0 Update 3 o successivo. Per maggiori informazioni, consulta Risoluzione dei problemi di archiviazione.
Panoramica della procedura
Di seguito sono riportati i passaggi principali dell'esercizio riportati in questo documento:
- Creare un oggetto PersistentVolumeClaim.
- Crea un
PersistentVolumeClaim
che richiede la classe di archiviazione
standard-rwo. Il cluster quindi esegue dinamicamente il provisioning di un PersistentVolume e lo associa al tuo PersistentVolumeClaim.
- Creare un deployment.
- Creare un deployment con un pod. Il pod specifica un volume in base
all'oggetto PersistentVolumeClaim. L'unico container nel pod monta il volume in
/hello/.
- Scrivere un file nel volume del pod.
- Crea un file denominato
hello.txtnel volume del pod. Il contenuto del file è "Hello World!".
- Creare un VolumeSnapshot.
- Crea un oggetto VolumeSnapshot che acquisisce lo stato del volume del pod.
- Danneggiare il file.
- Modifica il file
hello.txtin modo che sembri danneggiato. Il contenuto del file è ora "Hello W-corrupted-file-orld!"
- Utilizza lo snapshot per ripristinare il volume.
- Crea un secondo oggetto PersistentVolumeClaim che utilizzi il tuo VolumeSnapshot come origine dati. Modifica il tuo deployment in modo che il suo volume sia associato al nuovo oggetto PersistentVolumeClaim. Quindi, verifica che il file
hello.txtsia stato ripristinato.
crea un PersistentVolumeClaim
Ecco un manifest per un PersistentVolumeClaim:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: standard-rwo
Nel manifest precedente, puoi vedere che storageClassName è impostato su
standard-rwo. Questa è la classe di archiviazione associata al driver CSI vSphere.
Salva il manifest in un file denominato my-pvc.yaml. Crea e visualizza l'oggetto PersistentVolumeClaim:
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-pvc.yaml kubectl --kubeconfig CLUSTER_KUBECONFIG get pvc my-pvc
Nell'output, puoi vedere che l'oggetto PersistentVolumeClaim è associato a un PersistentVolume di cui è stato eseguito il provisioning dinamico. Ad esempio, l'output seguente mostra che l'oggetto PersistentVolumeClaim denominato my-pvc è associato a un PersistentVolume denominato pvc-467d211c-26e4-4d69-aaa5-42219aee6fd5:
my-pvc Bound pvc-467d211c-26e4-4d69-aaa5-42219aee6fd5 … standard-rwo 100s
Creazione di un deployment
Ecco un manifest per un deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
selector:
matchLabels:
app: hello-app
template:
metadata:
labels:
app: hello-app
spec:
containers:
- name: hello-app
image: google/cloud-sdk:slim
args: [ "sleep", "3600" ]
volumeMounts:
- name: my-volume
mountPath: /hello/
volumes:
- name: my-volume
persistentVolumeClaim:
claimName: my-pvc
Nell'ambito di questo esercizio, ecco i punti importanti da comprendere sul manifest del deployment precedente:
Il pod richiede spazio di archiviazione specificando l'oggetto PersistentVolumeClaim,
my-pvc, che hai creato in precedenza.Il pod ha un container e il container monta il volume in
/hello/.
Salva il manifest in un file denominato my-deployment.yaml e crea il deployment:
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-deployment.yaml
Il deployment ha un pod. Ottieni il nome del pod:
kubectl --kubeconfig CLUSTER_KUBECONFIG get pods
Prendi nota del nome del pod. Ad esempio, nell'output seguente, il nome del pod è my-deployment-7575c4f5bf-r59nt:
my-deployment-7575c4f5bf-r59nt 1/1 Running 0 65s
Crea un file nel volume del pod e visualizzalo.
kubectl --kubeconfig CLUSTER_KUBECONFIG \
exec POD_NAME \
-- sh -c 'echo "Hello World!" > /hello/hello.txt'
kubectl --kubeconfig CLUSTER_KUBECONFIG \
exec POD_NAME \
-- sh -c 'cat /hello/hello.txt'
L'output mostra i contenuti del file /hello/hello.txt:
Hello World!
Crea uno snapshot
Ecco un manifest per un VolumeSnapshot:
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: my-snapshot
spec:
volumeSnapshotClassName: csi-vsphere-snapshot-class
source:
persistentVolumeClaimName: my-pvc
Salva il manifest in un file denominato my-snapshot.yaml e crea il
VolumeSnapshot:
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-snapshot.yaml
Danneggiare il file nel volume
Modifica i contenuti di hello.txt in modo che sembrino danneggiati:
kubectl --kubeconfig CLUSTER_KUBECONFIG \
exec POD_NAME \
-- sh -c 'echo "Hello W-corrupted-file-orld!" > /hello/hello.txt'
kubectl --kubeconfig CLUSTER_KUBECONFIG \
exec POD_NAME \
-- sh -c 'cat /hello/hello.txt'
Nell'output puoi vedere che il file è stato modificato:
Hello W-corrupted-file-orld!
Ripristina
Ecco un manifest per un secondo PersistentVolumeClaim:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc-2
spec:
storageClassName: standard-rwo
dataSource:
name: my-snapshot
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
Nel manifest precedente, puoi vedere che l'origine dati per la nuova richiesta di PersistentVolume è il VolumeSnapshot che hai creato in precedenza.
Salva il manifest in un file denominato my-pvc-2.yaml. Crea e visualizza l'oggetto PersistentVolumeClaim:
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-pvc-2.yaml kubectl --kubeconfig CLUSTER_KUBECONFIG get pvc my-pvc-2
Apri il deployment da modificare:
kubectl --kubeconfig CLUSTER_KUBECONFIG edit deployment my-deployment
Cambia my-pvc in my-pvc-2 e chiudi l'editor:
…
volumes:
- name: my-volume
persistentVolumeClaim:
claimName: my-pvc-2
Il deployment elimina il pod e crea un nuovo pod che utilizza il nuovo oggetto PersistentVolumeClaim.
Attendi qualche minuto, quindi recupera il nuovo nome del pod:
kubectl --kubeconfig CLUSTER_KUBECONFIG get pods
Verifica che il volume del pod sia stato ripristinato:
kubectl --kubeconfig CLUSTER_KUBECONFIG \ exec NEW_POD_NAME \ -- sh -c 'cat /hello/hello.txt'
L'output indica che il volume è stato ripristinato:
Hello World!
Risoluzione dei problemi
Per indicazioni sulla risoluzione dei problemi, consulta Risoluzione dei problemi di archiviazione.