Restaurar un volumen a partir de una captura

En este documento se explica cómo crear una captura de volumen y, a continuación, usarla para restaurar el volumen. Las instrucciones que se indican aquí se aplican a los clústeres que usan el controlador de CSI para vSphere.

Antes de empezar

Consulta Usar el controlador de interfaz de almacenamiento de contenedor de vSphere.

Verifica que tu clúster tenga un StorageClass llamado standard-rwo y que el controlador CSI de vSphere esté instalado.

Tu versión de vSphere, ESXi y vCenter Server debe ser 7.0 Update 3 o una posterior. Para obtener más información, consulta Solucionar problemas de almacenamiento.

Pasos que deben seguirse

Estos son los pasos principales del ejercicio que se indica en este documento:

  1. Crea un PersistentVolumeClaim.
    Crea un PersistentVolumeClaim que solicite la clase de almacenamiento standard-rwo. A continuación, el clúster aprovisiona dinámicamente un PersistentVolume y lo asocia a tu PersistentVolumeClaim.
  2. Crea un despliegue.
    Crea un Deployment que tenga un Pod. El pod especifica un volumen basado en tu PersistentVolumeClaim. El contenedor del pod monta el volumen en /hello/.
  3. Escribe un archivo en el volumen del pod.
    Crea un archivo llamado hello.txt en el volumen del pod. El contenido del archivo es "Hello World!".
  4. Crea un VolumeSnapshot.
    Crea un VolumeSnapshot que capture el estado del volumen del pod.
  5. Daña el archivo.
    Modifica el archivo hello.txt para que parezca dañado. El contenido del archivo ahora es "Hello W-corrupted-file-orld!".
  6. Usa la captura para restaurar el volumen.
    Crea un segundo PersistentVolumeClaim que use tu VolumeSnapshot como fuente de datos. Edita tu Deployment para que su volumen esté asociado al nuevo PersistentVolumeClaim. A continuación, comprueba que se ha restaurado el archivo hello.txt.

Crear un PersistentVolumeClaim

Aquí tienes un manifiesto de PersistentVolumeClaim:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  storageClassName: standard-rwo

En el manifiesto anterior, puedes ver que storageClassName tiene el valor standard-rwo. Esta es la clase de almacenamiento asociada al controlador CSI de vSphere.

Guarda el manifiesto en un archivo llamado my-pvc.yaml. Crea y consulta el PersistentVolumeClaim:

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

kubectl --kubeconfig CLUSTER_KUBECONFIG get pvc my-pvc

En la salida, puedes ver que PersistentVolumeClaim está enlazado a un PersistentVolume aprovisionado dinámicamente. Por ejemplo, el siguiente resultado muestra que el PersistentVolumeClaim llamado my-pvc está enlazado a un PersistentVolume llamado pvc-467d211c-26e4-4d69-aaa5-42219aee6fd5:

my-pvc   Bound    pvc-467d211c-26e4-4d69-aaa5-42219aee6fd5  …  standard-rwo   100s

Crear un despliegue

Aquí tienes un manifiesto de 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

En el contexto de este ejercicio, estos son los puntos importantes que debes tener en cuenta sobre el manifiesto de Deployment anterior:

  • El pod solicita almacenamiento especificando el PersistentVolumeClaim, my-pvc, que has creado anteriormente.

  • El pod tiene un contenedor y el contenedor monta el volumen en /hello/.

Guarda el manifiesto en un archivo llamado my-deployment.yaml y crea la implementación:

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

El Deployment tiene un Pod. Obtener el nombre del pod:

kubectl --kubeconfig CLUSTER_KUBECONFIG get pods

Anota el nombre del pod. Por ejemplo, en el siguiente resultado, el nombre del pod es my-deployment-7575c4f5bf-r59nt:

my-deployment-7575c4f5bf-r59nt   1/1     Running   0          65s

Crea un archivo en el volumen del pod y consulta el archivo.

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'

El resultado muestra el contenido del archivo /hello/hello.txt:

Hello World!

Crear una captura

Aquí tienes un manifiesto de un VolumeSnapshot:

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: my-snapshot
spec:
  volumeSnapshotClassName: csi-vsphere-snapshot-class
  source:
    persistentVolumeClaimName: my-pvc

Guarda el manifiesto en un archivo llamado my-snapshot.yaml y crea el VolumeSnapshot:

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

Corromper el archivo del volumen

Cambia el contenido de hello.txt para que parezca que se ha dañado:

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'

En el resultado, puedes ver que el archivo se ha modificado:

Hello W-corrupted-file-orld!

Restaurar

Aquí tienes un manifiesto para un segundo 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

En el manifiesto anterior, puede ver que la fuente de datos de la nueva reclamación de PersistentVolume es el VolumeSnapshot que ha creado anteriormente.

Guarda el manifiesto en un archivo llamado my-pvc-2.yaml. Crea y consulta el PersistentVolumeClaim:

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

kubectl --kubeconfig CLUSTER_KUBECONFIG get pvc my-pvc-2

Abre la implementación para editarla:

kubectl --kubeconfig CLUSTER_KUBECONFIG edit deployment my-deployment

Cambia my-pvc por my-pvc-2 y cierra el editor:

…
  volumes:
  - name: my-volume
    persistentVolumeClaim:
    claimName: my-pvc-2

La implementación elimina el pod y crea uno nuevo que usa el nuevo PersistentVolumeClaim.

Espera unos minutos y, a continuación, obtén el nuevo nombre del pod:

kubectl --kubeconfig CLUSTER_KUBECONFIG get pods

Comprueba que se haya restaurado el volumen del Pod:

kubectl --kubeconfig CLUSTER_KUBECONFIG \
   exec NEW_POD_NAME \
   -- sh -c 'cat /hello/hello.txt'

El resultado muestra que se ha restaurado el volumen:

Hello World!

Solución de problemas

Para obtener ayuda sobre cómo solucionar problemas, consulta Solucionar problemas de almacenamiento.