Optimizar el rendimiento y los costes del almacenamiento con grupos de almacenamiento de Hyperdisk


En esta página se describe cómo pueden agrupar y compartir capacidad de almacenamiento, rendimiento y IOPS entre discos tus clústeres de Google Kubernetes Engine (GKE) mediante los grupos de almacenamiento de Hyperdisk de GKE.

Información general

Los grupos de almacenamiento agrupan de forma lógica los dispositivos de almacenamiento físico, lo que te permite segmentar tus recursos. Puedes aprovisionar Hyperdisks de Google Cloud en estos grupos de almacenamiento, lo que crea grupos de almacenamiento de Hyperdisk. Los grupos de almacenamiento Hyperdisk ofrecen capacidad, rendimiento y IOPS preaprovisionados que pueden compartir los discos de tu clúster de GKE.

Puedes usar los grupos de almacenamiento de Hyperdisk para gestionar tus recursos de almacenamiento de forma más eficiente y rentable. De esta forma, puedes aprovechar tecnologías de eficiencia como la deduplicación y el aprovisionamiento ligero.

En esta guía, usarás la zona us-east4-c para crear el grupo de almacenamiento equilibrado de Hyperdisk y otros recursos.

Consideraciones de planificación

Antes de aprovisionar y consumir tu grupo de almacenamiento de Hyperdisk, ten en cuenta los siguientes requisitos y limitaciones.

Crear y gestionar grupos de almacenamiento

Se aplican los siguientes requisitos y limitaciones:

Aprovisionar discos de arranque en grupos de almacenamiento

Se aplican los siguientes requisitos y limitaciones:

Aprovisionar discos conectados en grupos de almacenamiento

Se aplican los siguientes requisitos y limitaciones:

  • La versión mínima de GKE necesaria para aprovisionar discos adjuntos en grupos de almacenamiento es la 1.29.2-gke.1035000 o una posterior.
  • Comprueba que el controlador de CSI para Persistent Disk en Compute Engine esté habilitado. El controlador de disco persistente de Compute Engine está habilitado de forma predeterminada en los clústeres Autopilot y Standard nuevos, y no se puede inhabilitar ni editar en los clústeres Autopilot. Para habilitar el controlador, consulta Habilitar el controlador de CSI para Persistent Disk en Compute Engine en un clúster.
  • Comprueba que el grupo de almacenamiento esté en al menos una de las ubicaciones de los nodos del clúster y en las ubicaciones de los nodos del grupo de nodos.
  • Solo puedes aprovisionar discos conectados de Hyperdisk Throughput y Hyperdisk Balanced en grupos de almacenamiento. El tipo del disco adjunto debe coincidir con el tipo del grupo de almacenamiento. Para obtener más información, consulta Tipos de grupos de almacenamiento de Hyperdisk.
  • En un StorageClass, solo se permite un pool de almacenamiento por zona.
  • En un StorageClass, todos los grupos de almacenamiento deben tener el tipo de grupo de almacenamiento.
  • Asegúrate de que el tipo de máquina que ejecuta tu pod admita adjuntar el tipo de disco que estás usando desde el pool de almacenamiento. Para obtener más información, consulta Tipos de máquinas compatibles con Hyperdisk.

Cuota

Al crear un grupo de almacenamiento de Hyperdisk, puedes configurarlo con aprovisionamiento estándar o avanzado de capacidad y rendimiento. Si quiere aumentar la cuota de capacidad, de rendimiento o de IOPS, solicite una cuota más alta para el filtro de cuota correspondiente.

Para obtener más información, consulta Ver las cuotas de tu proyecto y Solicitar un ajuste de cuota.

Usa los siguientes filtros de cuota para los grupos de almacenamiento equilibrados de Hyperdisk:

  • HDB-STORAGE-POOL-TOTAL-ADVANCED-CAPACITY-per-project-region: para aumentar la capacidad con el aprovisionamiento avanzado de capacidad.
  • HDB-STORAGE-POOL-TOTAL-ADVANCED-IOPS-per-project-region: para aumentar las IOPS con el aprovisionamiento de rendimiento avanzado.
  • HDB-STORAGE-POOL-TOTAL-ADVANCED-THROUGHPUT-per-project-region: para aumentar el rendimiento con el aprovisionamiento de rendimiento avanzado.
  • HDB-TOTAL-GB-per-project-region: para aumentar la capacidad con el aprovisionamiento de capacidad estándar.
  • HDB-TOTAL-IOPS-per-project-region: para aumentar las IOPS con el aprovisionamiento de rendimiento estándar.
  • HDB-TOTAL-THROUGHPUT-per-project-region: para aumentar el rendimiento con el aprovisionamiento de rendimiento estándar.

Usa los siguientes filtros de cuota para los grupos de almacenamiento de rendimiento de Hyperdisk:

  • HDT-STORAGE-POOL-TOTAL-ADVANCED-CAPACITY-per-project-region: para aumentar la capacidad con el aprovisionamiento avanzado de capacidad.
  • HDT-STORAGE-POOL-TOTAL-ADVANCED-THROUGHPUT-per-project-region: para aumentar el rendimiento con el aprovisionamiento de rendimiento avanzado.
  • HDT-TOTAL-GB-per-project-region: para aumentar la capacidad con el aprovisionamiento de capacidad estándar.
  • HDT-TOTAL-THROUGHPUT-per-project-region: para aumentar el rendimiento con el aprovisionamiento de rendimiento estándar.

Por ejemplo, si quieres aumentar la capacidad total de los grupos de almacenamiento de HyperDisk equilibrados con aprovisionamiento de capacidad avanzado por proyecto y por región, solicita un aumento de cuota para el siguiente filtro:

hdb-storage-pool-total-advanced-capacity-per-project-region.

Precios

Para obtener información sobre los precios, consulta la sección Precios de los grupos de almacenamiento de Hyperdisk .

Antes de empezar

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

  • Habilita la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Si quieres usar Google Cloud CLI para esta tarea, instálala y, a continuación, inicialízala. Si ya has instalado la gcloud CLI, obtén la versión más reciente ejecutando gcloud components update.

Crear un grupo de almacenamiento de Hyperdisk

Crea un grupo de almacenamiento de Hyperdisk antes de aprovisionar discos de arranque o discos conectados en ese grupo de almacenamiento. Para obtener más información, consulta Crear grupos de almacenamiento de Hyperdisk.

Crea los grupos de almacenamiento en una de las zonas admitidas.

Por ejemplo, usa el siguiente comando para crear un grupo de almacenamiento Hyperdisk Balanced con capacidad y rendimiento avanzados, y aprovisiona 10 TB de capacidad, 10.000 IOPS/s y 1024 MBps de rendimiento en la zona us-east4-c:

export PROJECT_ID=PROJECT_ID
export ZONE=us-east4-c
gcloud compute storage-pools create pool-$ZONE \
    --provisioned-capacity=10tb --storage-pool-type=hyperdisk-balanced \
    --zone=$ZONE --project=$PROJECT_ID --capacity-provisioning-type=advanced \
    --performance-provisioning-type=advanced --provisioned-iops=10000 \
    --provisioned-throughput=1024

Sustituye PROJECT_ID por el ID de tu cuenta o proyecto. Google Cloud

Inspeccionar zonas de grupos de almacenamiento

  • En los clústeres de Autopilot y los clústeres estándar con aprovisionamiento automático de nodos habilitado, puedes crear un grupo de almacenamiento en cualquier zona de la región del clúster. Si no hay ningún grupo de nodos en la zona en la que has creado el grupo de almacenamiento, los pods permanecerán en el estado Pending hasta que la herramienta de adaptación dinámica del clúster de GKE pueda aprovisionar un nuevo grupo de nodos en esa zona.

  • En los clústeres estándar sin aprovisionamiento automático de nodos, crea grupos de almacenamiento en las zonas de nodos predeterminadas de tu clúster, ya que los grupos de almacenamiento son recursos zonales. Puedes definir las zonas de los nodos de tu clúster con la marca --node-locations.

    • En los clústeres zonales, si no especificas el --node-locations, todos los nodos se crean en la zona principal del clúster.
    • En el caso de los clústeres regionales, si no especificas el --node-locations, GKE distribuye los nodos de trabajador en tres zonas elegidas aleatoriamente dentro de la región.

Para inspeccionar las zonas de nodos predeterminadas de un clúster, ejecuta el siguiente comando:

gcloud container clusters describe CLUSTER_NAME  | yq '.locations'

Sustituye CLUSTER_NAME por el nombre del clúster que quieras crear al aprovisionar un disco de arranque o un disco conectado.

Aprovisionar un disco de arranque de GKE en un grupo de almacenamiento de Hyperdisk

Puedes aprovisionar un disco de arranque de GKE en un grupo de almacenamiento de Hyperdisk cuando hagas lo siguiente:

  • Al crear un clúster de GKE
  • Al crear un grupo de nodos
  • Al actualizar un grupo de nodos

Al crear un clúster

Para crear un clúster de GKE con discos de arranque aprovisionados en un pool de almacenamiento, usa el siguiente comando:

gcloud container clusters create CLUSTER_NAME \
    --disk-type=DISK_TYPE --storage-pools=STORAGE_POOL,[...] \
    --node-locations=ZONE,[...] --machine-type=MACHINE_TYPE \
    --location=CONTROL_PLANE_LOCATION

Haz los cambios siguientes:

  • CLUSTER_NAME: Proporciona un nombre único para el clúster que vas a crear.
  • DISK_TYPE: asigna el valor hyperdisk-balanced.. Si se deja en blanco, el tipo de disco será Hyperdisk Balanced de forma predeterminada.
  • STORAGE_POOL,[...]: lista separada por comas de las rutas de recursos del grupo de almacenamiento (por ejemplo, projects/my-project/zones/us-east4-c/storagePools/pool-us-east4-c) donde se aprovisionarán los discos de arranque del clúster. Asegúrate de que las zonas de las rutas de recursos del pool de almacenamiento coincidan con las zonas de --node-locations.
  • ZONE,[...]: lista de zonas separadas por comas en las que se debe replicar la huella de tu nodo. En el caso de los clústeres regionales, puedes especificar regiones. Todas las zonas deben estar en la misma región que el clúster, especificada por la marca --location.
  • MACHINE_TYPE: el tipo de máquina admitido que quieras usar en tus nodos.
  • CONTROL_PLANE_LOCATION: la ubicación de Compute Engine del plano de control de tu clúster. Proporciona una región para los clústeres regionales o una zona para los clústeres zonales.

Al crear un grupo de nodos

Para crear un grupo de nodos de GKE con discos de arranque aprovisionados en un grupo de almacenamiento, usa el siguiente comando:

gcloud container node-pools create NODE_POOL_NAME \
    --disk-type=DISK_TYPE --storage-pools=STORAGE_POOL,[...] \
    --node-locations=ZONE,[...] --machine-type=MACHINE_TYPE \
    --location=CONTROL_PLANE_LOCATION --cluster=CLUSTER_NAME

Sustituye lo siguiente:

  • NODE_POOL_NAME: Proporciona un nombre único para el grupo de nodos que vas a crear.
  • DISK_TYPE: asigna el valor hyperdisk-balanced.. Si se deja en blanco, el tipo de disco será Hyperdisk Balanced de forma predeterminada.
  • STORAGE_POOL,[...]: lista separada por comas de las rutas de recursos del grupo de almacenamiento (por ejemplo, projects/my-project/zones/us-east4-c/storagePools/pool-us-east4-c) donde se aprovisionarán los discos de arranque del clúster. Asegúrate de que las zonas de las rutas de recursos del grupo de almacenamiento coincidan con los valores de --node-locations.
  • ZONE,[...]: lista de zonas separadas por comas en las que se debe replicar la huella de tu nodo. Todas las zonas deben estar en la misma región que el clúster, especificada por la marca -location.
  • MACHINE_TYPE: el tipo de máquina admitido que quieras usar en tus nodos.
  • CONTROL_PLANE_LOCATION: la ubicación de Compute Engine del plano de control de tu clúster. Proporciona una región para los clústeres regionales o una zona para los clústeres zonales.
  • CLUSTER_NAME: Un clúster en el que vas a crear el grupo de nodos.

Al actualizar un grupo de nodos

Puedes usar el comando update para añadir o sustituir grupos de almacenamiento en un grupo de nodos. Este comando no se puede usar para quitar grupos de almacenamiento de un grupo de nodos.

Para actualizar un grupo de nodos de GKE de forma que sus discos de arranque se aprovisionen en un pool de almacenamiento, usa el siguiente comando.

gcloud container node-pools update NODE_POOL_NAME \
  --storage-pools=STORAGE_POOL,[...] \
  --location=CONTROL_PLANE_LOCATION --cluster=CLUSTER_NAME
  • NODE_POOL_NAME: nombre de un grupo de nodos que ya exista y que quieras actualizar para que use un grupo de almacenamiento.
  • STORAGE_POOL,[...]: lista separada por comas de rutas de recursos de grupos de almacenamiento (por ejemplo, projects/my-project/zones/us-east4-c/storagePools/pool-us-east4-c). Asegúrate de que las zonas de las rutas de recursos de grupos de almacenamiento coincidan con la zona del grupo de nodos que vas a actualizar.
  • CONTROL_PLANE_LOCATION: la ubicación de Compute Engine del plano de control de tu clúster. Proporciona una región para los clústeres regionales o una zona para los clústeres zonales.
  • CLUSTER_NAME: el nombre del clúster de GKE al que pertenece este grupo de nodos.

Para aplicar este cambio, es necesario volver a crear los nodos, lo que puede provocar interrupciones en las cargas de trabajo en ejecución. Para obtener información sobre este cambio concreto, busca la fila correspondiente en la tabla Cambios manuales que recrean los nodos mediante una estrategia de actualización de nodos sin respetar las políticas de mantenimiento. Para obtener más información sobre las actualizaciones de nodos, consulta Planificar interrupciones de actualizaciones de nodos.

Aprovisionar un disco adjunto de GKE en un grupo de almacenamiento Hyperdisk

En esta sección:

  • Crea un clúster de GKE con discos adjuntos aprovisionados en un grupo de almacenamiento.
  • Crea una StorageClass para aprovisionar de forma dinámica un PersistentVolume (PV) cuando un pod lo solicite a través de un PersistentVolumeClaim (PVC). Para que un PV consuma los recursos compartidos del grupo de almacenamiento, debes especificar el grupo de almacenamiento mediante el parámetro storage-pools en tu StorageClass. La StorageClass se usa en una PVC para aprovisionar el volumen Hyperdisk Balanced que usará el pod.
  • Crea un PVC para solicitar un PV (una parte del almacenamiento de Hyperdisk) para un Pod de tu clúster de GKE. De esta forma, puedes beneficiarte de los recursos compartidos del grupo de almacenamiento.
  • Crea un Deployment que use una PVC para asegurarte de que tu aplicación tenga acceso al almacenamiento persistente incluso después de que se reinicien y se vuelvan a programar los pods.

Crear un clúster de GKE

Antes de empezar, consulta las consideraciones para aprovisionar un disco adjunto.

Autopilot

Para crear un clúster de Autopilot con la CLI de gcloud, consulta Crear un clúster de Autopilot.

Ejemplo:

gcloud container clusters create-auto CLUSTER_NAME --location=CONTROL_PLANE_LOCATION

Haz los cambios siguientes:

  • CLUSTER_NAME: proporciona un nombre único para el clúster que vas a crear.
  • CONTROL_PLANE_LOCATION: la región de Compute Engine del plano de control de tu clúster.

Para seleccionar un tipo de máquina compatible, especifica el cloud.google.com/compute-class: Performance nodeSelector al crear un Deployment. Para ver una lista de las series de máquinas de Compute Engine disponibles con la clase de computación Rendimiento, consulta Series de máquinas admitidas.

Estándar

Para crear un clúster zonal estándar con la CLI de gcloud, consulta Crear un clúster zonal.

Para crear un clúster regional estándar con la CLI de gcloud, consulta Crear un clúster regional.

Ejemplo:

gcloud container clusters create CLUSTER_NAME --location=CONTROL_PLANE_LOCATION --project=PROJECT_ID --machine-type=MACHINE_TYPE --disk-type="DISK_TYPE"

Haz los cambios siguientes:

  • CLUSTER_NAME: Proporciona un nombre único para el clúster que vas a crear.
  • CONTROL_PLANE_LOCATION: la ubicación de Compute Engine del plano de control de tu clúster. Proporciona una región para los clústeres regionales o una zona para los clústeres zonales.
  • PROJECT_ID: el ID de proyecto de tu cuenta de Google Cloud .
  • MACHINE_TYPE: el tipo de máquina admitido que quieras usar en tus nodos.
  • DISK_TYPE: asigna el valor hyperdisk-balanced.. Si se deja en blanco, el tipo de disco será Hyperdisk Balanced de forma predeterminada.

Crear un StorageClass

En Kubernetes, para indicar que quieres que tu PV se cree en un pool de almacenamiento, usa una StorageClass. Para obtener más información, consulta StorageClasses.

Para crear una StorageClass con el nivel de IOPS o de rendimiento que quieras, sigue estos pasos:

  • Usa pd.csi.storage.gke.io en el campo del aprovisionador.
  • Especifica el tipo de almacenamiento Hyperdisk Balanced.
  • Especifica el parámetro storage-pools con el valor de una lista de grupos de almacenamiento específicos que quieras usar. Cada grupo de almacenamiento de la lista debe especificarse con el siguiente formato: projects/PROJECT_ID/zones/ZONE/storagePools/STORAGE_POOL_NAME.
  • Si quiere, especifique los parámetros de rendimiento provisioned-throughput-on-create y provisioned-iops-on-create..

Cada tipo de hiperdisco tiene valores predeterminados de rendimiento determinados por el tamaño de disco inicial aprovisionado. Cuando creas un StorageClass, puedes especificar los siguientes parámetros en función de tu tipo de Hyperdisk. Si omite estos parámetros, GKE usará los valores predeterminados del tipo de disco basado en la capacidad.

Parámetro Tipo de Hyperdisk Uso
provisioned-throughput-on-create Hyperdisk Balanced y Hyperdisk Throughput Indica el valor de rendimiento en MiB/s con el calificador "Mi". Por ejemplo, si el rendimiento que necesitas es de 250 MiB/s, especifica "250Mi" al crear StorageClass.
provisioned-iops-on-create Hyperdisk Balanced e Hyperdisk IOPS El valor de IOPS debe expresarse sin ningún calificador. Por ejemplo, si necesitas 7000 IOPS, especifica "7000" al crear StorageClass.

Para obtener información sobre los valores permitidos de la capacidad de procesamiento o las IOPS, consulta Planificar el nivel de rendimiento de un volumen de Hyperdisk.

Usa el siguiente manifiesto para crear y aplicar una StorageClass llamada storage-pools-sc para aprovisionar dinámicamente un PV en el pool de almacenamiento projects/my-project/zones/us-east4-c/storagePools/pool-us-east4-c:

kubectl apply -f - <<EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: storage-pools-sc
provisioner: pd.csi.storage.gke.io
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
parameters:
  type: hyperdisk-balanced
  provisioned-throughput-on-create: "140Mi"
  provisioned-iops-on-create: "3000"
  storage-pools: projects/my-project/zones/us-east4-c/storagePools/pool-us-east4-c
EOF

Si se utiliza volumeBindingMode: WaitForFirstConsumer en esta StorageClass, el enlace y el aprovisionamiento de una PVC se retrasan hasta que se crea un Pod que utilice la PVC. De esta forma, se asegura de que el volumen persistente no se aprovisione prematuramente y de que haya una coincidencia de zona entre el volumen persistente y el pod que lo consume. Si sus zonas no coinciden, el Pod permanecerá en estado Pending.

Crear un PersistentVolumeClaim (PVC)

Crea una PVC que haga referencia a la storage-pools-sc StorageClass que has creado.

Usa el siguiente manifiesto para crear una PVC llamada my-pvc, con 2048 GiB como capacidad de almacenamiento de destino del volumen Hyperdisk Balanced:

kubectl apply -f - <<EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  storageClassName: storage-pools-sc
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 2048Gi
EOF

Crear un Deployment que use el PVC

Práctica recomendada:

Cuando uses pods con PersistentVolumes, usa un controlador de carga de trabajo, como un Deployment o un StatefulSet.

Para asegurarte de que los pods se puedan programar en un grupo de nodos con una serie de máquinas que admita Hyperdisk Balanced, configura un Deployment con el cloud.google.com/machine-family selector de nodos. Para obtener más información, consulta Tipos de máquinas compatibles con Hyperdisk. Usas la serie de máquinas c3 en la siguiente implementación de ejemplo.

Crea y aplica el siguiente manifiesto para configurar un pod que implemente un servidor web de Postgres con el PVC creado en la sección anterior:

Autopilot

En los clústeres Autopilot, especifica cloud.google.com/compute-class: Performance nodeSelector para aprovisionar un volumen Hyperdisk Balanced. Para obtener más información, consulta Solicitar un nodo dedicado para un pod.

kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres
spec:
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      nodeSelector:
        cloud.google.com/machine-family: c3
        cloud.google.com/compute-class: Performance
      containers:
      - name: postgres
        image: postgres:14-alpine
        args: [ "sleep", "3600" ]
        volumeMounts:
        - name: sdk-volume
          mountPath: /usr/share/data/
      volumes:
      - name: sdk-volume
        persistentVolumeClaim:
          claimName: my-pvc
EOF

Estándar

En los clústeres estándar en los que no está habilitado el aprovisionamiento automático de nodos, asegúrate de que haya un grupo de nodos con la serie de máquinas especificada en funcionamiento antes de crear el Deployment. De lo contrario, el pod no se podrá programar.

kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres
spec:
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      nodeSelector:
        cloud.google.com/machine-family: c3
      containers:
      - name: postgres
        image: postgres:14-alpine
        args: [ "sleep", "3600" ]
        volumeMounts:
        - name: sdk-volume
          mountPath: /usr/share/data/
      volumes:
      - name: sdk-volume
        persistentVolumeClaim:
          claimName: my-pvc
EOF

Confirma que el despliegue se ha creado correctamente:

  kubectl get deployment

Las instancias de Hyperdisk pueden tardar unos minutos en completar el aprovisionamiento y mostrar el estado READY.

Confirmar si el disco adjunto está aprovisionado

  1. Comprueba si tu PVC llamado my-pvc se ha enlazado correctamente a un PV:

    kubectl get pvc my-pvc
    

    El resultado debería ser similar al siguiente:

    
    NAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS       AGE
    my-pvc        Bound    pvc-1ff52479-4c81-4481-aa1d-b21c8f8860c6   2Ti        RWO            storage-pools-sc   2m24s
    
  2. Comprueba si el volumen se ha aprovisionado tal como se especifica en StorageClass y PVC:

    gcloud compute storage-pools list-disks pool-us-east4-c --zone=us-east4-c
    

    El resultado debería ser similar al siguiente:

    NAME                                      STATUS  PROVISIONED_IOPS  PROVISIONED_THROUGHPUT  SIZE_GB
    pvc-1ff52479-4c81-4481-aa1d-b21c8f8860c6  READY   3000              140                     2048
    

Crear capturas y restaurar discos conectados en grupos de almacenamiento

No se pueden mover discos dentro ni fuera de un grupo de almacenamiento. Para mover un disco a un pool de almacenamiento o sacarlo de él, vuelve a crear el disco a partir de una instantánea. Para obtener más información, consulta Cambiar el tipo de disco.

En esta sección:

Crear un archivo de prueba

Para crear y verificar un archivo de prueba, sigue estos pasos:

  1. Obtén el nombre del pod de la implementación de PostgreSQL:

    kubectl get pods -l app=postgres
    

    El resultado debería ser similar al siguiente:

    NAME                         READY   STATUS    RESTARTS   AGE
    postgres-78fc84c9ff-77vx6   1/1     Running   0          44s
    
  2. Crea un archivo de prueba hello.txt en el pod:

    kubectl exec postgres-78fc84c9ff-77vx6 \
      -- sh -c 'echo "Hello World!" > /usr/share/data/hello.txt'
    
  3. Comprueba que se ha creado el archivo de prueba:

    kubectl exec postgres-78fc84c9ff-77vx6 \
      -- sh -c 'cat /usr/share/data/hello.txt'
    Hello World!
    

Crear una captura de volumen y eliminar un archivo de prueba

Para crear y verificar una captura:

  1. Crea un objeto VolumeSnapshotClass que especifique cómo se deben tomar y gestionar las capturas de tus volúmenes:

    kubectl apply -f - <<EOF
    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotClass
    metadata:
      name: my-snapshotclass
    driver: pd.csi.storage.gke.io
    deletionPolicy: Delete
    EOF
    
  2. Crea un VolumeSnapshot y haz una captura del volumen enlazado al my-pvc PersistentVolumeClaim:

    kubectl apply -f - <<EOF
    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshot
    metadata:
      name: my-snapshot
    spec:
      volumeSnapshotClassName: my-snapshotclass
      source:
        persistentVolumeClaimName: my-pvc
    EOF
    
  3. Verifica que se haya creado el contenido de la instantánea del volumen:

    kubectl get volumesnapshotcontents
    

    El resultado debería ser similar al siguiente:

    NAME                                               READYTOUSE   RESTORESIZE     DELETIONPOLICY   DRIVER                  VOLUMESNAPSHOTCLASS   VOLUMESNAPSHOT   VOLUMESNAPSHOTNAMESPACE   AGE
    snapcontent-e778fde2-5f1c-4a42-a43d-7f9d41d093da   false        2199023255552   Delete           pd.csi.storage.gke.io   my-snapshotclass      my-snapshot      default                   33s
    
  4. Confirma que la captura esté lista para usarse:

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

    El resultado debería ser similar al siguiente:

    NAME          READY
    my-snapshot   true
    
  5. Elimina el archivo de prueba original hello.txt que se creó en el pod postgres-78fc84c9ff-77vx6:

    kubectl exec postgres-78fc84c9ff-77vx6 \
        -- sh -c 'rm /usr/share/data/hello.txt'
    

Restaurar la captura del volumen

Para restaurar la copia de seguridad del volumen y los datos, sigue estos pasos:

  1. Crea un nuevo PVC que restaure los datos de una captura y asegúrate de que el nuevo volumen se aprovisione en el mismo pool de almacenamiento (storage-pools-sc) que el volumen original. Aplica el siguiente archivo de manifiesto:

    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-restore
    spec:
      dataSource:
        name: my-snapshot
        kind: VolumeSnapshot
        apiGroup: snapshot.storage.k8s.io
      storageClassName: storage-pools-sc
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 2048Gi
    EOF
    
  2. Actualiza la implementación postgres para que use el PVC que acabas de restaurar. Aplica el siguiente archivo de manifiesto:

    kubectl apply -f - <<EOF
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: postgres
    spec:
      selector:
        matchLabels:
          app: postgres
      template:
        metadata:
          labels:
            app: postgres
        spec:
          nodeSelector:
            cloud.google.com/machine-family: c3
          containers:
          - name: postgres
            image: google/cloud-sdk:slim
            args: [ "sleep", "3600" ]
            volumeMounts:
            - name: sdk-volume
              mountPath: /usr/share/data/
          volumes:
          - name: sdk-volume
            persistentVolumeClaim:
              claimName: pvc-restore
    EOF
    
  3. Obtén el nombre del Pod recién creado que forma parte del postgres Deployment:

    kubectl get pods -l app=postgres
    

    El resultado debería ser similar al siguiente:

    NAME                         READY   STATUS        RESTARTS   AGE
    postgres-59f89cfd8c-42qtj   1/1     Running       0          40s
    
  4. Verifica que el archivo hello.txt, que se había eliminado anteriormente, ahora esté en el nuevo pod (postgres-59f89cfd8c-42qtj) después de restaurar el volumen a partir de la instantánea:

    kubectl exec postgres-59f89cfd8c-42qtj \
     -- sh -c 'cat /usr/share/data/hello.txt'
    Hello World!
    

    De esta forma, se valida que el proceso de creación de la captura y restauración se ha completado correctamente y que los datos de la captura se han restaurado en el nuevo volumen persistente al que puede acceder el pod.

  5. Confirma que el volumen creado a partir de la instantánea se encuentra en tu grupo de almacenamiento:

    kubectl get pvc pvc-restore
    

    El resultado debería ser similar al siguiente:

    NAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS       AGE
    pvc-restore   Bound    pvc-b287c387-bc51-4100-a00e-b5241d411c82   2Ti        RWO            storage-pools-sc   2m24s
    
  6. Comprueba si el nuevo volumen se ha aprovisionado tal como se especifica en StorageClass y PVC:

    gcloud compute storage-pools list-disks pool-us-east4-c --zone=us-east4-c
    

    El resultado es similar al siguiente, donde se puede ver el nuevo volumen pvc-b287c387-bc51-4100-a00e-b5241d411c82 aprovisionado en el mismo grupo de almacenamiento.

    
    NAME                                      STATUS  PROVISIONED_IOPS  PROVISIONED_THROUGHPUT  SIZE_GB
    pvc-1ff52479-4c81-4481-aa1d-b21c8f8860c6  READY   3000              140                     2048
    pvc-b287c387-bc51-4100-a00e-b5241d411c82  READY   3000              140                     2048
    

    De esta forma, el volumen restaurado se beneficia de los recursos y las funciones compartidos del pool.

Migrar volúmenes a un pool de almacenamiento

Usa la función de creación de instantáneas y restauración para migrar volúmenes que se encuentren fuera de un grupo de almacenamiento a un grupo de almacenamiento.

Asegúrate de que se cumplan las siguientes condiciones:

  • Tu nuevo PVC pvc-restore hace referencia a una StorageClass que sí especifica el parámetro storage-pools, que apunta al grupo de almacenamiento al que quieres mover el volumen.
  • El PV de origen del que se va a crear una instantánea debe estar asociado a un PVC con una StorageClass que no especifique el parámetro storage-pools.

Después de restaurar una captura en un volumen nuevo, puedes eliminar el PVC y el PV de origen.

Limpieza

Para evitar que se apliquen cargos en tu cuenta de Google Cloud , elimina los recursos de almacenamiento que has creado en esta guía. Primero, elimina todos los discos del grupo de almacenamiento y, a continuación, elimina el grupo de almacenamiento.

Eliminar el disco de arranque

Cuando eliminas un nodo (reduciendo la escala del grupo de nodos) o un grupo de nodos completo, los discos de arranque asociados se eliminan automáticamente. También puede eliminar el clúster para eliminar automáticamente los discos de arranque de todos los grupos de nodos que contenga.

Para obtener más información, consulta estos artículos:

Eliminar el disco adjunto

Para eliminar el disco adjunto aprovisionado en un grupo de almacenamiento Hyperdisk, sigue estos pasos:

  1. Elimina el pod que usa el PVC:

    kubectl delete deployments postgres
    
  2. Elimina el PVC que usa el StorageClass del grupo de almacenamiento Hyperdisk.

    kubectl delete pvc my-pvc
    

    Confirma que se ha eliminado el PVC pvc-1ff52479-4c81-4481-aa1d-b21c8f8860c6:

    gcloud compute storage-pools list-disks pool-us-east4-c --zone=us-east4-c
    

Eliminar el grupo de almacenamiento de Hyperdisk

Elimina el grupo de almacenamiento de Hyperdisk con el siguiente comando:

gcloud compute storage-pools delete pool-us-east4-c --zone=us-east4-c --project=my-project

Siguientes pasos