Questa guida mostra come utilizzare i volumi effimeri CSI supportati dai bucket Cloud Storage per gestire automaticamente le risorse di archiviazione per i pod o i job Kubernetes su Google Kubernetes Engine (GKE). I volumi temporanei CSI sono legati al ciclo di vita del pod o del job e non devi 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 loro applicazioni GKE.
Prima di leggere questa pagina, assicurati di avere familiarità con i volumi effimeri CSI, i pod e i job Kubernetes e i bucket Cloud Storage.
Se hai già familiarità con i PersistentVolume e vuoi garantire la coerenza con i tuoi deployment esistenti che si basano su questo tipo di risorsa, consulta Monta i bucket Cloud Storage come volumi permanenti.
Prima di iniziare
Assicurati di aver completato i seguenti prerequisiti:
- Comprendi i requisiti e le limitazioni del driver CSI di Cloud Storage FUSE.
- Crea il bucket Cloud Storage
- Abilita il driver CSI di Cloud Storage FUSE
- Configura l'accesso ai bucket Cloud Storage
Come funziona l'archiviazione temporanea CSI per i bucket Cloud Storage
I volumi effimeri CSI semplificano la gestione dello spazio di archiviazione per le tue applicazioni su GKE. Definisci i volumi effimeri CSI direttamente all'interno della specifica del pod o del job. L'utilizzo di volumi temporanei CSI elimina la necessità di oggetti PersistentVolume e PersistentVolumeClaim separati.
L'utilizzo di un volume effimero CSI comporta le seguenti operazioni:
Definizione dell'archiviazione: specifica l'archiviazione nel file YAML del pod o del job, incluso il driver CSI da utilizzare e tutti i parametri richiesti. Per il driver CSI Cloud Storage FUSE, specifica il nome del bucket e altri dettagli pertinenti.
Se vuoi, 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 Cloud Storage a cui si accede di frequente su un disco più veloce.
Inoltre, puoi utilizzare la funzionalità di download parallelo per accelerare la lettura di file di grandi dimensioni da Cloud Storage per i download multithread. Puoi utilizzare questa funzionalità per migliorare i tempi di caricamento del modello, in particolare per letture di dimensioni superiori a 1 GB.
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.
Montaggio e collegamento del volume: il driver CSI monta il volume effimero CSI (che punta al bucket Cloud Storage sottostante) e lo rende disponibile per il pod o il job, rendendolo accessibile alla tua applicazione. Per perfezionare 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.
Gestione del ciclo di vita: il volume temporaneo esiste per tutta la durata del pod o del 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 effimero CSI a un pod o a un job.
Pod
Per collegare il volume effimero CSI in un pod:
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 di Kubernetes ServiceAccount che hai specificato durante la configurazione dell'accesso ai bucket Cloud Storage.
- BUCKET_NAME: il nome del bucket Cloud Storage specificato durante la configurazione dell'accesso ai bucket Cloud Storage.
Puoi specificare un trattino basso (
_) per montare tutti i bucket a cui può accedere il ServiceAccount Kubernetes. Per saperne di più, consulta Montaggio dinamico nella documentazione di Cloud Storage FUSE.
Il manifest di esempio mostra queste impostazioni obbligatorie:
metadata.annotations: l'annotazionegke-gcsfuse/volumes: "true"è obbligatoria. Per le annotazioni facoltative, consulta Configura il container sidecar.spec.volumes[n].csi.driver: utilizzagcsfuse.csi.storage.gke.iocome nome del driver CSI.
Se vuoi, 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 eseguire lo svuotamento dei dati dopo l'uscita dall'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 del volume aggiuntivi a Cloud Storage FUSE.spec.volumes[n].csi.readOnly: specifica true se tutti i montaggi del volume sono di sola lettura.spec.containers[n].volumeMounts[m].readOnly: specifica true se solo un montaggio del volume specifico è di sola lettura.
Esegui questo comando per applicare il manifest al cluster:
kubectl apply -f FILE_PATHSostituisci FILE_PATH con il percorso del file YAML.
Pod (memorizzazione dei file nella cache)
Per collegare il volume effimero CSI con la memorizzazione nella cache dei file in un pod:
Crea un cluster o pool di nodi con archiviazione temporanea basata su SSD locale seguendo i passaggi descritti in Creare un cluster o un pool di nodi con archiviazione temporanea basata su SSD locale.
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 del service account 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 può accedere il ServiceAccount Kubernetes. 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-validatorlegge tutti i file dal bucket due volte e registra la durata.
Esegui questo comando per applicare il manifest al cluster:
kubectl apply -f FILE_PATHSostituisci FILE_PATH con il percorso del file YAML.
Per visualizzare l'output del log, esegui questo comando:
kubectl logs -n NAMESPACE gcs-fuse-csi-file-cache-example -c data-validatorSostituisci 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 effimero CSI con download parallelo in un pod, segui questi passaggi:
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 carattere di sottolineatura (
_) per montare tutti i bucket a cui può accedere il service account Kubernetes. Per saperne di più, consulta Montaggio dinamico nella documentazione di Cloud Storage FUSE.
Esegui questo comando per applicare il manifest al cluster:
kubectl apply -f FILE_PATHSostituisci FILE_PATH con il percorso del file YAML.
Job
Per collegare il volume effimero CSI in un job:
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: 1Sostituisci i seguenti valori:
- NAMESPACE: lo spazio dei nomi Kubernetes in cui esegui il deployment del pod.
- KSA_NAME: il nome del service account 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 può accedere il service account Kubernetes. Per saperne di più, consulta Montaggio dinamico nella documentazione di Cloud Storage FUSE.
Il manifest di esempio mostra le seguenti impostazioni obbligatorie:
metadata.annotations: è necessaria l'annotazionegke-gcsfuse/volumes: "true". Per le annotazioni facoltative, vedi Configurare il container sidecar.spec.volumes[n].csi.driver: utilizzagcsfuse.csi.storage.gke.iocome nome del driver CSI.
Se vuoi, puoi modificare queste variabili:
spec.volumes[n].csi.volumeAttributes.mountOptions: passa le opzioni di montaggio a Cloud Storage FUSE. Specifica i flag in un'unica stringa separata da virgole, senza spazi.spec.volumes[n].csi.volumeAttributes: passa attributi del volume aggiuntivi a Cloud Storage FUSE.spec.volumes[n].csi.readOnly: specifica true se tutti i punti di montaggio del volume sono di sola lettura.spec.containers[n].volumeMounts[m].readOnly: specifica true se solo un montaggio del volume specifico è di sola lettura.
Esegui questo comando per applicare il manifest al cluster:
kubectl apply -f FILE_PATHSostituisci
FILE_PATHcon il percorso del file YAML.
Montare lo stesso bucket Cloud Storage con volumi effimeri CSI diversi
Se vuoi, 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 bucket in percorsi di montaggio diversi. Un caso d'uso di esempio potrebbe essere il montaggio di volumi temporanei CSI diversi con opzioni di montaggio diverse nello stesso pod, dove ogni volume temporaneo fa riferimento allo stesso bucket Cloud Storage. Di seguito è riportato un esempio di manifest del pod 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
- Scopri come ottimizzare le prestazioni per il driver CSI di Cloud Storage FUSE.
- Esplora altri esempi di utilizzo del driver CSI su GitHub.
- Scopri di più su Cloud Storage FUSE.