Tomar una instantánea de un volumen persistente

Puede utilizar la función de instantáneas de volumen de Kubernetes para volúmenes persistentes y aprovisionamiento dinámico en sus clústeres de GKE.

Las instantáneas de volumen permiten crear una copia de su volumen en un momento específico. Puede usar esta copia para restaurar un volumen a un estado anterior o para aprovisionar un volumen de reemplazo.

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

Requisitos

Para usar instantáneas de volumen en GKE en AWS, debe tener lo siguiente:

  • Un volumen que utiliza un controlador de interfaz de almacenamiento de contenedores (CSI) compatible con instantáneas. Los controladores de Elastic Block Store (EBS) que GKE en AWS utiliza de forma predeterminada admiten instantáneas.

    Para obtener una lista de todos los controladores CSI que admiten instantáneas, consulte la columna "Otras características" en Controladores en la documentación de Kubernetes.

  • Tenga un PersistentVolumeClaim existente para usar en una instantánea. El PersistentVolume que use para una fuente de instantánea debe ser administrado por un controlador CSI. Puede verificar que esté usando un controlador CSI comprobando que la especificación PersistentVolume incluya una sección csi con driver: ebs.csi.aws.com . Si su clúster aprovisiona dinámicamente PersistentVolumes mediante el controlador CSI, como se describe en las siguientes secciones, este lo administra.

Antes de empezar

Crear y usar una instantánea de volumen

Los ejemplos de este documento le muestran cómo realizar las siguientes tareas:

  1. Cree un ejemplo PersistentVolumeClaim y Pod .
  2. Crear un VolumeSnapshot .
  3. Restaurar la instantánea del volumen .
  4. Verifique que la restauración funcionó .

Para utilizar una instantánea de volumen, debe completar los siguientes pasos:

  1. Cree un objeto VolumeSnapshot para solicitar una instantánea de un PersistentVolumeClaim existente.
  2. Haga referencia a VolumeSnapshot en un PersistentVolumeClaim para restaurar un volumen a esa instantánea o crear un nuevo volumen usando la instantánea.

Cree un ejemplo de PersistentVolumeClaim y Pod

  1. Para crear el objeto PersistentVolumeClaim , guarde 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 , puede especificar cualquier clase de almacenamiento que utilice un controlador CSI compatible. En este ejemplo, se utiliza la clase de almacenamiento standard-rwo predeterminada.

  2. Aplicar el manifiesto:

    kubectl apply -f example-pvc.yaml
    
  3. Cree un pod que escriba la fecha y hora actuales en el volumen. Para crear un pod, guarde 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. Aplicar el manifiesto:

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

    kubectl get pod snapshot-shell
    

    El pod podría tardar un tiempo en ejecutarse y completarse. Puede ejecutar el comando anterior hasta que vea un resultado similar al siguiente:

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

Crear una instantánea de volumen

Un objeto VolumeSnapshot es una solicitud de instantánea de un objeto PersistentVolumeClaim existente. Al crear un objeto VolumeSnapshot , el clúster lo crea y vincula automáticamente con un objeto VolumeSnapshotContent , que es un recurso del clúster, al igual que un objeto PersistentVolume .

  1. Guarde el siguiente manifiesto como volumesnapshot.yaml .

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

    kubectl apply -f volumesnapshot.yaml
    

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

  3. Confirme que su clúster creó el objeto VolumeSnapshotContents :

    kubectl get volumesnapshotcontents
    

    La salida es similar a la siguiente:

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

Confirme que la instantánea del volumen esté lista

Tras crear el contenido de la instantánea de volumen, el controlador CSI especificado en VolumeSnapshotClass crea una instantánea en el sistema de almacenamiento correspondiente. Una vez 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. Puede comprobar el estado ejecutando el siguiente comando:

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

Si la instantánea está lista para usarse, la salida es similar a la siguiente:

NAME                    READY
example-snapshot        true

Restaurar la instantánea del volumen

Puede hacer referencia a un VolumeSnapshot en un PersistentVolumeClaim para aprovisionar un nuevo volumen con datos de un volumen existente o restaurar un volumen a un estado que capturó en la instantánea.

Para hacer referencia a un VolumeSnapshot en un PersistentVolumeClaim , agregue el campo dataSource a su PersistentVolumeClaim .

En este ejemplo, hace referencia al VolumeSnapshot que creó en un nuevo PersistentVolumeClaim y crea un Pod que monta el PersistentVolumeClaim .

  1. Guarde 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. Aplicar el manifiesto:

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

    Guarde 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. Aplicar el manifiesto:

    kubectl apply -f restore-log.yaml
    

Compruebe que la instantánea se haya restaurado correctamente

El pod que creó en el paso anterior lee la instantánea. Para ver los datos de la instantánea, use el comando kubectl logs .

kubectl logs restore-verify

La salida debe incluir una marca de tiempo de la instantánea.

Limpiar

Para evitar incurrir en cargos por los recursos utilizados en esta página, siga estos pasos.

  1. Eliminar VolumeSnapshot :

    kubectl delete volumesnapshot example-snapshot
    

  2. Eliminar el Pod temporal:

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

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

    kubectl delete pvc example-pvc pvc-restore
    

¿Qué sigue?