Configurer des installations de volume NFS pour les services

Cette page explique comment installer un partage de fichiers NFS en tant que volume dans Cloud Run. Vous pouvez utiliser n'importe quel serveur NFS, y compris le vôtre hébergé sur site ou sur une VM Compute Engine. Si vous ne disposez pas encore de serveur NFS, nous vous recommandons d'utiliser Filestore, une offre NFS entièrement gérée de Google Cloud.

L'installation du partage de fichiers NFS en tant que volume dans Cloud Run présente le partage de fichiers sous forme de fichiers dans le système de fichiers du conteneur. Après avoir installé le partage de fichiers en tant que volume, vous y accédez comme s'il s'agissait d'un répertoire de votre système de fichiers local, en utilisant les opérations et les bibliothèques du système de fichiers de votre langage de programmation.

Chemins d'accès non autorisés

Cloud Run ne vous permet pas d'installer un volume sur /dev, /proc et /sys, ni dans leurs sous-répertoires.

Limites

  • Cloud Run n'est pas compatible avec le verrouillage NFS. Les volumes NFS sont automatiquement installés en mode sans verrouillage.

Avant de commencer

Pour installer un serveur NFS en tant que volume dans Cloud Run, assurez-vous de disposer des éléments suivants :

  • Un réseau VPC sur lequel votre serveur NFS ou votre instance Filestore est en cours d'exécution.
  • Un serveur NFS exécuté dans un réseau VPC, avec votre service Cloud Run connecté à ce réseau VPC. Si vous ne disposez pas encore de serveur NFS, créez-en un en créant une instance Filestore.
  • Votre service Cloud Run est associé au réseau VPC sur lequel votre serveur NFS est en cours d'exécution. Pour obtenir de meilleures performances, utilisez le VPC direct plutôt que les connecteurs VPC.
  • Si vous utilisez un projet existant, assurez-vous que la configuration de votre pare-feu VPC permet à Cloud Run d'accéder à votre serveur NFS. (Si vous commencez avec un nouveau projet, cela est vrai par défaut.) Si vous utilisez Filestore comme serveur NFS, suivez la documentation Filestore pour créer une règle de sortie de pare-feu afin de permettre à Cloud Run d'accéder à Filestore.
  • Définissez les autorisations sur votre partage de fichiers NFS distant pour autoriser l'accès à l'utilisateur du conteneur. Par défaut, Filestore fournit un accès en lecture à tous les utilisateurs, mais limite l'accès en écriture à l'utilisateur racine (uid 0). Si votre conteneur nécessite un accès en écriture et ne s'exécute pas en tant qu'utilisateur racine, vous devez utiliser un client connecté (exécuté en tant que racine) pour modifier les autorisations de partage. Par exemple, vous pouvez utiliser la commande chown pour modifier la propriété des fichiers ou des répertoires en fonction de l'ID utilisateur spécifique sous lequel votre conteneur s'exécute.

Rôles requis

Pour obtenir les autorisations nécessaires pour configurer et déployer des services Cloud Run, demandez à votre administrateur de vous accorder les rôles IAM suivants sur le service :

  • Développeur Cloud Run (roles/run.developer) : service Cloud Run
  • Utilisateur du compte de service (roles/iam.serviceAccountUser) : identité du service

Si vous déployez un service ou une fonction à partir du code source, vous devez également disposer de rôles supplémentaires sur votre projet et votre compte de service Cloud Build.

Pour obtenir la liste des rôles et des autorisations IAM associés à Cloud Run, consultez les sections Rôles IAM Cloud Run et Autorisations IAM Cloud Run. Si votre service Cloud Run communique avec Google Cloud des API, telles que les bibliothèques clientes Cloud, consultez le guide de configuration de l'identité du service. Pour en savoir plus sur l'attribution de rôles, consultez les pages Autorisations de déploiement et Gérer les accès.

Installer un volume NFS

Vous pouvez installer plusieurs serveurs NFS, instances Filestore ou autres types de volumes avec différents chemins d'installation.

Si vous utilisez plusieurs conteneurs, spécifiez les volumes, puis spécifiez les installations de volume pour chaque conteneur.

Console

  1. Dans la Google Cloud console, accédez à Cloud Run :

    Accédez à Cloud Run

  2. Sélectionnez Services dans le menu de navigation Cloud Run, puis cliquez sur Déployer un conteneur pour configurer un nouveau service. Si vous configurez un service existant, cliquez sur celui-ci, puis sur Modifier et déployer la nouvelle révision.

  3. Si vous configurez un nouveau service, remplissez la page initiale des paramètres du service, puis cliquez sur Conteneurs, mise en réseau, sécurité pour développer la page de configuration du service.

  4. Cliquez sur l'onglet Volumes.

    image

    • Cliquez sur Installer un volume.
    • Cliquez sur NFS comme type de volume.
    • Dans le champ Chemin d'accès au montage, saisissez le chemin d'accès où vous souhaitez installer le volume.
    • Dans le champ Serveur NFS, saisissez le nom de domaine ou l'emplacement (au format IP_ADDRESS) du partage de fichiers NFS.
    • Dans le champ Chemin d'accès, saisissez le chemin d'accès au répertoire du serveur NFS que vous souhaitez installer.
    • Cliquez sur Enregistrer.
  5. Cliquez sur Créer ou Déployer.

gcloud

  • Pour ajouter une installation de volume :

    gcloud beta run services update SERVICE \
    --add-volume mount-path=MOUNT_PATH,type=nfs,location=IP_ADDRESS:NFS_PATH,readonly=READ_ONLY

    Remplacez les éléments suivants :

    • SERVICE : nom de votre service.
    • MOUNT_PATH : chemin relatif où vous installez le volume, par exemple, /mnt/my-volume.
    • IP_ADDRESS : emplacement du partage de fichiers NFS.
    • NFS_PATH : chemin d'accès au partage de fichiers NFS commençant par une barre oblique, par exemple /example-directory.
    • READ_ONLY : true pour passer le volume en lecture seule ou false pour autoriser les écritures.
  • Si vous utilisez plusieurs conteneurs, spécifiez les volumes, puis spécifiez les installations de volume pour chaque conteneur :

    gcloud run services update SERVICE \
    --add-volume=name VOLUME_NAME,type=nfs,location=IP_ADDRESS:NFS_PATH \
    --container CONTAINER_1 \
    --add-volume-mount volume=VOLUME_NAME,mount-path=MOUNT_PATH \
    --container CONTAINER_2 \
    --add-volume-mount volume= VOLUME_NAME,mount-path=MOUNT_PATH2

YAML

  1. Si vous créez un service, ignorez cette étape. Si vous mettez à jour un service existant, téléchargez sa configuration YAML :

    gcloud run services describe SERVICE --format export > service.yaml
  2. Mettez à jour les attributs MOUNT_PATH, VOLUME_NAME, IP_ADDRESS et NFS_PATH si nécessaire. Si vous disposez de plusieurs installations de volume, vous aurez plusieurs de ces attributs.

    apiVersion: run.googleapis.com/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        metadata:
          annotations:
            run.googleapis.com/execution-environment: gen2
        spec:
          containers:
          - image: IMAGE_URL
            volumeMounts:
            - name: VOLUME_NAME
              mountPath: MOUNT_PATH
          volumes:
          - name: VOLUME_NAME
            nfs:
              server: IP_ADDRESS
              path: NFS_PATH
              readOnly: IS_READ_ONLY

    Remplacez les éléments suivants :

    • SERVICE : nom de votre service Cloud Run
    • MOUNT_PATH : chemin relatif où vous installez le volume, par exemple, /mnt/my-volume.
    • VOLUME_NAME : nom de votre choix pour votre volume. La valeur VOLUME_NAME permet de mapper le volume à l'installation du volume.
    • IP_ADDRESS : adresse du partage de fichiers NFS.
    • NFS_PATH : chemin d'accès au partage de fichiers NFS commençant par une barre oblique, par exemple, /example-directory.
    • IS_READ_ONLY : True pour passer le volume en lecture seule ou False pour autoriser les écritures.
  3. Créez ou mettez à jour le service à l'aide de la commande suivante :

    gcloud run services replace service.yaml

Terraform

Pour savoir comment appliquer ou supprimer une configuration Terraform, consultez la page Commandes Terraform de base.

Ajoutez les éléments suivants à une google_cloud_run_v2_service ressource dans votre configuration Terraform :
resource "google_cloud_run_v2_service" "default" {
  name     = "SERVICE"
  location = "REGION"

  template {
    execution_environment = "EXECUTION_ENVIRONMENT_GEN2"
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"
      volume_mounts {
        name       = "VOLUME_NAME"
        mount_path = "MOUNT_PATH"
      }
    }
    vpc_access {
      network_interfaces {
        network    = "default"
        subnetwork = "default"
      }
    }
    volumes {
      name = "VOLUME_NAME"
      nfs {
        server    = google_filestore_instance.default.networks[0].ip_addresses[0]
        path      = "NFS_PATH"
        read_only = IS_READ_ONLY
      }
    }
  }
}

resource "google_filestore_instance" "default" {
  name     = "cloudrun-service-ro"
  location = "REGION"
  tier     = "BASIC_HDD"

  file_shares {
    capacity_gb = 1024
    name        = "share1"
  }

  networks {
    network = "default"
    modes   = ["MODE_IPV4"]
  }
}

Remplacez les éléments suivants :

  • SERVICE : nom de votre service Cloud Run.
  • REGION : région Google Cloud . Exemple : europe-west1.
  • MOUNT_PATH : chemin relatif où vous installez le volume, par exemple, /mnt/nfs/filestore.
  • VOLUME_NAME : nom de votre choix pour votre volume. La valeur VOLUME_NAME permet de mapper le volume à l'installation du volume.
  • NFS_PATH : chemin d'accès au partage de fichiers NFS commençant par une barre oblique, par exemple, /share1.
  • IS_READ_ONLY : True pour passer le volume en lecture seule ou False pour autoriser les écritures.

Lire et écrire dans un volume

Si vous utilisez la fonctionnalité d'installation de volume Cloud Run, vous accédez à un volume installé à l'aide des mêmes bibliothèques dans votre langage de programmation que celles que vous utilisez pour lire et écrire des fichiers sur votre système de fichiers local.

Ceci est particulièrement utile si vous utilisez un conteneur existant qui attend que des données soient stockées sur le système de fichiers local et utilise des opérations standards du système de fichiers pour y accéder.

Les extraits suivants supposent une installation de volume avec un mountPath défini sur /mnt/my-volume.

Nodejs

Utilisez le module File System pour créer un fichier ou ajouter des données à un fichier existant dans le volume /mnt/my-volume :

var fs = require('fs');
fs.appendFileSync('/mnt/my-volume/sample-logfile.txt', 'Hello logs!', { flag: 'a+' });

Python

Écrivez les données dans un fichier conservé dans le volume /mnt/my-volume :

f = open("/mnt/my-volume/sample-logfile.txt", "a")

Go

Utilisez le package os pour créer un fichier conservé dans le volume /mnt/my-volume :

f, err := os.Create("/mnt/my-volume/sample-logfile.txt")

Java

Utilisez la classe Java.io.File pour créer un fichier journal dans le volume /mnt/my-volume :

import java.io.File;
File f = new File("/mnt/my-volume/sample-logfile.txt");

Résoudre les problèmes liés à NFS

Si vous rencontrez des problèmes, vérifiez les points suivants :

  • Votre service Cloud Run est connecté au réseau VPC sur lequel se trouve le serveur NFS.
  • Aucune règle de pare-feu n'empêche Cloud Run d'accéder au serveur NFS.
  • Si votre conteneur doit écrire des données, assurez-vous que les autorisations de partage NFS sont configurées pour autoriser les écritures de l'utilisateur de votre conteneur.

Temps de démarrage du conteneur et installations de volume NFS

L'utilisation d'installations de volume NFS peut légèrement augmenter le temps de démarrage à froid de votre conteneur Cloud Run, car l'installation de volumes est effectuée avant le démarrage du ou des conteneurs. Votre conteneur ne démarre que si NFS est installé.

Notez que NFS n'installe un volume que lorsqu'une connexion au serveur est établie et qu'un descripteur de fichier est récupéré. Si Cloud Run ne parvient pas à établir une connexion au serveur, le service Cloud Run ne démarre pas.

De plus, tout retard de mise en réseau peut avoir un impact sur le temps de démarrage du conteneur, car Cloud Run dispose d'un délai total de 30 secondes pour toutes les installations. Si l'installation de NFS prend plus de 30 secondes, le service Cloud Run ne démarre pas.

Caractéristiques de performances de NFS

Si vous créez plusieurs volumes NFS, tous les volumes sont installés en parallèle.

Étant donné que NFS est un système de fichiers réseau, il est soumis à des limites de bande passante et l'accès au système de fichiers peut être affecté par une bande passante limitée.

Lorsque vous écrivez dans votre volume NFS, l'écriture est stockée dans la mémoire Cloud Run jusqu'à ce que les données soient vidées. Les données sont vidées dans les cas suivants :

  • Votre application vide explicitement les données de fichier à l'aide de sync(2), msync(2) ou fsync(3).
  • Votre application ferme un fichier avec close(2).
  • La pression sur la mémoire force la récupération des ressources de mémoire système.

Pour en savoir plus, consultez la documentation Linux sur NFS.

Effacer et supprimer des volumes et des installations de volume

Vous pouvez effacer tous les volumes et toutes les installations, ou supprimer des volumes et des installations de volume spécifiques.

Effacer tous les volumes et toutes les installations de volume

Pour effacer tous les volumes et toutes les installations de volume de votre service à conteneur unique, exécutez la commande suivante :

gcloud run services update SERVICE \
    --clear-volumes
    --clear-volume-mounts

Si vous disposez de plusieurs conteneurs, suivez les conventions de l'CLI des side-cars pour effacer les volumes et les installations de volume :

gcloud run services update SERVICE \
    --container=container1 \
    --clear-volumes
    -–clear-volume-mounts \
    --container=container2 \
    --clear-volumes \
    -–clear-volume-mounts

Supprimer des volumes et des installations de volume spécifiques

Pour supprimer un volume, vous devez également supprimer toutes les installations de volume qui l'utilisent.

Pour supprimer des volumes ou des installations de volume spécifiques, utilisez les indicateurs remove-volume et remove-volume-mount :

gcloud run services update SERVICE \
    --remove-volume VOLUME_NAME \
    --container=container1 \
    --remove-volume-mount MOUNT_PATH \
    --container=container2 \
    --remove-volume-mount MOUNT_PATH