Configurer le pilote CSI Cloud Storage FUSE pour GKE


Cette page explique comment configurer et préparer l'utilisation du pilote CSI Cloud Storage FUSE pour GKE.

Pour utiliser le pilote CSI Cloud Storage FUSE, procédez comme suit :

Créer le bucket Cloud Storage

Si vous ne l'avez pas déjà fait, créez vos buckets Cloud Storage. Vous allez monter 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 standards. Pour créer un cluster Standard avec le pilote CSI Cloud Storage FUSE activé, vous pouvez utiliser la commande gcloud container clusters create :

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, exécutez la commande gcloud container clusters update :

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. Vous pouvez ainsi définir des autorisations précises sur la manière 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 la fédération d'identité de charge de travail pour GKE avec le bucket Cloud Storage que vous souhaitez monter dans la spécification de votre pod :

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

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

    Remplacez les éléments suivants :

    • CLUSTER_NAME : nom de votre cluster sur lequel la fédération d'identité de charge de travail pour GKE est activée.
    • LOCATION : région ou zone Compute Engine du cluster.
  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 pour le 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 ServiceAccount 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 l'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 des objets de l'espace de stockage (roles/storage.objectUser).

    Accès mondial 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 le 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 la fédération d'identité de charge de travail pour GKE. Toutefois, pour les versions ultérieures de GKE, vous pouvez configurer une authentification sécurisée pour les pods hostNetwork activés 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 :

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

Sidecars 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 fichier manifeste de pod suivant configure un volume éphémère pour qu'un pod HostNetwork puisse accéder à 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 fichier manifeste PV suivant configure un PV pour qu'un pod HostNetwork puisse accéder à 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 fichier manifeste de pod suivant configure un volume éphémère pour qu'un pod HostNetwork puisse accéder à 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 projet Google Cloud .
  • LOCATION : emplacement de votre cluster.
  • CLUSTER_NAME : nom de votre cluster GKE Standard.

Volume persistant

Le fichier manifeste PV suivant configure un PV pour qu'un pod HostNetwork puisse accéder à 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 projet Google Cloud .
  • LOCATION : emplacement de votre cluster.
  • CLUSTER_NAME : nom de votre cluster GKE Standard.

Étapes suivantes