Ripristina un volume da uno snapshot

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:

  1. 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.
  2. 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/.
  3. Scrivi un file nel volume del pod.
    Crea un file denominato hello.txt nel volume del pod. Il contenuto del file è "Hello World!".
  4. Crea un oggetto VolumeSnapshot.
    Crea un oggetto VolumeSnapshot che acquisisca lo stato del volume del pod.
  5. Corrompi il file.
    Modifica il file hello.txt in modo che sembri un file danneggiato. Il contenuto del file è ora "Hello W-corrupted-file-orld!"
  6. 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.txt sia 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.