Ce guide explique comment utiliser des volumes éphémères CSI basés sur vos buckets Cloud Storage pour gérer automatiquement les ressources de stockage de vos pods ou jobs Kubernetes sur Google Kubernetes Engine (GKE). Les volumes éphémères CSI sont liés au cycle de vie du pod ou de la tâche, et vous n'avez pas besoin de gérer manuellement les objets PersistentVolume et PersistentVolumeClaim.
Ce guide s'adresse aux administrateurs et opérateurs de plate-forme qui souhaitent simplifier la gestion de l'espace de stockage de leurs applications GKE.
Avant de lire cette page, assurez-vous de connaître les volumes éphémères CSI, les pods et les jobs Kubernetes, ainsi que les buckets Cloud Storage.
Si vous connaissez déjà les PersistentVolumes et que vous souhaitez assurer la cohérence avec vos déploiements existants qui reposent sur ce type de ressource, consultez Monter des buckets Cloud Storage en tant que volumes persistants.
Avant de commencer
Assurez-vous de remplir les conditions préalables suivantes:
- Découvrez les conditions requises et les limites du pilote CSI Cloud Storage FUSE.
- Créer le bucket Cloud Storage
- Activer le pilote CSI Cloud Storage FUSE
- Configurer l'accès aux buckets Cloud Storage
Fonctionnement du stockage éphémère CSI pour les buckets Cloud Storage
Les volumes éphémères CSI simplifient la gestion du stockage pour vos applications sur GKE. Vous définissez les volumes éphémères CSI directement dans la spécification de votre pod ou de votre job. L'utilisation de volumes éphémères CSI élimine le besoin d'objets PersistentVolume et PersistentVolumeClaim distincts.
L'utilisation d'un volume éphémère CSI implique les opérations suivantes:
Définition de l'espace de stockage: vous spécifiez l'espace de stockage dans le fichier YAML de votre pod ou de votre tâche, y compris le pilote CSI à utiliser et les paramètres requis. Pour le pilote CSI Cloud Storage FUSE, vous devez spécifier le nom du bucket et d'autres informations pertinentes.
Vous pouvez éventuellement affiner les performances de votre pilote CSI à l'aide de la fonctionnalité de mise en cache de fichiers. La mise en cache de fichiers peut améliorer les performances des applications GKE en mettant en cache les fichiers Cloud Storage fréquemment consultés sur un disque plus rapide.
De plus, vous pouvez utiliser la fonctionnalité de téléchargement parallèle pour accélérer la lecture de fichiers volumineux à partir de Cloud Storage pour les téléchargements multithreads. Vous pouvez utiliser cette fonctionnalité pour améliorer les temps de chargement du modèle, en particulier pour les lectures de plus de 1 Go.
Appel du pilote: lorsque vous créez le pod ou la tâche, GKE détecte la requête de volume éphémère et appelle le pilote CSI Cloud Storage FUSE.
Installation et association de volumes: le pilote CSI installe le volume éphémère CSI (qui pointe vers le bucket Cloud Storage sous-jacent) et le met à la disposition du pod ou du job, ce qui le rend accessible à votre application. Pour affiner la façon dont les buckets sont installés dans le système de fichiers, vous pouvez utiliser des options d'installation. Vous pouvez également utiliser des attributs de volume pour configurer un comportement spécifique du pilote CSI Cloud Storage FUSE.
Gestion du cycle de vie: le volume éphémère existe pendant toute la durée de vie du pod ou de la tâche. Lorsque le pod est supprimé ou que la tâche est terminée, le pilote CSI gère automatiquement le nettoyage et le démontage du volume.
Associer le volume éphémère CSI
Suivez ces instructions selon que vous souhaitez associer le volume éphémère CSI à un pod ou à une tâche.
Pod
Pour joindre le volume éphémère CSI dans un pod, procédez comme suit:
Créez un fichier manifeste YAML de pod avec la spécification suivante:
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"
Remplacez les valeurs suivantes :
- NAMESPACE: espace de noms Kubernetes dans lequel vous souhaitez déployer votre pod.
- KSA_NAME: nom du compte de service Kubernetes que vous avez spécifié lors de la configuration de l'accès aux buckets Cloud Storage.
- BUCKET_NAME: nom du bucket Cloud Storage que vous avez spécifié lors de la configuration de l'accès aux buckets Cloud Storage.
Vous pouvez spécifier un trait de soulignement (
_
) pour installer tous les buckets auxquels le compte de service Kubernetes peut accéder. Pour en savoir plus, consultez la section Installation dynamique dans la documentation de Cloud Storage FUSE.
L'exemple de fichier manifeste présente les paramètres obligatoires suivants:
metadata.annotations
: l'annotationgke-gcsfuse/volumes: "true"
est obligatoire. Consultez la section Configurer le conteneur side-car pour obtenir des annotations facultatives.spec.volumes[n].csi.driver
: utilisezgcsfuse.csi.storage.gke.io
comme nom de pilote CSI.
Vous pouvez éventuellement ajuster les variables suivantes:
spec.terminationGracePeriodSeconds
: par défaut, cette valeur est définie sur 30. Si vous devez écrire des fichiers volumineux dans le bucket Cloud Storage, augmentez cette valeur pour vous assurer que Cloud Storage FUSE a suffisamment de temps pour vider les données après la fermeture de votre application. Pour en savoir plus, consultez les bonnes pratiques Kubernetes: arrêt progressif.spec.volumes[n].csi.volumeAttributes.mountOptions
: transmettez des options d'installation à Cloud Storage FUSE. Spécifiez les options en une seule chaîne séparée par des virgules, sans espaces.spec.volumes[n].csi.volumeAttributes
: transmettez des attributs de volume supplémentaires à Cloud Storage FUSE.spec.volumes[n].csi.readOnly
: spécifiez "true" si toutes les installations de volume sont en lecture seule.spec.containers[n].volumeMounts[m].readOnly
: spécifiez "true" si seule l'installation de volume spécifique est en lecture seule.
Exécutez la commande suivante pour appliquer le fichier manifeste à votre cluster:
kubectl apply -f FILE_PATH
Remplacez FILE_PATH par le chemin d'accès à votre fichier YAML.
Pod (mise en cache de fichiers)
Pour associer le volume éphémère CSI avec mise en cache de fichiers dans un pod, procédez comme suit:
Créez un cluster ou un pool de nœuds avec un stockage éphémère basé sur SSD local en suivant la procédure décrite dans Créer un cluster ou un pool de nœuds avec un stockage éphémère basé sur SSD local.
Créez un fichier manifeste YAML de pod avec la spécification suivante:
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"
Remplacez les valeurs suivantes :
- NAMESPACE: espace de noms Kubernetes dans lequel vous souhaitez déployer votre pod.
- KSA_NAME: nom du compte de service Kubernetes que vous avez spécifié lors de la configuration de l'accès aux buckets Cloud Storage.
BUCKET_NAME: nom du bucket Cloud Storage que vous avez spécifié lors de la configuration de l'accès aux buckets Cloud Storage. Vous pouvez spécifier un trait de soulignement (
_
) pour installer tous les buckets auxquels le compte de service Kubernetes peut accéder. Pour en savoir plus, consultez la section Installation dynamique dans la documentation de Cloud Storage FUSE.Dans l'exemple de fichier manifeste, le chargeur de données du conteneur d'initialisation génère 1 000 fichiers d'une taille de 64 Kio et les importe dans un bucket Cloud Storage. Le conteneur principal
data-validator
lit tous les fichiers du bucket deux fois et consigne leur durée.
Exécutez la commande suivante pour appliquer le fichier manifeste à votre cluster:
kubectl apply -f FILE_PATH
Remplacez FILE_PATH par le chemin d'accès à votre fichier YAML.
Pour afficher les sorties du journal, exécutez la commande suivante :
kubectl logs -n NAMESPACE gcs-fuse-csi-file-cache-example -c data-validator
Remplacez NAMESPACE par l'espace de noms de votre charge de travail.
Le résultat doit ressembler à ce qui suit :
first read with cache miss real 0m 54.68s ... second read from local cache real 0m 0.38s ...
Le résultat montre que la deuxième lecture avec le cache local est beaucoup plus rapide que la première lecture avec un défaut de cache (miss).
Pod (téléchargement parallèle)
Pour joindre le volume éphémère CSI avec téléchargement parallèle dans un pod, procédez comme suit:
Créez un fichier manifeste YAML de pod avec la spécification suivante:
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"
Remplacez les valeurs suivantes :
- NAMESPACE: espace de noms Kubernetes dans lequel vous souhaitez déployer votre pod.
- BUCKET_NAME: nom du bucket Cloud Storage que vous avez spécifié lors de la configuration de l'accès aux buckets Cloud Storage.
Vous pouvez spécifier un trait de soulignement (
_
) pour installer tous les buckets auxquels le compte de service Kubernetes peut accéder. Pour en savoir plus, consultez la section Installation dynamique dans la documentation de Cloud Storage FUSE.
Exécutez la commande suivante pour appliquer le fichier manifeste à votre cluster:
kubectl apply -f FILE_PATH
Remplacez FILE_PATH par le chemin d'accès à votre fichier YAML.
Job
Pour joindre le volume éphémère CSI dans une tâche, procédez comme suit:
Créez un fichier manifeste YAML de tâche avec les spécifications suivantes:
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
Remplacez les valeurs suivantes :
- NAMESPACE: espace de noms Kubernetes dans lequel vous déployez votre pod.
- KSA_NAME: nom du compte de service Kubernetes que vous avez spécifié lors de la configuration de l'accès aux buckets Cloud Storage.
- BUCKET_NAME: nom du bucket Cloud Storage que vous avez spécifié lors de la configuration de l'accès aux buckets Cloud Storage.
Vous pouvez spécifier un trait de soulignement (
_
) pour installer tous les buckets auxquels le compte de service Kubernetes peut accéder. Pour en savoir plus, consultez la section Installation dynamique dans la documentation de Cloud Storage FUSE.
L'exemple de fichier manifeste présente les paramètres obligatoires suivants:
metadata.annotations
: l'annotationgke-gcsfuse/volumes: "true"
est obligatoire. Consultez la section Configurer le conteneur side-car pour obtenir des annotations facultatives.spec.volumes[n].csi.drive
r: utilisezgcsfuse.csi.storage.gke.io
comme nom de pilote CSI.
Vous pouvez éventuellement ajuster les variables suivantes:
spec.volumes[n].csi.volumeAttributes.mountOptions
: transmettez des options d'installation à Cloud Storage FUSE. Spécifiez les options en une seule chaîne séparée par des virgules, sans espaces.spec.volumes[n].csi.volumeAttributes
: transmettez des attributs de volume supplémentaires à Cloud Storage FUSE.spec.volumes[n].csi.readOnly
: spécifiez "true" si toutes les installations de volume sont en lecture seule.spec.containers[n].volumeMounts[m].readOnly
: spécifiez "true" si seule l'installation de volume spécifique est en lecture seule.
Exécutez la commande suivante pour appliquer le fichier manifeste à votre cluster:
kubectl apply -f FILE_PATH
Remplacez
FILE_PATH
par le chemin d'accès à votre fichier YAML.
Résoudre les problèmes
Si vous devez résoudre des problèmes liés à Cloud Storage FUSE, vous pouvez définir l'option log-severity
sur TRACE
. Vous définissez l'indicateur dans la section args
de la spécification de conteneur du pilote dans le fichier YAML de déploiement. L'attribut de volume gcsfuseLoggingSeverity
est alors automatiquement défini sur "trace".
Pour obtenir des conseils de dépannage supplémentaires, consultez le guide de dépannage dans la documentation du projet GitHub.
Étape suivante
- Découvrez comment optimiser les performances du pilote CSI Cloud Storage FUSE.
- Consultez d'autres exemples d'utilisation du pilote CSI sur GitHub.
- En savoir plus sur Cloud Storage FUSE