Restablece un volumen a partir de una instantánea

En este documento, se muestra cómo crear una instantánea de volumen y, luego, usarla para restablecer el volumen. Las instrucciones que se indican aquí se aplican a los clústeres que usan el controlador de CSI de vSphere.

Antes de comenzar

Lee Usa el controlador de Container Storage Interface de vSphere.

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

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

Descripción general de los pasos

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

  1. Crea una PersistentVolumeClaim.
    Crea un PersistentVolumeClaim que solicite la clase de almacenamiento standard-rwo. Luego, el clúster aprovisiona de forma dinámica un PersistentVolume y lo asocia con tu PersistentVolumeClaim.
  2. Crea una implementación.
    Crea una implementación que tenga un Pod. El pod especifica un volumen según tu PersistentVolumeClaim. El único contenedor del Pod activa 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 una VolumeSnapshot.
    Crea una VolumeSnapshot que capture el estado del volumen del Pod.
  5. Daño del archivo.
    Modifica el archivo hello.txt para que parezca un archivo dañado. El contenido del archivo ahora es “Hello W-corrupted-file-orld!”.
  6. Usa la instantánea para restablecer el volumen.
    Crea una segunda PersistentVolumeClaim que use tu VolumeSnapshot como fuente de datos. Edita tu implementación para que su volumen esté asociado con la nueva PersistentVolumeClaim. Luego, verifica que se haya restablecido el archivo hello.txt.

Crea una PersistentVolumeClaim

A continuación, se muestra 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 está configurado en standard-rwo. Esta es la clase de almacenamiento asociada con el controlador CSI de vSphere.

Guarda el siguiente manifiesto como un archivo llamado my-pvc.yaml. Crea y visualiza el PersistentVolumeClaim:

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

kubectl --kubeconfig CLUSTER_KUBECONFIG get pvc my-pvc

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

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

Crear una implementación

A continuación, se muestra un manifiesto de 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 comprender sobre el manifiesto de Deployment anterior:

  • El Pod solicita almacenamiento especificando el PersistentVolumeClaim, my-pvc, que creaste antes.

  • El pod tiene un contenedor, y este activa el volumen en /hello/.

Guarda el manifiesto en un archivo llamado my-deployment.yaml y crea el Deployment.

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

La implementación tiene un Pod. Obtén el nombre del Pod :

kubectl --kubeconfig CLUSTER_KUBECONFIG get pods

Toma nota del 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 obsérvalo.

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 instantánea

A continuación, se muestra un manifiesto de 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

Daña el archivo en el volumen

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

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 se cambió el archivo:

Hello W-corrupted-file-orld!

Restablecer

Este es 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, puedes ver que la fuente de datos para la nueva reclamación de PersistentVolume es la VolumeSnapshot que creaste antes.

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

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

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

Abre el Deployment para editarlo:

kubectl --kubeconfig CLUSTER_KUBECONFIG edit deployment my-deployment

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

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

La implementación borra el Pod y crea uno nuevo que usa el nuevo PersistentVolumeClaim.

Espera unos minutos y, luego, obtén el nombre del Pod nuevo:

kubectl --kubeconfig CLUSTER_KUBECONFIG get pods

Verifica que se haya restablecido el volumen del Pod:

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

El resultado muestra que se restableció el volumen:

Hello World!

Soluciona problemas

Para obtener orientación sobre la solución de problemas, consulta Soluciona problemas de almacenamiento.