Montare i bucket Cloud Storage come volumi effimeri CSI

Questa guida mostra come utilizzare i volumi temporanei CSI supportati dai bucket Cloud Storage per gestire automaticamente le risorse di archiviazione per i pod Kubernetes o i job su Google Kubernetes Engine (GKE). I volumi temporanei CSI sono legati al ciclo di vita del pod o del job e non è necessario gestire manualmente gli oggetti PersistentVolume e PersistentVolumeClaim.

Questa guida è rivolta agli amministratori e agli operatori della piattaforma che vogliono semplificare la gestione dello spazio di archiviazione per le applicazioni GKE.

Prima di leggere questa pagina, assicurati di conoscere i volumi temporanei CSI, i pod e i job Kubernetes e i bucket Cloud Storage.

Se hai già familiarità con PersistentVolume e vuoi coerenza con i deployment esistenti che si basano su questo tipo di risorsa, consulta Montare i bucket Cloud Storage come volumi permanenti.

Prima di iniziare

Assicurati di aver completato questi prerequisiti:

Come funziona lo spazio di archiviazione temporaneo CSI per i bucket Cloud Storage

I volumi temporanei CSI semplificano la gestione dello spazio di archiviazione per le applicazioni su GKE. Definisci i volumi temporanei CSI direttamente nella specifica del pod o del job. L'utilizzo dei volumi temporanei CSI elimina la necessità di oggetti PersistentVolume e PersistentVolumeClaim separati.

L'utilizzo di un volume temporaneo CSI comporta le seguenti operazioni:

  1. Definizione dello spazio di archiviazione: specifica lo spazio di archiviazione nel file YAML del pod o del job, incluso il driver CSI da utilizzare e tutti i parametri richiesti. Per il driver CSI di Cloud Storage FUSE, specifica il nome del bucket e altri dettagli pertinenti.

    Facoltativamente, puoi ottimizzare le prestazioni del driver CSI utilizzando la funzionalità di memorizzazione nella cache dei file. La memorizzazione nella cache dei file può migliorare le prestazioni delle app GKE memorizzando nella cache i file di Cloud Storage a cui si accede di frequente su un disco più veloce.

    Inoltre, puoi utilizzare la funzionalità di download parallelo per velocizzare la lettura di file di grandi dimensioni da Cloud Storage per i download multithread. Puoi utilizzare questa funzionalità per migliorare i tempi di caricamento dei modelli, soprattutto per le letture di dimensioni superiori a 1 GB.

  2. Richiamo del driver: quando crei il pod o il job, GKE rileva la richiesta di volume temporaneo e chiama il driver CSI di Cloud Storage FUSE.

  3. Montaggio e collegamento del volume: il driver CSI monta il volume temporaneo CSI (che punta al bucket Cloud Storage sottostante) e lo rende disponibile per il pod o il job, rendendolo accessibile alla tua applicazione. Per ottimizzare la modalità di montaggio dei bucket nel file system, puoi utilizzare le opzioni di montaggio. Puoi anche utilizzare gli attributi del volume per configurare un comportamento specifico del driver CSI di Cloud Storage FUSE.

  4. Gestione del ciclo di vita: il volume temporaneo esiste per la durata di pod o job. Quando il pod viene eliminato o il job viene completato, il driver CSI gestisce automaticamente la pulizia e lo smontaggio del volume.

Collega il volume temporaneo CSI

Segui queste istruzioni, a seconda che tu voglia collegare il volume temporaneo CSI a un pod o a un job.

Pod

Per collegare il volume temporaneo CSI in un pod:

  1. Crea un manifest YAML del pod con la seguente specifica:

    apiVersion: v1
    kind: Pod
    metadata:
      name: gcs-fuse-csi-example-ephemeral 
      namespace: NAMESPACE
      annotations:
        gke-gcsfuse/volumes: "true" 
    spec:
      terminationGracePeriodSeconds: 60
      containers:
      - image: busybox
        name: busybox
        command: ["sleep"]
        args: ["infinity"] 
        volumeMounts:
        - name: gcs-fuse-csi-ephemeral
          mountPath: /data
          readOnly: true
      serviceAccountName: KSA_NAME
      volumes:
      - name: gcs-fuse-csi-ephemeral
        csi:
          driver: gcsfuse.csi.storage.gke.io
          readOnly: true
          volumeAttributes:
            bucketName: BUCKET_NAME
            mountOptions: "implicit-dirs" 
    

    Sostituisci i seguenti valori:

    • NAMESPACE: lo spazio dei nomi Kubernetes in cui vuoi eseguire il deployment del pod.
    • KSA_NAME: il nome dell'account di servizio Kubernetes che hai specificato durante la configurazione dell'accesso ai bucket Cloud Storage.
    • BUCKET_NAME: il nome del bucket Cloud Storage che hai specificato durante la configurazione dell'accesso ai bucket Cloud Storage. Puoi specificare un trattino basso (_) per montare tutti i bucket a cui l'account di servizio Kubernetes può accedere. Per saperne di più, consulta Montaggio dinamico nella documentazione di Cloud Storage FUSE.

    Il manifest di esempio mostra queste impostazioni obbligatorie:

    • metadata.annotations: è obbligatoria l'annotazione gke-gcsfuse/volumes: "true". Consulta Configurare il container sidecar per le annotazioni facoltative.
    • spec.volumes[n].csi.driver: utilizza gcsfuse.csi.storage.gke.io come nome del driver CSI.

    Facoltativamente, puoi modificare queste variabili:

    • spec.terminationGracePeriodSeconds: per impostazione predefinita, questo valore è 30. Se devi scrivere file di grandi dimensioni nel bucket Cloud Storage, aumenta questo valore per assicurarti che Cloud Storage FUSE abbia tempo sufficiente per scaricare i dati dopo l'uscita dell'applicazione. Per saperne di più, consulta Best practice di Kubernetes: terminazione senza problemi.
    • spec.volumes[n].csi.volumeAttributes.mountOptions: passa le opzioni di montaggio a Cloud Storage FUSE. Specifica i flag in una stringa separata da virgole, senza spazi.
    • spec.volumes[n].csi.volumeAttributes: passa attributi di volume aggiuntivi a Cloud Storage FUSE.
    • spec.volumes[n].csi.readOnly: specifica true se tutti i montaggi dei volumi sono di sola lettura.
    • spec.containers[n].volumeMounts[m].readOnly: specifica true se solo un montaggio di volume specifico è di sola lettura.
  2. Esegui il comando seguente per applicare il manifest al cluster:

    kubectl apply -f FILE_PATH
    

    Sostituisci FILE_PATH con il percorso del file YAML.

Pod (memorizzazione nella cache dei file)

Per collegare il volume temporaneo CSI con la memorizzazione nella cache dei file in un pod:

  1. Crea un cluster o pool di nodi con spazio di archiviazione temporaneo supportato da SSD locali seguendo i passaggi descritti in Creare un cluster o un pool di nodi con spazio di archiviazione temporaneo supportato da SSD locali.

  2. Crea un manifest YAML del pod con la seguente specifica:

    apiVersion: v1
    kind: Pod
    metadata:
      name: gcs-fuse-csi-file-cache-example 
      namespace: NAMESPACE
      annotations:
        gke-gcsfuse/volumes: "true"
        gke-gcsfuse/ephemeral-storage-limit: "50Gi" 
    spec:
      nodeSelector:
        cloud.google.com/gke-ephemeral-storage-local-ssd: "true"
      restartPolicy: Never
      initContainers:
      - name: data-loader
        image: gcr.io/google.com/cloudsdktool/google-cloud-cli:slim
        resources:
          limits:
            cpu: 500m
            memory: 1Gi
          requests:
            cpu: 500m
            memory: 1Gi
        command:
          - "/bin/sh"
          - "-c"
          - |
            mkdir -p /test_files
            for i in $(seq 1 1000); do dd if=/dev/zero of=/test_files/file_$i.txt bs=1024 count=64; done
            gcloud storage cp /test_files gs://BUCKET_NAME --recursive
      containers:
      - name: data-validator
        image: busybox
        resources:
          limits:
            cpu: 500m
            memory: 512Mi
          requests:
            cpu: 500m
            memory: 512Mi
        command:
          - "/bin/sh"
          - "-c"
          - |
            echo "first read with cache miss"
            time cat /data/test_files/file_* > /dev/null
    
            echo "second read from local cache"
            time cat /data/test_files/file_* > /dev/null 
        volumeMounts:
        - name: gcs-fuse-csi-ephemeral
          mountPath: /data
      serviceAccountName: KSA_NAME
      volumes:
      - name: gcs-fuse-csi-ephemeral
        csi:
          driver: gcsfuse.csi.storage.gke.io
          volumeAttributes:
            bucketName: BUCKET_NAME
            mountOptions: "implicit-dirs,file-cache:max-size-mb:-1"
    

    Sostituisci i seguenti valori:

    • NAMESPACE: lo spazio dei nomi Kubernetes in cui vuoi eseguire il deployment del pod.
    • KSA_NAME: il nome dell'account di servizio Kubernetes che hai specificato durante la configurazione dell'accesso ai bucket Cloud Storage.
    • BUCKET_NAME: il nome del bucket Cloud Storage che hai specificato durante la configurazione dell'accesso ai bucket Cloud Storage. Puoi specificare un trattino basso (_) per montare tutti i bucket a cui l'account di servizio Kubernetes può accedere. Per saperne di più, consulta Montaggio dinamico nella documentazione di Cloud Storage FUSE.

      Nel manifest di esempio, il container di inizializzazione data-loader genera 1000 file di dimensioni pari a 64 KiB e li carica in un bucket Cloud Storage. Il container principale data-validator legge tutti i file dal bucket due volte e registra la durata.

  3. Esegui il comando seguente per applicare il manifest al cluster:

    kubectl apply -f FILE_PATH
    

    Sostituisci FILE_PATH con il percorso del file YAML.

  4. Per visualizzare l'output dei log, esegui il comando seguente:

    kubectl logs -n NAMESPACE gcs-fuse-csi-file-cache-example -c data-validator
    

    Sostituisci NAMESPACE con lo spazio dei nomi del tuo workload.

    L'output dovrebbe essere simile al seguente:

    first read with cache miss
    real    0m 54.68s
    ...
    second read from local cache
    real    0m 0.38s
    ...
    

    L'output mostra che la seconda lettura con la cache locale è molto più veloce della prima lettura con un fallimento della cache.

Pod (download parallelo)

Per collegare il volume temporaneo CSI con il download parallelo in un pod:

  1. Crea un manifest YAML del pod con la seguente specifica:

    apiVersion: v1
    kind: Pod
    metadata:
      name: gcs-fuse-csi-example-ephemeral 
      namespace: NAMESPACE
      annotations:
        gke-gcsfuse/volumes: "true"
        gke-gcsfuse/ephemeral-storage-limit: "50Gi" 
    spec:
      containers:
      ...
      volumes:
      - name: gcs-fuse-csi-ephemeral 
        csi:
          driver: gcsfuse.csi.storage.gke.io
          volumeAttributes:
            bucketName: BUCKET_NAME
            mountOptions: "implicit-dirs,file-cache:enable-parallel-downloads:true,file-cache:max-size-mb:-1"
            fileCacheCapacity: "-1"
    

    Sostituisci i seguenti valori:

    • NAMESPACE: lo spazio dei nomi Kubernetes in cui vuoi eseguire il deployment del pod.
    • BUCKET_NAME: il nome del bucket Cloud Storage che hai specificato durante la configurazione dell'accesso ai bucket Cloud Storage. Puoi specificare un trattino basso (_) per montare tutti i bucket a cui l'account di servizio Kubernetes può accedere. Per saperne di più, consulta Montaggio dinamico nella documentazione di Cloud Storage FUSE.
  2. Esegui il comando seguente per applicare il manifest al cluster:

    kubectl apply -f FILE_PATH
    

    Sostituisci FILE_PATH con il percorso del file YAML.

Job

Per collegare il volume temporaneo CSI in un job:

  1. Crea un manifest YAML del job con la seguente specifica:

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: gcs-fuse-csi-job-example 
      namespace: NAMESPACE 
    spec:
      template:
        metadata: 
          annotations:
            gke-gcsfuse/volumes: "true"
        spec:
          serviceAccountName: KSA_NAME 
          containers:
          - name: writer
            image: busybox
            command:
              - "/bin/sh"
              - "-c"
              - touch /data/test && echo $(date) >> /data/test && sleep 10
            volumeMounts:
            - name: gcs-fuse-csi-ephemeral
              mountPath: /data
          - name: reader
            image: busybox
            command:
              - "/bin/sh"
              - "-c"
              - sleep 10 && cat /data/test 
            volumeMounts:
            - name: gcs-fuse-csi-ephemeral
              mountPath: /data
              readOnly: true
          volumes:
          - name: gcs-fuse-csi-ephemeral
            csi:
              driver: gcsfuse.csi.storage.gke.io
              volumeAttributes:
                bucketName: BUCKET_NAME
          restartPolicy: Never 
      backoffLimit: 1
    

    Sostituisci i seguenti valori:

    • NAMESPACE: lo spazio dei nomi Kubernetes in cui esegui il deployment del pod.
    • KSA_NAME: il nome dell'account di servizio Kubernetes che hai specificato durante la configurazione dell'accesso ai bucket Cloud Storage.
    • BUCKET_NAME: il nome del bucket Cloud Storage che hai specificato durante la configurazione dell'accesso ai bucket Cloud Storage. Puoi specificare un trattino basso (_) per montare tutti i bucket a cui l'account di servizio Kubernetes può accedere. Per saperne di più, consulta Montaggio dinamico nella documentazione di Cloud Storage FUSE.

    Il manifest di esempio mostra queste impostazioni obbligatorie:

    • metadata.annotations: è obbligatoria l'annotazione gke-gcsfuse/volumes: "true". Consulta Configurare il container sidecar per le annotazioni facoltative.
    • spec.volumes[n].csi.driver: utilizza gcsfuse.csi.storage.gke.io come nome del driver CSI.

    Facoltativamente, puoi modificare queste variabili:

  2. Esegui il comando seguente per applicare il manifest al cluster:

    kubectl apply -f FILE_PATH
    

    Sostituisci FILE_PATH con il percorso del file YAML.

Monta lo stesso bucket Cloud Storage con diversi volumi temporanei CSI

Facoltativamente, puoi utilizzare più volumi temporanei CSI supportati dallo stesso bucket Cloud Storage. Per farlo, collega due o più volumi che fanno riferimento allo stesso nome del bucket in percorsi di montaggio diversi. Un caso d'uso di esempio potrebbe essere il montaggio di diversi volumi temporanei CSI con opzioni di montaggio diverse sullo stesso pod, in cui ogni volume temporaneo fa riferimento allo stesso bucket Cloud Storage. Di seguito è riportato un manifest del pod di esempio che utilizza questa funzionalità:

apiVersion: batch/v1
kind: Job
metadata:
  name: gcs-fuse-csi-job-example
  namespace: NAMESPACE
spec:
  template:
    metadata:
      annotations:
        gke-gcsfuse/volumes: "true"
    spec:
      serviceAccountName: KSA_NAME
      containers:
      - name: writer
        image: busybox
        command:
          - "/bin/sh"
          - "-c"
          - touch /data/test && echo $(date) >> /data/test && sleep 10
        volumeMounts: 
        - name: gcs-fuse-csi-ephemeral
          mountPath: /data
        volumeMounts:
        - name: gcs-fuse-csi-ephemeral-with-mo
          mountPath: /data2
      volumes:
      - name: gcs-fuse-csi-ephemeral
        csi:
          driver: gcsfuse.csi.storage.gke.io
          volumeAttributes:
            bucketName: BUCKET_NAME
      - name: gcs-fuse-csi-ephemeral-with-mo
        csi:
          driver: gcsfuse.csi.storage.gke.io
          volumeAttributes:
            bucketName: BUCKET_NAME
            mountOptions: "implicit-dirs"
      restartPolicy: Never
  backoffLimit: 1

Risoluzione dei problemi

Per ulteriori informazioni sulla risoluzione dei problemi del driver CSI di Cloud Storage FUSE, consulta la guida alla risoluzione dei problemi nella documentazione del progetto GitHub.

Passaggi successivi