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 de CSI de vSphere.

Antes de comenzar

Lee 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.

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

Descripción general de los pasos

Estos son los pasos principales del ejercicio que se proporcionan 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 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. Escribir 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. El archivo se dañó.
    Modifica el archivo hello.txt para que parezca dañado. El contenido del archivo ahora es "Hello W-corrupted-file-orld!"
  6. Usar la instantánea para restablecer el volumen
    Crea una segunda PersistentVolumeClaim que use tu VolumeSnapshot como su fuente de datos. Edita tu Deployment 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 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 se configuró 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 mediante la especificación de 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

Crea un archivo en el volumen del Pod y visualízalo.

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'

En el resultado, se muestra el contenido del archivo /hello/hello.txt:

Hello World!

Crea una instantánea

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

Dañar 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 ha cambiado:

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 de la nueva reclamación 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 la Deployment 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

El Deployment borra el Pod y crea un Pod nuevo que usa la PersistentVolumeClaim nueva.

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'

En el resultado, se muestra que se restableció el volumen:

Hello World!

Soluciona problemas

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