Crea una copia de seguridad y restablece el almacenamiento persistente de tus clústeres de GKE

En esta página, se muestra cómo crear una copia de seguridad y restablecer el archivo subyacente de Filestore de GKE asociado a tus clústeres de GKE con el volumen instantáneas.

Crear una instantánea de volumen de Kubernetes equivale a crear una copia de seguridad de Filestore.

Para obtener más información, consulta Acerca de las instantáneas de volumen de Kubernetes

Requisitos

Para usar instantáneas de volumen en GKE, debes cumplir con los siguientes requisitos:

  • Debes implementar el controlador CSI de Filestore. Solo se admiten los siguientes niveles de servicio de Filestore:

    • HDD básico con versión 1.21 de GKE o posterior
    • SSD básico con versión 1.21 de GKE o posterior
    • Zonal (de 10 TiB a 100 TiB) con la versión 1.27 de GKE o una posterior
    • Enterprise con la versión 1.25 de GKE o posterior
  • Usa las versiones 1.17 o posteriores del plano de control. Para usar el controlador CSI de Filestore en un VolumeSnapshot, usa el número de versión de GKE aplicable a tu nivel de servicio.

  • 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 PersistentVolume tenga una sección csi con driver: pd.csi.storage.gke.io o filestore.csi.storage.gke.io. Si el controlador CSI aprovisiona de forma dinámica el PersistentVolume como se describe en las siguientes secciones, entonces lo administra el controlador CSI.

Limitaciones

  • Los volúmenes de instantáneas tienen las mismas restricciones de tamaño que los volúmenes regulares. Por ejemplo, las instantáneas de Filestore deben ser mayores o iguales que 1 TiB en tamaño para el nivel HDD básico.

  • El controlador de CSI de Filestore no admite el aprovisionamiento dinámico ni los flujos de trabajo de copia de seguridad para los siguientes niveles de servicio de Filestore:

    • Zonal (de 1 TiB a 9.75 TiB)
    • Regional
  • Solo puedes crear una copia de seguridad de un recurso compartido por instancia a la vez En lo que respecta a los grupos de almacenamiento, las solicitudes de copia de seguridad emitidas desde dos archivos compartidos diferentes de dos instancias de Filestore diferentes se ejecutarán de forma simultánea.

  • Las copias de seguridad de Singleshare solo se pueden restablecer en volúmenes de Singleshare. Con el controlador de CSI de Filestore, solo puedes restablecer un volumen de uso compartido único una nueva instancia de Filestore.

    • La instancia nueva debe usar el mismo nivel de servicio que la copia de seguridad.
    • La instancia nueva debe coincidir con la misma capacidad mínima que la copia de seguridad.
  • No se admiten las operaciones backup restore de Filestore a la fuente ni a una instancia de Filestore existente. Para obtener una lista completa de las limitaciones de las funciones, consulta Limitaciones de las funciones de copia de seguridad de Filestore.

  • Las copias de seguridad de recursos compartidos múltiples no son compatibles.

Antes de comenzar

Antes de comenzar, asegúrate de haber realizado las siguientes tareas:

  • Habilita la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Si deseas usar Google Cloud CLI para esta tarea, instala y, luego, inicializa gcloud CLI. Si ya instalaste gcloud CLI, ejecuta gcloud components update para obtener la versión más reciente.

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 Deployment.
  2. Agrega un archivo a PersistentVolume que usa Deployment.
  3. Crear un VolumeSnapshotClass para configurar la instantánea.
  4. Crear una instantánea de volumen del PersistentVolume
  5. Borrar el archivo de prueba.
  6. Restablecer el PersistentVolume en la instantánea que creaste.
  7. Verificar que la restauración funcionó.

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

  1. Crea un objeto VolumeSnapshotClass a fin de especificar el controlador CSI y la política de eliminación para tu instantánea.
  2. Crea un objeto VolumeSnapshot para solicitar una instantánea de un PersistentVolumeClaim existente.
  3. 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 un Deployment

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

    Filestore

     apiVersion: v1
     kind: PersistentVolumeClaim
     metadata:
       name: my-pvc
     spec:
       storageClassName: enterprise-rwx
       accessModes:
       - ReadWriteMany
       resources:
         requests:
           storage: 1Ti
    

    En este ejemplo se crea una PVC de nivel empresarial de Filestore. Para obtener más información, consulta Accede a instancias de Filestore con el controlador de CSI de Filestore.

    Para spec.storageClassName, puedes especificar cualquier clase de almacenamiento que use un controlador CSI compatible.

  2. Aplica el manifiesto:

    kubectl apply -f my-pvc.yaml
    
  3. Para crear un Deployment, guarda el siguiente manifiesto como my-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: hello-app
    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: sdk-volume
              mountPath: /usr/share/hello/
          volumes:
          - name: sdk-volume
            persistentVolumeClaim:
              claimName: my-pvc
    
  4. Aplica el manifiesto:

    kubectl apply -f my-deployment.yaml
    
  5. Verifica el estado de Deployment:

    kubectl get deployment hello-app
    

    Es posible que Deployment tarde un poco en estar listo. Puedes ejecutar el comando anterior hasta que veas un resultado similar al siguiente:

    NAME        READY   UP-TO-DATE   AVAILABLE   AGE
    hello-app   1/1     1            1           2m55s
    

Agrega un archivo de prueba al volumen

  1. Enumera el Pods en el Deployment:

    kubectl get pods -l app=hello-app
    

    El resultado es similar al siguiente:

    NAME                         READY   STATUS    RESTARTS   AGE
    hello-app-6d7b457c7d-vl4jr   1/1     Running   0          2m56s
    
  2. Crea un archivo de prueba en un Pod:

    kubectl exec POD_NAME \
        -- sh -c 'echo "Hello World!" > /usr/share/hello/hello.txt'
    

    Reemplaza POD_NAME por el nombre de Pod.

  3. Verifica que el archivo exista:

    kubectl exec POD_NAME \
        -- sh -c 'cat /usr/share/hello/hello.txt'
    

    El resultado es similar al siguiente:

    Hello World!
    

Crea un objeto VolumeSnapshotClass

Crea un objeto VolumeSnapshotClass a fin de especificar el controlador CSI y deletionPolicy para la instantánea de volumen. Puedes hacer referencia a objetos VolumeSnapshotClass cuando creas objetos VolumeSnapshot.

  1. Guarda el siguiente manifiesto como volumesnapshotclass.yaml.

    Filestore

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotClass
    metadata:
      name: my-snapshotclass
    driver: filestore.csi.storage.gke.io
    parameters:
      type: backup
    deletionPolicy: Delete
    

    En este ejemplo:

    • El controlador de CSI usa el campo driver para aprovisionar la instantánea. En este ejemplo, filestore.csi.storage.gke.io usa el controlador de CSI de Filestore.
    • El campo deletionPolicy le indica a GKE qué hacer con el objeto VolumeSnapshotContent y la instantánea subyacente cuando se borra el objeto VolumeSnapshot vinculado. Especifica Delete para borrar el objeto VolumeSnapshotContent y la instantánea subyacente. Especifica Retain si deseas conservar VolumeSnapshotContent y la instantánea subyacente.
  2. Aplica el manifiesto:

    kubectl apply -f volumesnapshotclass.yaml
    

Crea una VolumeSnapshot

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

  1. Guarda el siguiente manifiesto como volumesnapshot.yaml.

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

    kubectl apply -f volumesnapshot.yaml
    

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

  3. Confirma que GKE creó el objeto VolumeSnapshotContents:

    kubectl get volumesnapshotcontents
    

    El resultado es similar al siguiente:

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

Después de crear el contenido de la instantánea Volume, el controlador CSI que especificaste en VolumeSnapshotClass crea una instantánea en el sistema de almacenamiento correspondiente. Una vez que GKE crea una instantánea en el sistema de almacenamiento y la vincula a un objeto de VolumeSnapshot del clúster, 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
my-snapshot        true

Borra el archivo de prueba

  1. Borra el archivo de prueba que creaste:

    kubectl exec POD_NAME \
        -- sh -c 'rm /usr/share/hello/hello.txt'
    
  2. Verifica que el archivo ya no exista:

    kubectl exec POD_NAME \
        -- sh -c 'cat /usr/share/hello/hello.txt'
    

    El resultado es similar al siguiente:

    cat: /usr/share/hello/hello.txt: No such file or directory
    

Restablece la instantánea de volumen

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

    Filestore

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-restore
    spec:
      dataSource:
        name: my-snapshot
        kind: VolumeSnapshot
        apiGroup: snapshot.storage.k8s.io
      storageClassName: enterprise-rwx
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 1Ti
    
  2. Aplica el manifiesto:

    kubectl apply -f pvc-restore.yaml
    
  3. Actualiza el archivo my-deployment.yaml para usar el PersistentVolumeClaim nuevo:

    ...
    volumes:
    - name: my-volume
      persistentVolumeClaim:
        claimName: pvc-restore
    
  4. Aplica el manifiesto actualizado:

    kubectl apply -f my-deployment.yaml
    

Verifica que la instantánea se haya restablecido correctamente

  1. Obtén el nombre del Pod nuevo que GKE crea para el Deployment actualizado:

     kubectl get pods -l app=hello-app
    

Verifica que el archivo de prueba exista:

   kubectl exec NEW_POD_NAME \
       -- sh -c 'cat /usr/share/hello/hello.txt'

Reemplaza NEW_POD_NAME por el nombre del nuevo Pod. que creó GKE.

El resultado es similar al siguiente:

   Hello World!

Importa una instantánea preexistente

Puedes usar una instantánea de volumen existente creada fuera del clúster actual para aprovisionar de forma manual el objeto VolumeSnapshotContents. Por ejemplo, puedes propagar un volumen en GKE con una instantánea de otro recurso de Google Cloud creado en un clúster diferente.

  1. Ubica el nombre de tu instantánea.

    Consola de Google Cloud

    Ve a https://console.cloud.google.com/compute/snapshots.

    Google Cloud CLI

    Ejecuta el siguiente comando:

    gcloud compute snapshots list
    

    El resultado es similar al siguiente:

    NAME                                           DISK_SIZE_GB  SRC_DISK                                                     STATUS
    snapshot-5e6af474-cbcc-49ed-b53f-32262959a0a0  1             us-central1-b/disks/pvc-69f80fca-bb06-4519-9e7d-b26f45c1f4aa READY
    
  2. Guarda el siguiente manifiesto VolumeSnapshot como restored-snapshot.yaml.

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshot
    metadata:
      name: restored-snapshot
    spec:
      volumeSnapshotClassName: my-snapshotclass
      source:
        volumeSnapshotContentName: restored-snapshot-content
    
  3. Aplica el manifiesto:

    kubectl apply -f restored-snapshot.yaml
    
  4. Guarda el siguiente manifiesto VolumeSnapshotContent como restored-snapshot-content.yaml. Reemplaza el campo snapshotHandle con el ID del proyecto y el nombre de la instantánea. Tanto volumeSnapshotRef.name como volumeSnapshotRef.namespace deben apuntar al VolumeSnapshot que se creó previamente para que la vinculación bidireccional sea válida.

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotContent
    metadata:
      name: restored-snapshot-content
    spec:
      deletionPolicy: Retain
      driver: filestore.csi.storage.gke.io
      source:
        snapshotHandle: projects/PROJECT_ID/global/snapshots/SNAPSHOT_NAME
      volumeSnapshotRef:
        kind: VolumeSnapshot
        name: restored-snapshot
        namespace: default
    
  5. Aplica el manifiesto:

    kubectl apply -f restored-snapshot-content.yaml
    
  6. Guarda el siguiente manifiesto PersistentVolumeClaim como restored-pvc.yaml. El controlador de almacenamiento de Kubernetes encontrará un VolumeSnapshot llamado restored-snapshot y, luego, intentará buscar o crear de forma dinámica un PersistentVolume como la fuente de datos. Luego, puedes usar este PVC en un Pod para acceder a los datos restablecidos.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: restored-pvc
    spec:
      dataSource:
        name: restored-snapshot
        kind: VolumeSnapshot
        apiGroup: snapshot.storage.k8s.io
      storageClassName: enterprise-rwx
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
    
  7. Aplica el manifiesto:

    kubectl apply -f restored-pvc.yaml
    
  8. Guarda el siguiente manifiesto Pod como restored-pod.yaml que hace referencia a PersistentVolumeClaim. El controlador CSI aprovisionará un PersistentVolume y lo propagará a partir de la instantánea.

    apiVersion: v1
    kind: Pod
    metadata:
      name: restored-pod
    spec:
      containers:
      - name: busybox
        image: busybox
        args:
        - sleep
        - "3600"
        volumeMounts:
        - name: source-data
          mountPath: /demo/data
      volumes:
      - name: source-data
        persistentVolumeClaim:
          claimName: restored-pvc
          readOnly: false
    
  9. Aplica el manifiesto:

    kubectl apply -f restored-pod.yaml
    
  10. Verifica que el archivo se haya restablecido:

    kubectl exec restored-pod -- sh -c 'cat /demo/data/hello.txt'
    

Limpia

Sigue estos pasos para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos que usaste en esta página.

  1. Borra VolumeSnapshot:

    kubectl delete volumesnapshot my-snapshot
    
  2. Borra VolumeSnapshotClass:

    kubectl delete volumesnapshotclass my-snapshotclass
    
  3. Borra Deployment:

    kubectl delete deployments hello-app
    
  4. Borra los objetos PersistentVolumeClaim:

    kubectl delete pvc my-pvc pvc-restore
    

¿Qué sigue?