Capturar un PersistentVolume

Puedes usar la función de creación de copias de seguridad de volúmenes de Kubernetes para volúmenes persistentes y aprovisionamiento dinámico en tus clústeres de GKE.

Las capturas de volumen te permiten crear una copia de tu volumen en un momento concreto. Puedes usar esta copia para restaurar un volumen a un estado anterior o para aprovisionar un volumen de sustitución.

Puedes aprovisionar y adjuntar copias de seguridad de volúmenes con los siguientes componentes:

Requisitos

Para usar las capturas de volumen en GKE en AWS, debes tener lo siguiente:

  • Un volumen que usa un controlador de interfaz de almacenamiento de contenedor (CSI) que admite instantáneas. Los controladores de Elastic Block Store (EBS) que usa GKE on AWS de forma predeterminada admiten instantáneas.

    Para ver una lista de todos los controladores CSI que admiten instantáneas, consulta la columna "Otras funciones" de Controladores en la documentación de Kubernetes.

  • Tener un PersistentVolumeClaim que quieras usar para una captura. El PersistentVolume que uses para una fuente de captura debe gestionarse mediante un controlador CSI. Para comprobar que estás usando un controlador CSI, verifica que la especificación PersistentVolume tenga una sección csi con driver: ebs.csi.aws.com . Si tu clúster provisiona PersistentVolumes de forma dinámica mediante el controlador CSI, tal como se describe en las siguientes secciones, el controlador CSI lo gestiona.

Antes de empezar

Crear y usar una captura de volumen

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

  1. Crea un ejemplo de PersistentVolumeClaim y Pod.
  2. Crea un VolumeSnapshot.
  3. Restaura la captura del volumen.
  4. Verifica que la restauración se haya realizado correctamente.

Para usar una copia de seguridad de un volumen, debes completar los siguientes pasos:

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

Crear un ejemplo de PersistentVolumeClaim y Pod

  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
    

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

  2. Aplica el archivo de manifiesto:

    kubectl apply -f example-pvc.yaml
    
  3. Crea un pod que escriba la fecha y la 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 archivo de manifiesto:

    kubectl apply -f snapshot-shell.yaml
    
  5. Comprueba el estado del Pod:

    kubectl get pod snapshot-shell
    

    El pod puede tardar un tiempo 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
    

Crear un VolumeSnapshot

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

  1. Guarda el siguiente archivo de manifiesto como volumesnapshot.yaml.

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

    kubectl apply -f volumesnapshot.yaml
    

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

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

    kubectl get volumesnapshotcontents
    

    El resultado debería ser similar al siguiente:

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

Confirmar que la instantánea de volumen está lista

Una vez que se haya creado el contenido de la captura del volumen, el controlador CSI que hayas especificado en VolumeSnapshotClass creará una captura en el sistema de almacenamiento correspondiente. Una vez que el clúster crea una captura en el sistema de almacenamiento y la vincula a un objeto VolumeSnapshot, la captura está lista para usarse. Para comprobar 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 será similar al siguiente:

NAME                    READY
example-snapshot        true

Restaurar la captura del volumen

Puedes hacer referencia a una VolumeSnapshot en un PersistentVolumeClaim para aprovisionar un volumen nuevo con datos de un volumen ya creado o restaurar un volumen a un estado que hayas capturado en la captura.

Para hacer referencia a un VolumeSnapshot en un PersistentVolumeClaim, añade el campo dataSource al PersistentVolumeClaim.

En este ejemplo, haces referencia al VolumeSnapshot que has creado en un nuevo PersistentVolumeClaim y creas un pod que monta el PersistentVolumeClaim.

  1. Guarda el siguiente archivo de 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 archivo de manifiesto:

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

    Guarda el siguiente archivo de 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 archivo de manifiesto:

    kubectl apply -f restore-log.yaml
    

Comprobar que la instantánea se ha restaurado correctamente

El pod que has creado 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.

Limpieza

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

  1. Elimina el VolumeSnapshot:

    kubectl delete volumesnapshot example-snapshot
    

  2. Elimina el pod temporal:

    kubectl delete -f restore-log.yaml
    
  3. Elimina el pod:

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

    kubectl delete pvc example-pvc pvc-restore
    

Siguientes pasos