Provisionner un volume persistant avec EFS

Cette page explique comment configurer une instance PersistentVolume à utiliser dans GKE sur AWS à l'aide de l'API EFS CSI Pilote. Le système Elastic File System (EFS) est le mécanisme AWS sous-jacent qui fournit des systèmes de fichiers réseau à votre cluster. Un volume PersistentVolume basé sur EFS est une ressource de cluster qui rend le stockage disponible pour vos charges de travail via un point d'accès EFS, et garantit que le stockage est conservé même si aucune charge de travail n'y est connectée.

GKE sur AWS est compatible avec le provisionnement statique et dynamique des volumes PersistentVolume. Le provisionnement dynamique utilise une configuration légèrement différente, mais nécessite moins d'efforts administratifs par la suite.

Avant de commencer

Pour effectuer les étapes décrites sur cette page, procédez comme suit :

Présentation du provisionnement statique

Créer un système Elastic File System (EFS) et le mettre à la disposition des charges de travail dans votre cluster via un provisionnement statique implique quatre étapes:

  • Créer votre ressource EFS
  • Configurer votre réseau
  • Créer une cible d'installation
  • Créer un objet PersistentVolume

La dernière étape est effectuée par la charge de travail : demander un stockage persistant à l'aide d'un PersistentVolumeClaim.

Présentation du provisionnement dynamique

Créer une ressource EFS et la rendre disponible via le provisionnement dynamique comporte également quatre étapes:

  • Créer votre ressource EFS
  • Configurer votre réseau
  • Créer une cible d'installation
  • Créer un objet StorageClass

La création de l'StorageClass est une opération unique. Une fois qu'une classe de stockage avec des caractéristiques données est définie, la charge de travail peut émettre un objet PersistentVolumeClaim ou demander un stockage permanent. Tous les objets PersistentVolumeClaim pour le stockage avec ces caractéristiques peuvent demander le même StorageClass.

Étapes courantes

Que vous utilisiez un provisionnement statique ou dynamique dans votre cluster, vous devez commencer par suivre les étapes de configuration indiquées ici, puis passer aux étapes de provisionnement statique ou dynamique, selon les besoins. Une fois que vous avez créé votre EFS et l'avez rendu accessible, la charge de travail doit effectuer les dernières étapes pour y accéder. Pour ce faire, procédez comme suit : Utilisez le stockage EFS.

Créer une ressource AWS EFS

Une ressource EFS est requise, que vous utilisiez le provisionnement statique ou dynamique. Si votre cluster utilise les deux, vous pouvez créer des ressources EFS distinctes pour chacun d'eux ou utiliser les mêmes pour les deux. Consultez la page Créer des systèmes de fichiers Amazon EFS pour en savoir plus sur la création d'une ressource EFS.

Vous pouvez également réutiliser un EFS existant, auquel cas vous pouvez ignorer cette section et passer à Créez des cibles d'installation.

  1. Obtenez la région AWS dans laquelle s'exécute votre cluster.

    gcloud container aws clusters describe CLUSTER_NAME \
      --location=LOCATION \
      --format="value(awsRegion)"
    

    Remplacez les éléments suivants :

    • CLUSTER_NAME : nom du cluster AWS.
    • LOCATION : emplacement Google Cloud du cluster AWS
  2. Créez un système de ressources EFS dans la même région AWS à l'aide de la commande suivante.

    aws efs create-file-system \
      --region AWS_REGION \
      --performance-mode generalPurpose \
      --query 'FileSystemId' \
      --output text
    

    Remplacez les éléments suivants :

    • AWS_REGION : région AWS dans laquelle s'exécute le cluster.

La sortie inclut l'ID du système de fichiers. Enregistrez cette valeur. Vous en aurez besoin ultérieurement.

Créer des cibles d'installation

Le pilote CSI pour EFS accède aux systèmes de fichiers via des cibles d'installation EFS. Une cible d'installation est une adresse IP privée qui utilise des groupes de sécurité AWS pour contrôler l'accès à l'EFS sous-jacent.

Si les pools de nœuds de votre cluster s'exécutent sur des sous-réseaux différents, vous devez créer une cible d'installation distincte sur chaque sous-réseau de pool de nœuds.

Dans cet exemple, l'accès à chaque cible d'installation est protégé par un seul groupe de sécurité qui inclut à la fois les cibles d'installation et les machines du pool de nœuds. En fonction de la configuration de votre VPC et de vos exigences de sécurité, vous pouvez choisir de diviser cette configuration en deux groupes de sécurité ou plus, par exemple un pour les cibles d'installation et un autre pour les nœuds de calcul du pool de nœuds.

  1. Créer un groupe de sécurité dédié pour contrôler l'accès à EFS

    Procurez-vous l'ID du VPC AWS dans lequel le cluster s'exécute.

    gcloud container aws clusters describe CLUSTER_NAME \
      --location=LOCATION \
      --format="value(networking.vpcId)"
    

    Remplacez les éléments suivants :

    • CLUSTER_NAME
    • LOCATION

    Le résultat inclut l'ID de votre VPC. Enregistrez cette valeur. Vous en aurez besoin ultérieurement.

  2. Créez un groupe de sécurité pour contrôler l'accès à votre cible d'installation EFS.

    aws ec2 create-security-group \
      --group-name gke-efs-security-group \
      --description "EFS security group" \
      --vpc-id VPC_ID \
      --output text
    

    Remplacez VPC_ID par l'ID du VPC AWS sur lequel le cluster s'exécute.

    Le résultat inclut l'ID du nouveau groupe de sécurité. Enregistrez cette valeur. Vous en aurez besoin ultérieurement.

  3. Par défaut, AWS crée des groupes de sécurité avec une règle par défaut autorisant tout le trafic sortant. Supprimez la règle par défaut pour le trafic sortant.

    aws ec2 revoke-security-group-egress \
      --group-id SECURITY_GROUP_ID
      --ip-permissions '[{"IpProtocol":"-1","FromPort":-1,"ToPort":-1,"IpRanges":[{"CidrIp":"0.0.0.0/0"}]}]'
    

    Remplacez SECURITY_GROUP_ID par l'ID du groupe de sécurité AWS.

  4. Autorisez le trafic entrant et sortant pour l'environnement EFS (port 2049).

    aws ec2 authorize-security-group-ingress \
        --group-id SECURITY_GROUP_ID \
        --protocol tcp \
        --port 2049 \
        --source-group SECURITY_GROUP_ID
    
    aws ec2 authorize-security-group-egress \
        --group-id SECURITY_GROUP_ID \
        --protocol tcp \
        --port 2049 \
        --source-group SECURITY_GROUP_ID
    
  5. Créez une cible d'installation EFS sur chaque sous-réseau de pool de nœuds.

    Répertorier les sous-réseaux associés à tous les pools de nœuds.

    gcloud container aws node-pools list \
      --cluster=CLUSTER_NAME \
      --location=LOCATION \
      --format="value(subnetId)"
    

    Remplacez les éléments suivants :

    • CLUSTER_NAME
    • LOCATION

    La sortie est une liste d'ID de sous-réseau. Enregistrez cette valeur. Vous en aurez besoin ultérieurement.

  6. Pour chaque sous-réseau, créez une cible d'installation EFS associée avec le groupe de sécurité appliqué.

    aws efs create-mount-target \
        --file-system-id EFS_ID \
        --subnet-id SUBNET_ID \
        --security-groups SECURITY_GROUP_ID
    

    Remplacez les éléments suivants :

    • EFS_ID: ID de votre ressource EFS.
    • SUBNET_ID : ID du sous-réseau du pool de nœuds
    • SECURITY_GROUP_ID
  7. Ajoutez le groupe de sécurité EFS à tous les pools de nœuds du cluster.

    Obtenez la liste de tous vos pools de nœuds.

    gcloud container aws node-pools list \
      --cluster=CLUSTER_NAME \
      --location=LOCATION
    

    Remplacez les éléments suivants :

    • CLUSTER_NAME
    • LOCATION

    Le résultat inclut le nom des pools de nœuds de votre cluster. Enregistrez cette valeur. Vous en aurez besoin ultérieurement.

  8. Mettez à jour chaque pool de nœuds pour inclure le nouveau groupe de sécurité EFS.

    gcloud container aws node-pools update NODE_POOL_NAME \
      --cluster=CLUSTER_NAME \
      --location=LOCATION  \
      --security-group-ids=SECURITY_GROUP_IDS
    

    Remplacez les éléments suivants :

    • NODE_POOL_NAME : nom du pool de nœuds.
    • CLUSTER_NAME : nom du cluster
    • LOCATION
    • SECURITY_GROUP_IDS : liste des ID de groupe de sécurité pour les nœuds de calcul

Créer un volume PersistentVolume (statique) ou une classe StorageClass (dynamique)

Si vous utilisez le provisionnement statique, l'étape suivante consiste à créer un volume PersistentVolume. Si vous utilisez le provisionnement dynamique, le pilote EFS s'en charge à votre place. Vous définissez à la place une classe StorageClass pour les charges de travail à spécifier dans leur objet PersistentVolumeClaim. Sélectionnez l'onglet correspondant à la méthode de provisionnement choisie.

Provisionnement statique

Si vous utilisez le provisionnement statique, l'étape suivante consiste à créer un volume PersistentVolume qui installe un partage EFS.

  1. Choisissez l'onglet approprié, selon que vous vous connectez directement au partage EFS ou via un point d'accès.

    Se connecter directement

    Copiez le fichier manifeste YAML suivant dans un fichier nommé efs-volume.yaml. Le fichier manifeste fait référence à la classe de stockage EFS que vous avez créée précédemment.

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: VOLUME_NAME
    spec:
      capacity:
        # Note: storage capacity is not used by the EFS CSI driver.
        # It is required by the PersistentVolume spec.
        storage: 5Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain
      storageClassName: "" # storageClassName is not required, see note in the following section.
      claimRef:
        name: CLAIM_NAME
        namespace: default
      csi:
        driver: efs.csi.aws.com
        volumeHandle: EFS_ID
    

    Remplacez les éléments suivants :

    • VOLUME_NAME par le nom du volume persistant.
    • CLAIM_NAME par le nom que vous souhaitez utiliser pour l'objet PersistentVolumeClaim.
    • EFS_ID par votre ID de ressource EFS. Exemple : fs-12345678a.

    Point d'accès

    Pour créer un volume basé sur un point d'accès, vous devez le provisionner manuellement. Pour en savoir plus, consultez la section Utiliser des points d'accès EFS.

    Copiez le fichier manifeste YAML suivant dans un fichier nommé efs-volume.yaml. Le fichier manifeste fait référence à la classe de stockage EFS que vous avez créée précédemment.

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: VOLUME_NAME
    spec:
      capacity:
        # Note: storage capacity is not used by the EFS CSI driver.
        # It is required by the PersistentVolume spec.
        storage: 5Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain
      # Set storageClassName to empty string for static provisioning. See [Use an EFS resource](/kubernetes-engine/multi-cloud/docs/aws/how-to/use-efs)
      storageClassName: ""
      claimRef:
        name: CLAIM_NAME
        namespace: default
      csi:
        driver: efs.csi.aws.com
        volumeHandle: EFS_ID::ACCESS_POINT_ID
    

    Remplacez les éléments suivants :

    • VOLUME_NAME par le nom du volume persistant.
    • CLAIM_NAME par le nom que vous souhaitez utiliser pour l'objet PersistentVolumeClaim.
    • EFS_ID par votre ID de ressource EFS. Exemple : fs-12345678a.
    • ACCESS_POINT_ID par l'ID de votre point d'accès. Exemple : fsap-1234567890abcde.
  2. Appliquez le code YAML à votre cluster.

    kubectl apply -f efs-volume.yaml
    

    La sortie confirme la création de l'objet PersistentVolume.

    persistentvolume/VOLUME_NAME created
    
    

Provisionnement dynamique

Cette section explique comment créer une classe StorageClass qui référence la ressource EFS que vous avez créée précédemment. Une fois cette opération effectuée, les développeurs peuvent accéder à la ressource EFS en suivant la procédure décrite dans Utilisez une ressource EFS.

  1. Créez une classe StorageClass qui référence l'ID de ressource EFS.

    Copiez le fragment YAML suivant dans un nouveau fichier nommé efs-storage-class.yaml. Pour en savoir plus sur l'ajustement des caractéristiques de la classe StorageClass décrite par ce fichier, consultez la documentation Paramètres de StorageClass EFS

    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: EFS_STORAGE_CLASS_NAME
    provisioner: efs.csi.aws.com
    mountOptions:
      - tls
    parameters:
      provisioningMode: efs-ap
      fileSystemId: EFS_ID
      directoryPerms: "700"
    
    

    Remplacez :

    • EFS_STORAGE_CLASS_NAME par le nom que vous avez choisi pour la classe StorageClass.
    • EFS_ID par votre ID de ressource EFS (par exemple, fs-12345678a).
  2. Appliquez le code YAML à votre cluster.

    kubectl apply -f efs-storage-class.yaml
    

    Si la commande est bien exécutée, le résultat de cette commande contiendra une ligne semblable à celle-ci :

    storageclass/EFS_STORAGE_CLASS_NAME created

Effectuer un nettoyage

Pour supprimer les ressources créées dans les sections précédentes, exécutez les commandes suivantes :

  1. Utilisez kubectl pour supprimer la ressource de revendication EFS de votre cluster :

    kubectl delete -f efs-claim.yaml
    
  2. Si vous utilisez le provisionnement statique, utilisez kubectl pour supprimer les ressources associées de votre cluster :

    kubectl delete -f efs-volume.yaml
    
  3. Si vous utilisez le provisionnement dynamique, utilisez kubectl pour supprimer les ressources associées de votre cluster :

    kubectl delete -f efs-storage-class.yaml
    
  4. Recherchez l'ID de votre cible d'installation:

    aws efs describe-mount-targets \
    --file-system-id EFS_ID \
    --profile adminuser \
    --region AWS_REGION
    

    Remplacez les éléments suivants :

    • EFS_ID : ID de votre ressource EFS
    • AWS_REGION : région AWS dans laquelle s'exécute le cluster.

    La sortie inclut l'ID de la cible d'installation. Enregistrez cette valeur. Vous en aurez besoin ultérieurement.

  5. Supprimez votre cible d'installation EFS:

    aws efs delete-mount-target \
    --mount-target-id MOUNT_TARGET_ID \
    --profile adminuser \
    --region AWS_REGION
    

    Remplacez les éléments suivants :

    • MOUNT_TARGET_ID : ID de votre cible d'installation EFS
    • AWS_REGION: région AWS de votre cible d'installation
  6. Supprimez tous les groupes de sécurité que vous avez créés.

  7. Supprimez le système de fichiers à l'aide de la commande CLI delete-file-system. Vous pouvez obtenir la liste de vos systèmes de fichiers à l'aide de la commande CLI describe-file-systems. L'ID du système de fichiers se trouve dans la réponse.

    aws efs delete-file-system \
      --file-system-id EFS_ID \
      --profile adminuser \
      --region AWS_REGION
    

    Remplacez les éléments suivants :

    • EFS_ID
    • AWS_REGION

Étapes suivantes