Activa los buckets de Cloud Storage como volúmenes persistentes


En esta guía, se muestra cómo usar volúmenes persistentes de Kubernetes respaldados por tus buckets de Cloud Storage para administrar los recursos de almacenamiento de tus Pods de Kubernetes en Google Kubernetes Engine (GKE). Considera usar esta opción de almacenamiento si ya conoces los PersistentVolumes y deseas mantener la coherencia con tus implementaciones existentes que dependen de este tipo de recurso.

Esta guía está dirigida a los administradores de la plataforma y a los usuarios operadores que desean simplificar la administración del almacenamiento para sus aplicaciones de GKE.

Antes de leer esta página, asegúrate de conocer los volúmenes persistentes de Kubernetes, los Pods de Kubernetes y los buckets de Cloud Storage.

Si deseas una interfaz optimizada basada en Pods que no requiera experiencia previa con volúmenes persistentes de Kubernetes, consulta Cómo activar buckets de Cloud Storage como volúmenes efímeros de CSI.

Antes de comenzar

Asegúrate de haber completado los siguientes requisitos previos:

Cómo funcionan los volúmenes persistentes para buckets de Cloud Storage

Con el aprovisionamiento estático, creas uno o más objetos PersistentVolume que contienen los detalles del sistema de almacenamiento subyacente. Luego, los Pods de tus clústeres pueden consumir el almacenamiento a través de PersistentVolumeClaims.

Usar un volumen persistente respaldado por un bucket de Cloud Storage implica las siguientes operaciones:

  1. Definición de almacenamiento: Defines un PersistentVolume en tu clúster de GKE, incluido el controlador de CSI que se usará y cualquier parámetro requerido. En el controlador de CSI de Cloud Storage FUSE, debes especificar el nombre del bucket y otros detalles relevantes.

    De manera opcional, puedes ajustar el rendimiento de tu controlador de CSI con la función de almacenamiento en caché de archivos. El almacenamiento en caché de archivos puede mejorar el rendimiento de las apps de GKE, ya que almacena en caché los archivos de Cloud Storage a los que se accede con frecuencia en un disco local más rápido.

    Además, puedes usar la función de descarga en paralelo para acelerar la lectura de archivos grandes de Cloud Storage para descargas de varios subprocesos. Puedes usar esta función para mejorar los tiempos de carga del modelo, especialmente para las lecturas de más de 1 GB.

  2. Invocación del controlador: Cuando un objeto PersistentVolumeClaim solicita almacenamiento que coincide con la especificación del objeto PersistentVolume, GKE invoca el controlador de CSI de FUSE de Cloud Storage.

  3. Activación del bucket: El controlador CSI activa el bucket en el nodo en el que se programa el Pod solicitante. Esto hace que el contenido del bucket sea accesible para el Pod como un directorio en el sistema de archivos local del Pod. Para ajustar la forma en que se activan los buckets en el sistema de archivos, puedes usar opciones de activación. También puedes usar atributos de volumen para configurar el comportamiento específico del controlador CSI de Cloud Storage FUSE.

  4. Reconexión: Si el Pod se reinicia o se reprograma en otro nodo, el controlador de CSI vuelve a montar el mismo bucket en el nuevo nodo, lo que garantiza la accesibilidad a los datos.

Crea un PersistentVolume

  1. Crea un manifiesto de PersistentVolume con la siguiente especificación:

    Pod

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: gcs-fuse-csi-pv
    spec:
      accessModes:
      - ReadWriteMany
      capacity:
        storage: 5Gi
      storageClassName: example-storage-class  
      mountOptions:
        - implicit-dirs
      csi:
        driver: gcsfuse.csi.storage.gke.io
        volumeHandle: BUCKET_NAME
      claimRef:
        name: gcs-fuse-csi-static-pvc
        namespace: NAMESPACE  
    

    Reemplaza los siguientes valores:

    • NAMESPACE: Es el espacio de nombres de Kubernetes en el que deseas implementar tu Pod.
    • BUCKET_NAME: Es el nombre del bucket de Cloud Storage que especificaste cuando configuraste el acceso a los buckets de Cloud Storage. Puedes especificar un guion bajo (_) para activar todos los buckets a los que puede acceder la ServiceAccount de Kubernetes. Para obtener más información, consulta Activación dinámica en la documentación de Cloud Storage FUSE.

    En el manifiesto de ejemplo, se muestran estos parámetros de configuración obligatorios:

    • spec.csi.driver: usa gcsfuse.csi.storage.gke.io como el nombre del controlador de CSI.

    De manera opcional, puedes ajustar estas variables:

    • spec.mountOptions: Pasa opciones de activación a Cloud Storage FUSE. Especifica las marcas en una cadena separada por comas y sin espacios.
    • spec.csi.volumeAttributes: Pasa atributos de volumen adicionales a Cloud Storage FUSE.

    Pod (almacenamiento en caché de archivos)

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: gcs-fuse-csi-pv
    spec:
      accessModes:
      - ReadWriteMany
      capacity:
        storage: 5Gi
      storageClassName: example-storage-class 
      mountOptions:
        - implicit-dirs
        - file-cache:max-size-mb:-1
      csi:
        driver: gcsfuse.csi.storage.gke.io
        volumeHandle: BUCKET_NAME
      claimRef:
        name: gcs-fuse-csi-static-pvc
        namespace: NAMESPACE 
    

    Reemplaza los siguientes valores:

    • NAMESPACE: Es el espacio de nombres de Kubernetes en el que deseas implementar tu Pod.
    • BUCKET_NAME: Es el nombre del bucket de Cloud Storage que especificaste cuando configuraste el acceso a los buckets de Cloud Storage. Puedes especificar un guion bajo (_) para activar todos los buckets a los que puede acceder la ServiceAccount de Kubernetes. Para obtener más información, consulta Activación dinámica en la documentación de Cloud Storage FUSE.

    Pod (descarga paralela)

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: gcs-fuse-csi-pv
    spec:
      accessModes:
      - ReadWriteMany
      capacity:
        storage: 5Gi
      storageClassName: example-storage-class 
      mountOptions:
        - implicit-dirs
        - file-cache:enable-parallel-downloads:true
        - file-cache:max-size-mb:-1
      csi:
        driver: gcsfuse.csi.storage.gke.io
        volumeHandle: BUCKET_NAME
      claimRef:
        name: gcs-fuse-csi-static-pvc
        namespace: NAMESPACE 
    

    Reemplaza los siguientes valores:

    • NAMESPACE: Es el espacio de nombres de Kubernetes en el que deseas implementar tu Pod.
    • BUCKET_NAME: Es el nombre del bucket de Cloud Storage que especificaste cuando configuraste el acceso a los buckets de Cloud Storage. Puedes especificar un guion bajo (_) para activar todos los buckets a los que puede acceder la ServiceAccount de Kubernetes. Para obtener más información, consulta Activación dinámica en la documentación de Cloud Storage FUSE.
  2. Aplica el manifiesto al clúster:

    kubectl apply -f PV_FILE_PATH
    

    Reemplaza PV_FILE_PATH por la ruta de acceso a tu archivo YAML.

Crea una PersistentVolumeClaim

  1. Crea un manifiesto de PersistentVolumeClaim con la siguiente especificación:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: gcs-fuse-csi-static-pvc
      namespace: NAMESPACE
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 5Gi
      storageClassName: example-storage-class
    

    Reemplaza NAMESPACE por el espacio de nombres de Kubernetes en el que deseas implementar tu Pod.

    Para vincular tu PersistentVolume a una PersistentVolumeClaim, verifica estos parámetros de configuración:

    • Los campos spec.storageClassName en los manifiestos de PersistentVolume y PersistentVolumeClaim deben coincidir. No es necesario que storageClassName se refiera a un objeto StorageClass existente. Para vincular la reclamación a un volumen, puedes usar el nombre que quieras, pero no puede estar vacío.
    • Los campos spec.accessModes en los manifiestos de PersistentVolume y PersistentVolumeClaim deben coincidir.
    • El campo spec.capacity.storage en tu manifiesto de PersistentVolume debe coincidir con el spec.resources.requests.storage en el manifiesto de PersistentVolumeClaim. Dado que los buckets de Cloud Storage no tienen límites de tamaño, puedes ingresar cualquier número de capacidad, pero no puede estar vacío.
  2. Aplica el manifiesto al clúster:

    kubectl apply -f PVC_FILE_PATH
    

    Reemplaza PVC_FILE_PATH por la ruta de acceso a tu archivo YAML.

Consume el volumen en un Pod

  1. Crea un manifiesto de Pod con la siguiente especificación:

    apiVersion: v1
    kind: Pod
    metadata:
      name: gcs-fuse-csi-example-static-pvc  
      namespace: NAMESPACE
      annotations:
        gke-gcsfuse/volumes: "true"
    spec:
      containers:
      - image: busybox
        name: busybox
        command: ["sleep"]
        args: ["infinity"]
        volumeMounts:
        - name: gcs-fuse-csi-static
          mountPath: /data
          readOnly: true
      serviceAccountName: KSA_NAME
      volumes:
      - name: gcs-fuse-csi-static
        persistentVolumeClaim:
          claimName: gcs-fuse-csi-static-pvc
          readOnly: true  
    

    Reemplaza los siguientes valores:

    En el manifiesto de ejemplo, se muestran estos parámetros de configuración obligatorios:

    De manera opcional, puedes ajustar estas variables:

    • spec.containers[n].volumeMonts[n].readOnly: Especifica verdadero si solo las activaciones de volumen específicas son de solo lectura.
    • spec.volumes[n].persistentVolumeClaim.readOnly: Especifica verdadero si todas las activaciones de volumen son de solo lectura.
  2. Aplica el manifiesto al clúster:

    kubectl apply -f POD_FILE_PATH
    

    Reemplaza POD_FILE_PATH por la ruta de acceso a tu archivo YAML.

(Opcional) Cómo activar el mismo bucket de Cloud Storage con diferentes volúmenes persistentes {:#mount-same-bucket-different-pv}, disponible a partir de la versión 1.33.0-gke.1932000 de GKE

Para activar el mismo bucket de Cloud Storage con varios volúmenes persistentes diferentes, debes usar un volumeHandle único para cada volumen persistente. En el objeto PersistentVolume, usa el formato BUCKET_NAME:UNIQUE_SUFFIX para el campo volumeHandle. Reemplaza BUCKET_NAME por el nombre de tu bucket y UNIQUE_SUFFIX por cualquier identificador único que desees. Por ejemplo: myBucket:xyz123.

Un ejemplo de caso de uso podría ser el montaje del mismo bucket de Cloud Storage en el mismo nodo varias veces, cada una con su propio conjunto distinto de opciones de montaje.

Soluciona problemas

Si necesitas solucionar problemas de Cloud Storage FUSE, puedes configurar la marca log-severity en TRACE. Establece la marca en la sección args de la especificación del contenedor del controlador en el YAML de implementación. Esto hace que el atributo de volumen gcsfuseLoggingSeverity se establezca automáticamente en el seguimiento.

Para obtener sugerencias adicionales para solucionar problemas, consulta la Guía de solución de problemas en la documentación del proyecto de GitHub.

¿Qué sigue?