Configurer le pilote CSI Cloud Storage FUSE pour GKE

Ce document explique comment configurer le pilote CSI Cloud Storage FUSE pour accéder aux buckets Cloud Storage à partir de Google Kubernetes Engine (GKE).

Avec le pilote CSI Cloud Storage FUSE, vos charges de travail GKE peuvent accéder aux buckets Cloud Storage en tant que système de fichiers local. Le pilote CSI intègre Cloud Storage à GKE et simplifie l'interaction de vos applications conteneurisées avec les grands ensembles de données stockés dans des buckets. Le pilote CSI fournit une interface standard pour le stockage GKE. Dans ce document, vous préparez votre environnement et connectez vos clusters GKE à des buckets Cloud Storage à l'aide du pilote CSI Cloud Storage FUSE.

Ce document est destiné aux développeurs, aux administrateurs et aux spécialistes du stockage qui intègrent des charges de travail GKE au stockage d'objets. Pour en savoir plus sur les rôles courants et les exemples de tâches que nous citons dans Google Cloud le contenu, consultez Rôles utilisateur et tâches courantes de GKE.

Créer le bucket Cloud Storage

Si vous ne l'avez pas déjà fait, créez vos buckets Cloud Storage. Vous installerez ces buckets en tant que volumes dans votre cluster GKE. Pour améliorer les performances, définissez le type d'emplacement sur Région et sélectionnez une région correspondant à votre cluster GKE.

Activer le pilote CSI Cloud Storage FUSE

Suivez ces étapes, selon que vous utilisez des clusters GKE Autopilot ou Standard. Nous vous recommandons d'utiliser un cluster Autopilot pour une expérience Kubernetes entièrement gérée. Pour choisir le mode le mieux adapté à vos charges de travail, consultez Choisir un mode de fonctionnement GKE.

Autopilot

Le pilote CSI Cloud Storage FUSE est activé par défaut pour les clusters Autopilot. Vous pouvez passer à la section Configurer l'accès aux buckets Cloud Storage.

Standard

Si le pilote CSI Cloud Storage FUSE est activé sur votre cluster Standard, passez à la section Configurer l'accès aux buckets Cloud Storage.

Le pilote CSI Cloud Storage FUSE n'est pas activé par défaut dans les clusters Standard. Pour créer un cluster Standard avec le pilote CSI Cloud Storage FUSE activé, vous pouvez utiliser la gcloud container clusters create commande :

gcloud container clusters create CLUSTER_NAME \
    --addons GcsFuseCsiDriver \
    --cluster-version=VERSION \
    --location=LOCATION \
    --workload-pool=PROJECT_ID.svc.id.goog

Remplacez les éléments suivants :

  • CLUSTER_NAME : nom du cluster
  • VERSION : numéro de version de GKE. Vous devez sélectionner la version 1.24 ou une version ultérieure.
  • LOCATION : région ou zone Compute Engine du cluster
  • PROJECT_ID : ID de votre projet

Pour activer le pilote sur un cluster Standard existant, utilisez la gcloud container clusters update commande :

gcloud container clusters update CLUSTER_NAME \
    --update-addons GcsFuseCsiDriver=ENABLED \
    --location=LOCATION

Pour vérifier que le pilote CSI Cloud Storage FUSE est activé sur votre cluster, exécutez la commande suivante :

gcloud container clusters describe CLUSTER_NAME \
    --location=LOCATION \
    --project=PROJECT_ID \
    --format="value(addonsConfig.gcsFuseCsiDriverConfig.enabled)"

Configurer l'accès aux buckets Cloud Storage

Le pilote CSI Cloud Storage FUSE utilise la fédération d'identité de charge de travail pour GKE afin que vous puissiez définir des autorisations précises sur la façon dont vos pods GKE peuvent accéder aux données stockées dans Cloud Storage.

Pour rendre vos buckets Cloud Storage accessibles à votre cluster GKE, authentifiez-vous à l'aide de Workload Identity Federation for GKE avec le bucket Cloud Storage que vous souhaitez installer dans la spécification de votre pod :

  1. Si la fédération d'identité de charge de travail pour GKE n'est pas activée, suivez ces étapes pour l'activer. Si vous souhaitez utiliser un pool de nœuds existant, activez manuellement Workload Identity Federation pour GKE sur votre pool de nœuds après l'avoir activée sur votre cluster.
  2. Obtenez les identifiants de votre cluster :

    gcloud container clusters get-credentials CLUSTER_NAME \
        --location=LOCATION
    

    Remplacez les éléments suivants :

  3. Créez un espace de noms à utiliser pour le compte de service Kubernetes. Vous pouvez également utiliser l'espace de noms default ou tout espace de noms existant.

    kubectl create namespace NAMESPACE
    

    Remplacez NAMESPACE par le nom de l'espace de noms Kubernetes du compte de service Kubernetes.

  4. Créez un compte de service Kubernetes que votre application pourra utiliser. Vous pouvez également utiliser n'importe quel compte de service Kubernetes existant dans n'importe quel espace de noms, y compris le compte de service Kubernetes default.

    kubectl create serviceaccount KSA_NAME \
        --namespace NAMESPACE
    

    Remplacez KSA_NAME par le nom de votre compte de service Kubernetes.

  5. Attribuez l'un des rôles IAM pour Cloud Storage au compte de service Kubernetes. Suivez ces étapes, selon que vous accordez au compte de service Kubernetes un accès à un bucket Cloud Storage spécifique uniquement ou un accès global à tous les buckets du projet.

    Accès à un bucket spécifique

    gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
        --member "principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \
        --role "ROLE_NAME"
    

    Remplacez les éléments suivants :

    • BUCKET_NAME : nom de votre bucket Cloud Storage.
    • PROJECT_NUMBER : numéro de projet de votre cluster GKE. Pour trouver votre numéro de projet, consultez Identifier des projets.
    • PROJECT_ID : ID de projet de votre cluster GKE.
    • NAMESPACE : nom de l'espace de noms Kubernetes du compte de service Kubernetes.
    • KSA_NAME : nom de votre nouveau compte de service Kubernetes.
    • ROLE_NAME : rôle IAM à attribuer à votre compte de service Kubernetes.
      • Pour les charges de travail en lecture seule, utilisez le rôle "Lecteur des objets de l'espace de stockage" (roles/storage.objectViewer).
      • Pour les charges de travail en lecture/écriture, utilisez le rôle Utilisateur d'objets Storage (roles/storage.objectUser).

    Accès global aux buckets

    gcloud projects add-iam-policy-binding GCS_PROJECT \
        --member "principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \
        --role "ROLE_NAME"
    

    Remplacez les éléments suivants :

    • GCS_PROJECT : ID de projet de vos buckets Cloud Storage.
    • PROJECT_NUMBER : numéro de projet de votre cluster GKE. Pour trouver votre numéro de projet, consultez Identifier des projets.
    • PROJECT_ID : ID de projet de votre cluster GKE.
    • NAMESPACE : nom de l'espace de noms Kubernetes du compte de service Kubernetes.
    • KSA_NAME : nom de votre nouveau compte de service Kubernetes.
    • ROLE_NAME : rôle IAM à attribuer à votre compte de service Kubernetes.
      • Pour les charges de travail en lecture seule, utilisez le rôle "Lecteur des objets de l'espace de stockage" (roles/storage.objectViewer).
      • Pour les charges de travail en lecture/écriture, utilisez le rôle Utilisateur des objets de l'espace de stockage (roles/storage.objectUser).

Configurer l'accès pour les pods avec un réseau hôte

Pour les versions de cluster GKE antérieures à 1.33.3-gke.1226000, le pilote CSI Cloud Storage FUSE n'est pas compatible avec les pods s'exécutant sur le réseau hôte (hostNetwork: true) en raison des restrictions de Workload Identity Federation for GKE. Toutefois, pour les versions ultérieures de GKE, vous pouvez configurer une authentification sécurisée pour les pods activés par hostNetwork lorsque vous utilisez le pilote CSI Cloud Storage FUSE pour installer des buckets Cloud Storage. La compatibilité avec le réseau hôte n'est disponible que sur les clusters GKE Standard.

Assurez-vous que votre cluster GKE répond aux exigences suivantes :

  • Le plan de contrôle et les pools de nœuds de votre cluster GKE Standard doivent être de version 1.33.3-gke.1226000 ou ultérieure.
  • Activez Workload Identity sur votre cluster.
  • Accordez les autorisations IAM nécessaires au compte de service Kubernetes que votre pod activé par hostNetwork utilise pour accéder à votre bucket Cloud Storage. Pour en savoir plus, consultez la section S'authentifier auprès de Cloud Storage FUSE.

Vous spécifiez l'attribut de volume hostNetworkPodKSA: "true" dans votre définition de pod ou de PersistentVolume pour permettre à vos pods HostNetwork d'accéder aux volumes Cloud Storage. La configuration exacte varie en fonction de la façon dont vous gérez le conteneur side-car Cloud Storage FUSE.

Side-cars gérés

Cette section s'applique si GKE injecte et gère automatiquement le conteneur side-car Cloud Storage FUSE dans vos pods. Cette option est la configuration par défaut et recommandée pour le pilote CSI Cloud Storage FUSE.

Volume éphémère

Le manifeste de pod suivant configure un volume éphémère pour qu'un pod HostNetwork accède à un bucket Cloud Storage.

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
  namespace: ns1
  annotations:
    gke-gcsfuse/volumes: "true"
spec:
  serviceAccountName: test-ksa-ns1
  hostNetwork: true
  containers:
  - image: busybox
    name: busybox
    command:
      - sleep
      - "3600"
    volumeMounts:
    - name: gcs-fuse-csi-ephemeral
      mountPath: /data
  volumes:
  - name: gcs-fuse-csi-ephemeral
    csi:
      driver: gcsfuse.csi.storage.gke.io
      volumeAttributes:
        bucketName: test-bucket
        hostNetworkPodKSA: "true"

Volume persistant

Le manifeste PV suivant configure un PV pour qu'un pod HostNetwork accède à un bucket Cloud Storage.

apiVersion: v1
kind: PersistentVolume
metadata:
name: gcp-cloud-storage-csi-pv
spec:
accessModes:
- ReadWriteMany
capacity:
  storage: 5Gi
persistentVolumeReclaimPolicy: Retain
# storageClassName does not need to refer to an existing StorageClass object.
storageClassName: test-storage-class
mountOptions:
  - uid=1001
  - gid=3003
csi:
  driver: gcsfuse.csi.storage.gke.io
  volumeHandle: test-wi-host-network-2
  volumeAttributes:
    hostNetworkPodKSA: "true"

Side-cars privés

Cette section s'applique si vous gérez manuellement le conteneur side-car Cloud Storage FUSE dans vos pods ou si vous utilisez une image side-car personnalisée.

Assurez-vous que votre image side-car est basée sur la version v1.17.2 ou ultérieure du pilote CSI Cloud Storage FUSE.

Volume éphémère

Le manifeste de pod suivant configure un volume éphémère pour qu'un pod HostNetwork accède à un bucket Cloud Storage.

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
  namespace: ns1
  annotations:
    gke-gcsfuse/volumes: "true"
spec:
  serviceAccountName: test-ksa-ns1
  hostNetwork: true
  containers:
  - image: busybox
    name: busybox
    command:
      - sleep
      - "3600"
    volumeMounts:
    - name: gcs-fuse-csi-ephemeral
      mountPath: /data
  volumes:
  - name: gcs-fuse-csi-ephemeral
    csi:
      driver: gcsfuse.csi.storage.gke.io
      volumeAttributes:
        bucketName: test-bucket
        hostNetworkPodKSA: "true"
        identityProvider: "https://container.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_NAME"

Dans le champ identityProvider, remplacez les éléments suivants :

  • PROJECT_ID: ID de votre Google Cloud projet
  • LOCATION : emplacement de votre cluster
  • CLUSTER_NAME : nom de votre cluster GKE Standard

Volume persistant

Le manifeste PV suivant configure un PV pour qu'un pod HostNetwork accède à un bucket Cloud Storage.

apiVersion: v1
kind: PersistentVolume
metadata:
name: gcp-cloud-storage-csi-pv
spec:
accessModes:
- ReadWriteMany
capacity:
  storage: 5Gi
persistentVolumeReclaimPolicy: Retain
# storageClassName does not need to refer to an existing StorageClass object.
storageClassName: test-storage-class
mountOptions:
  - uid=1001
  - gid=3003
csi:
  driver: gcsfuse.csi.storage.gke.io
  volumeHandle: test-wi-host-network-2
  volumeAttributes:
    hostNetworkPodKSA: "true"
    identityProvider: "https://container.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_NAME"

Dans le champ identityProvider, remplacez les éléments suivants :

  • PROJECT_ID: ID de votre Google Cloud projet
  • LOCATION : emplacement de votre cluster
  • CLUSTER_NAME : nom de votre cluster GKE Standard

Étape suivante