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. Estas instrucciones se aplican a los clústeres que usan el controlador CSI de vSphere.

Antes de comenzar

Consulta Usa el controlador de Container Storage Interface de vSphere.

Verifica que tu clúster tenga una StorageClass llamada 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 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 proporciona en este documento:

  1. Crea una PersistentVolumeClaim.
    Crea una 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.
    Crear un objeto Deployment que tenga un Pod. El Pod especifica un volumen basado en tu PersistentVolumeClaim. El único contenedor en el 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. Crear una VolumeSnapshot
    Crea una VolumeSnapshot que capture el estado del volumen del Pod.
  5. Se dañó el 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 Deployment para que su volumen se asocie con la PersistentVolumeClaim nueva. Luego, verifica que se haya restablecido el archivo hello.txt.

Crea una PersistentVolumeClaim

A continuación, se muestra un manifiesto de una 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 como standard-rwo. Esta es la clase de almacenamiento asociada con el controlador de CSI de vSphere.

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

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

kubectl --kubeconfig CLUSTER_KUBECONFIG get pvc my-pvc

En el resultado, puedes ver que la PersistentVolumeClaim está vinculada a un PersistentVolume aprovisionado de forma dinámica. Por ejemplo, el siguiente resultado muestra que la PersistentVolumeClaim llamada my-pvc está vinculada 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 la PersistentVolumeClaim, my-pvc, que creaste antes.

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

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

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

El objeto Deployment 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

Crear un archivo en el volumen de Pods y verlo

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!

Crea 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 la VolumeSnapshot:

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

Corromper el archivo en el volumen

Cambia el contenido de hello.txt para que parezca que está 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 modificó:

Hello W-corrupted-file-orld!

Restablecer

A continuación, se muestra un manifiesto de una segunda 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 la PersistentVolumeClaim:

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

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

Abre el objeto 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 un Pod nuevo que usa la PersistentVolumeClaim nueva.

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

kubectl --kubeconfig CLUSTER_KUBECONFIG get pods

Verifica que el volumen del Pod se haya restablecido:

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

El resultado muestra que el volumen se restableció:

Hello World!

Soluciona problemas

Si quieres obtener orientación para solucionar problemas, consulta Cómo solucionar problemas de almacenamiento.