Ripristinare un volume da uno snapshot

Questo documento mostra come creare uno snapshot del volume e quindi utilizzarlo per ripristinare il volume. Le istruzioni riportate di seguito 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 StorageClass denominata standard-rwo e che sia installato il driver CSI vSphere.

La tua versione di vSphere, ESXi e vCenter Server deve essere 7.0 Update 3 o versioni successive. Per ulteriori informazioni, 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 PersistentVolumeClaim.
    Crea un PersistentVolumeClaim che richieda la classe di archiviazione standard-rwo. Il cluster esegue il provisioning dinamico di un PersistentVolume e lo associa al tuo PersistentVolumeClaim.
  2. Crea un deployment.
    Crea un deployment con un pod. Il pod specifica un volume in base alla tua 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 VolumeSnapshot.
    Crea un VolumeSnapshot che acquisisca lo stato del volume del pod.
  5. Danneggia il file.
    Modifica il file hello.txt in modo che sembri danneggiato. Il contenuto del file ora è "Hello W-corrupted-file-orld!"
  6. Utilizza lo snapshot per ripristinare il volume.
    Crea un secondo PersistentVolumeClaim che utilizzi VolumeSnapshot come origine dati. Modifica il deployment in modo che il volume sia associato al nuovo PersistentVolumeClaim. Quindi, verifica che il file hello.txt sia 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 vSphere CSI.

Salva il manifest in un file denominato my-pvc.yaml. Crea e visualizza PersistentVolumeClaim:

kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-pvc.yaml

kubectl --kubeconfig CLUSTER_KUBECONFIG get pvc my-pvc

Nell'output puoi vedere che PersistentVolumeClaim è associato a un PersistentVolume di cui è stato eseguito il provisioning dinamico. Ad esempio, il seguente output mostra che 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

Nel contesto di questo esercizio, questi sono 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, nel seguente output, 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 VolumeSnapshot:

kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-snapshot.yaml

Corrompere 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 rivendicazione PersistentVolume è lo snapshot del volume che hai creato in precedenza.

Salva il manifest in un file denominato my-pvc-2.yaml. Crea e visualizza 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 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 mostra che il volume è stato ripristinato:

Hello World!

Risoluzione dei problemi

Per indicazioni sulla risoluzione dei problemi, vedi Risoluzione dei problemi di archiviazione.