Crear una instantánea de un PersistentVolume

Puedes usar la función instantánea de volumen de Kubernetes para volúmenes persistentes y aprovisionamiento dinámico en los clústeres de GKE.

Las instantáneas de volumen te permiten crear una copia del volumen en un momento específico. Puedes usar esta copia para hacer que un volumen vuelva a su estado anterior o a fin de aprovisionar un volumen de reemplazo.

Puedes aprovisionar y adjuntar instantáneas de volumen con los siguientes componentes:

Requisitos

Para usar instantáneas de volumen en GKE en AWS, debes contar con lo siguiente:

  • Un volumen que use un controlador de Container Storage Interface (CSI) que admita instantáneas. Los controladores de Elastic Block Store (EBS) que GKE en AWS usa de forma predeterminada admiten instantáneas.

    Para obtener una lista de todos los controladores de CSI que admiten instantáneas, consulta la columna “Other features” en Controladores en la documentación de Kubernetes.

  • Tienes un PersistentVolumeClaim existente para usar en una instantánea. El PersistentVolume que usas para una fuente de instantáneas debe ser administrado por un controlador CSI. Puedes verificar que usas un controlador CSI si verificas que la especificación de PersistentVolumetenga una sección csi con driver: ebs.csi.aws.com. Si tu clúster aprovisiona de forma dinámica PersistentVolumes mediante el controlador de CSI, como se describe en las siguientes secciones, lo administra el controlador de CSI.

Antes de comenzar

Crea y usa una instantánea de volumen

En los ejemplos de este documento, se muestra cómo hacer las siguientes tareas:

  1. Crea un PersistentVolumeClaim y Pod de ejemplo.
  2. Crea una VolumeSnapshot.
  3. Restablece la instantánea de volumen.
  4. Verificar que la restauración funcionó.

Para usar una instantánea de volumen, debes completar los siguientes pasos:

  1. Crea un objeto VolumeSnapshot para solicitar una instantánea de un PersistentVolumeClaim existente.
  2. Haz referencia a VolumeSnapshot en una PersistentVolumeClaim para restablecer un volumen en esa instantánea o crear un volumen nuevo con la instantánea.

Crea un PersistentVolumeClaim y Pod de ejemplo

  1. Para crear el objeto PersistentVolumeClaim, guarda el siguiente manifiesto como example-pvc.yaml:

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

    Para spec.storageClassName, puedes especificar cualquier clase de almacenamiento que use un controlador CSI compatible. En este ejemplo, se usa la clase de almacenamiento standard-rwo predeterminada.

  2. Aplica el manifiesto

    kubectl apply -f example-pvc.yaml
    
  3. Crea un Pod que escriba la fecha y hora actuales en el volumen. Para crear un Pod, guarda el siguiente manifiesto como snapshot-shell.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: snapshot-shell
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: linux
        image: ubuntu:bionic
        command: ["/bin/sh"]
        args: ["-c", "echo $(date -u) >> /data/out.txt"]
        volumeMounts:
        - name: snapshot-volume
          mountPath: /data
      restartPolicy: Never
      volumes:
      - name: snapshot-volume
        persistentVolumeClaim:
          claimName: example-pvc
    
  4. Aplica el manifiesto

    kubectl apply -f snapshot-shell.yaml
    
  5. Verifica el estado del pod:

    kubectl get pod snapshot-shell
    

    Es posible que el Pod tarde un poco en ejecutarse y completarse. Puedes ejecutar el comando anterior hasta que veas un resultado similar al siguiente:

    NAME             READY   STATUS      RESTARTS   AGE
    snapshot-shell   0/1     Completed   0          24s
    

Crea una VolumeSnapshot

Un objeto VolumeSnapshot es una solicitud de una instantánea de un objeto PersistentVolumeClaim existente. Cuando creas un objeto VolumeSnapshot, el clúster lo crea y vincula de forma automática con un objeto VolumeSnapshotContent, que es un recurso en el clúster, como un objeto PersistentVolume.

  1. Guarda el siguiente manifiesto como volumesnapshot.yaml.

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshot
    metadata:
      name: example-snapshot
    spec:
      source:
        persistentVolumeClaimName: example-pvc
    
  2. Aplica el manifiesto

    kubectl apply -f volumesnapshot.yaml
    

    Después de crear una instantánea de volumen, el clúster crea un objeto VolumeSnapshotContent correspondiente. Este objeto almacena la instantánea y las vinculaciones de objetos VolumeSnapshot. No se interactúa directamente con los objetos VolumeSnapshotContents.

  3. Confirma que tu clúster haya creado el objeto VolumeSnapshotContents:

    kubectl get volumesnapshotcontents
    

    El resultado es similar a este:

    NAME                                               AGE
    snapcontent-cee5fb1f-5427-11ea-a53c-42010a1000da   55s
    

Confirma que la instantánea de volumen esté lista

Después de crear el contenido de la instantánea de volumen, el controlador CSI que especificaste en VolumeSnapshotClass crea una instantánea en el sistema de almacenamiento correspondiente. Después de que el clúster crea una instantánea en el sistema de almacenamiento y la vincula a un objeto VolumeSnapshot, la instantánea está lista para usarse. Para verificar el estado, ejecuta el siguiente comando:

kubectl get volumesnapshot \
  -o custom-columns='NAME:.metadata.name,READY:.status.readyToUse'

Si la instantánea está lista para usarse, el resultado es similar al siguiente:

NAME                    READY
example-snapshot        true

Restablece la instantánea de volumen

Puedes hacer referencia a una VolumeSnapshot en un PersistentVolumeClaim para aprovisionar un volumen nuevo con datos de un volumen existente o restablecer un volumen a un estado que capturaste en la instantánea.

Para hacer referencia a una VolumeSnapshot en un PersistentVolumeClaim, agrega el campo dataSource a tu PersistentVolumeClaim.

En este ejemplo, debes hacer referencia a la VolumeSnapshot que creaste en un PersistentVolumeClaim nuevo y crear un Pod que active el PersistentVolumeClaim.

  1. Guarda el siguiente manifiesto como pvc-restore.yaml:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
     name: pvc-restore
    spec:
     dataSource:
       name: example-snapshot
       kind: VolumeSnapshot
       apiGroup: snapshot.storage.k8s.io
     storageClassName: standard-rwo
     accessModes:
       - ReadWriteOnce
     resources:
       requests:
         storage: 1Gi
    
  2. Aplica el manifiesto

    kubectl apply -f pvc-restore.yaml
    
  3. Inicia un Pod temporal que active el PVC en el Pod e imprima el contenido de out.txt en los registros.

    Guarda el siguiente manifiesto como restore-log.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: restore-verify
    spec:
      volumes:
        - name: restore-data
          persistentVolumeClaim:
            claimName: pvc-restore
      containers:
        - name: shell-container
          image: ubuntu:bionic
          volumeMounts:
            - mountPath: "/data"
              name: restore-data
          command: [ "/bin/sh" ]
          args: ["-c", "cat /data/out.txt", "exit", "1"]
      restartPolicy: Never
    
  4. Aplica el manifiesto

    kubectl apply -f restore-log.yaml
    

Verifica que la instantánea se haya restablecido correctamente

El Pod que creaste en el paso anterior lee la instantánea. Para ver los datos de la instantánea, usa el comando kubectl logs.

kubectl logs restore-verify

El resultado debe incluir una marca de tiempo de la instantánea.

Limpia

Para evitar que se apliquen cargos por los recursos que se usan en esta página, sigue estos pasos.

  1. Borra VolumeSnapshot:

    kubectl delete volumesnapshot example-snapshot
    

  2. Borra el Pod temporal:

    kubectl delete -f restore-log.yaml
    
  3. Borra el Pod:

    kubectl delete -f snapshot-shell.yaml
    
  4. Borra los objetos PersistentVolumeClaim:

    kubectl delete pvc example-pvc pvc-restore
    

¿Qué sigue?