Questo documento mostra come creare uno snapshot del volume e poi utilizzarlo per ripristinare il volume. Le istruzioni riportate qui si applicano ai cluster che utilizzano il driver CSI vSphere.
Prima di iniziare
Leggi Utilizzo del driver Container Storage Interface vSphere.
Verifica
che il cluster abbia una classe di archiviazione denominata 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 versioni successive. Per saperne di più, vedi Risoluzione dei problemi di archiviazione.
Panoramica della procedura
Di seguito sono riportati i passaggi principali dell'esercizio descritto in questo documento:
- Crea un oggetto PersistentVolumeClaim.
- Crea un oggetto
PersistentVolumeClaim
che richieda la classe di archiviazione
standard-rwo. Il cluster esegue quindi il provisioning dinamico di un oggetto PersistentVolume e lo associa all'oggetto PersistentVolumeClaim.
- Crea un deployment.
- Crea un deployment con un pod. Il pod specifica un volume basato sull'oggetto PersistentVolumeClaim. L'unico container nel pod monta il volume in
/hello/.
- Scrivi un file nel volume del pod.
- Crea un file denominato
hello.txtnel volume del pod. Il contenuto del file è "Hello World!".
- Crea un oggetto VolumeSnapshot.
- Crea un oggetto VolumeSnapshot che acquisisca lo stato del volume del pod.
- Corrompi il file.
- Modifica il file
hello.txtin modo che sembri un file 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 l'oggetto VolumeSnapshot come origine dati. Modifica il deployment in modo che il volume sia associato al nuovo oggetto PersistentVolumeClaim. Verifica quindi che il file
hello.txtsia stato ripristinato.
Crea un oggetto PersistentVolumeClaim
Di seguito è riportato un manifest per un oggetto 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 oggetto PersistentVolume di cui è stato eseguito il provisioning dinamico. Ad esempio, l'output seguente mostra che l'oggetto PersistentVolumeClaim denominato my-pvc è associato a un oggetto PersistentVolume denominato pvc-467d211c-26e4-4d69-aaa5-42219aee6fd5:
my-pvc Bound pvc-467d211c-26e4-4d69-aaa5-42219aee6fd5 … standard-rwo 100s
Crea un deployment
Di seguito è riportato 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
Nel contesto di questo esercizio, di seguito sono riportati i punti importanti da comprendere sul manifest di 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. Recupera 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 il contenuto del file /hello/hello.txt:
Hello World!
Crea uno snapshot
Di seguito è riportato un manifest per un oggetto 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 l'oggetto VolumeSnapshot:
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-snapshot.yaml
Corrompi il file nel volume
Modifica il contenuto di hello.txt in modo che sembri danneggiato:
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
Di seguito è riportato un manifest per un secondo oggetto 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 volume permanente è l'oggetto 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 per la modifica:
kubectl --kubeconfig CLUSTER_KUBECONFIG edit deployment my-deployment
Modifica 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 ne crea uno nuovo che utilizza il nuovo oggetto PersistentVolumeClaim.
Attendi qualche minuto e poi 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 mostra che il volume è stato ripristinato:
Hello World!
Risoluzione dei problemi
Per indicazioni sulla risoluzione dei problemi, vedi Risoluzione dei problemi di archiviazione.