Esegui il provisioning di un volume permanente con EFS

Questa pagina descrive come configurare un PersistentVolume basato su EFS per l'utilizzo in GKE su AWS usando il Driver CSI EFS. L'Elastic File System (EFS) è il meccanismo AWS sottostante che fornisce i file system di rete al cluster. Un PersistentVolume basato su EFS è una risorsa cluster che rende disponibile l'archiviazione per i tuoi carichi di lavoro attraverso un punto di accesso EFS e garantisce che l'archiviazione continui anche quando non sono collegati carichi di lavoro.

GKE su AWS supporta il provisioning statico e dinamico degli oggetti PersistentVolume. Il provisioning dinamico usa una configurazione leggermente diversa, ma in seguito richiede un impegno amministrativo minore.

Prima di iniziare

Per seguire i passaggi descritti in questa pagina, devi prima completare le seguenti operazioni:

Panoramica del provisioning statico

La creazione di un Elastic File System (EFS) e la sua disponibilità per i carichi di lavoro nel tuo cluster tramite il provisioning statico prevede quattro passaggi:

  • Crea la tua risorsa EFS
  • Configurare la rete
  • Crea una destinazione di montaggio
  • Crea un PersistentVolume

Il passaggio finale consiste nel carico di lavoro: richiedere l'archiviazione permanente mediante l'invio di un PersistentVolumeClaim.

Panoramica del provisioning dinamico

Anche la creazione di una risorsa EFS e la sua disponibilità tramite il provisioning dinamico prevede quattro passaggi:

  • Crea la tua risorsa EFS
  • Configurare la rete
  • Crea una destinazione di montaggio
  • Crea un StorageClass

La creazione di StorageClass è un'operazione una tantum. Dopo aver definito una classe di archiviazione con determinate caratteristiche, il carico di lavoro può inviare un PersistentVolumeClaim o richiedere l'archiviazione permanente. Tutti gli oggetti PersistentVolumeClaim per spazio di archiviazione con queste caratteristiche possono richiedere lo stesso StorageClass.

Passaggi comuni

A prescindere dal fatto che utilizzi il provisioning statico o dinamico nel tuo cluster, devi iniziare con i passaggi di configurazione elencati qui, quindi continuare con quelli relativi al provisioning statico o dinamico, a seconda dei casi. Dopo aver creato il file EFS e averlo reso accessibile, il carico di lavoro deve eseguire i passaggi finali per accedervi. I passaggi per farlo sono descritti nella sezione Utilizzare l'archiviazione EFS.

Crea una risorsa AWS EFS

Se utilizzi il provisioning statico o dinamico, è necessaria una risorsa EFS. Se il cluster utilizza entrambi, puoi creare risorse EFS separate o utilizzare la stessa risorsa per entrambi. Consulta la pagina relativa alla creazione di file system Amazon EFS per saperne di più sulla creazione di una risorsa EFS.

Puoi anche riutilizzare un EFS esistente. In questo caso, puoi saltare questa sezione e passare a Creare target di montaggio.

  1. Ottieni la regione AWS in cui viene eseguito il cluster.

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

    Sostituisci quanto segue:

    • CLUSTER_NAME: il nome del cluster AWS.
    • LOCATION: la località Google Cloud del cluster AWS
  2. Crea un sistema di risorse EFS nella stessa regione AWS con il comando seguente.

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

    Sostituisci quanto segue:

    • AWS_REGION: la regione AWS in cui viene eseguito il cluster

L'output include l'ID del file system. Salva questo valore. Ne avrai bisogno successivamente.

Crea target di montaggio

Il driver CSI per EFS accede ai file system tramite destinazioni di montaggio EFS. Una destinazione di montaggio è un indirizzo IP privato che utilizza i gruppi di sicurezza AWS per controllare l'accesso all'EFS sottostante.

Se i pool di nodi nel cluster sono in esecuzione su subnet diverse, devi creare una destinazione di montaggio separata su ogni subnet del pool di nodi.

In questo esempio, l'accesso a ogni destinazione di montaggio è protetto da un singolo gruppo di sicurezza che include sia le destinazioni di montaggio sia le macchine del pool di nodi. A seconda della configurazione VPC e dei requisiti di sicurezza, potresti scegliere di suddividere questa configurazione in due o più gruppi di sicurezza, ad esempio uno per le destinazioni di montaggio e un altro per i nodi worker del pool di nodi.

  1. Crea un gruppo di sicurezza dedicato per controllare l'accesso a EFS

    Ottieni l'ID del VPC AWS su cui viene eseguito il cluster.

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

    Sostituisci quanto segue:

    • CLUSTER_NAME
    • LOCATION

    L'output include l'ID del VPC. Salva questo valore. Ne avrai bisogno successivamente.

  2. Crea un gruppo di sicurezza per controllare l'accesso alla destinazione del montaggio EFS.

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

    Sostituisci VPC_ID con l'ID del VPC AWS in cui viene eseguito il cluster.

    L'output include l'ID del nuovo gruppo di sicurezza. Salva questo valore. Ne avrai bisogno successivamente.

  3. Per impostazione predefinita, AWS crea gruppi di sicurezza con una regola predefinita che consente tutto il traffico in uscita. Rimuovi la regola in uscita predefinita.

    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"}]}]'
    

    Sostituisci SECURITY_GROUP_ID con l'ID del gruppo di sicurezza AWS.

  4. Autorizza il traffico in entrata e in uscita per EFS (porta 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. Crea una destinazione di montaggio EFS su ogni subnet del pool di nodi.

    Elenca le subnet associate a tutti i pool di nodi.

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

    Sostituisci quanto segue:

    • CLUSTER_NAME
    • LOCATION

    L'output è un elenco di ID subnet. Salva questo valore. Ne avrai bisogno successivamente.

  6. Per ogni subnet, crea una destinazione di montaggio EFS associata con il gruppo di sicurezza applicato.

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

    Sostituisci quanto segue:

    • EFS_ID: l'ID della risorsa EFS.
    • SUBNET_ID: l'ID della subnet del pool di nodi.
    • SECURITY_GROUP_ID
  7. Aggiungi il gruppo di sicurezza EFS a tutti i pool di nodi del cluster.

    Recupera l'elenco di tutti i tuoi pool di nodi.

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

    Sostituisci quanto segue:

    • CLUSTER_NAME
    • LOCATION

    L'output include i nomi dei pool di nodi del cluster. Salva questo valore. Ne avrai bisogno successivamente.

  8. Aggiorna ogni pool di nodi in modo da includere il nuovo gruppo di sicurezza EFS.

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

    Sostituisci quanto segue:

    • NODE_POOL_NAME: il nome del pool di nodi.
    • CLUSTER_NAME: il nome del tuo cluster.
    • LOCATION
    • SECURITY_GROUP_IDS l'elenco degli ID gruppo di sicurezza per i nodi worker.

Crea un PersistentVolume (statico) o StorageClass (dinamico)

Se usi il provisioning statico, il passaggio successivo è creare un PersistentVolume. Se utilizzi il provisioning dinamico, il driver EFS lo fa per te; devi invece definire un oggetto StorageClass per i carichi di lavoro da specificare nell'oggetto PersistentVolumeClaim. Scegli la scheda corrispondente al metodo di provisioning scelto.

Provisioning statico

Se utilizzi il provisioning statico, il passaggio successivo è creare un PersistentVolume che monta una condivisione EFS.

  1. Scegli la scheda appropriata se ti connetti direttamente alla condivisione EFS o tramite un punto di accesso.

    Connettiti direttamente

    Copia il seguente manifest YAML in un file denominato efs-volume.yaml. Il file manifest fa riferimento alla classe di archiviazione EFS creata in precedenza.

    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
    

    Sostituisci quanto segue:

    • VOLUME_NAME con un nome per il volume permanente.
    • CLAIM_NAME con il nome che vuoi utilizzare per l'oggetto PersistentVolumeClaim.
    • EFS_ID con il tuo ID risorsa EFS. Ad esempio, fs-12345678a.

    Punto di accesso

    Per creare un volume basato su punto di accesso, devi eseguirne manualmente il provisioning. Per ulteriori informazioni, consulta Operazioni con i punti di accesso EFS.

    Copia il seguente manifest YAML in un file denominato efs-volume.yaml. Il file manifest fa riferimento alla classe di archiviazione EFS creata in precedenza.

    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
    

    Sostituisci quanto segue:

    • VOLUME_NAME con un nome per il volume permanente.
    • CLAIM_NAME con il nome che vuoi utilizzare per l'oggetto PersistentVolumeClaim.
    • EFS_ID con il tuo ID risorsa EFS. Ad esempio, fs-12345678a.
    • ACCESS_POINT_ID con l'ID del tuo punto di accesso. Ad esempio, fsap-1234567890abcde.
  2. Applica il codice YAML al tuo cluster.

    kubectl apply -f efs-volume.yaml
    

    L'output conferma la creazione del PersistentVolume.

    persistentvolume/VOLUME_NAME created
    
    

Provisioning dinamico

Questa sezione descrive come creare un oggetto StorageClass che faccia riferimento alla risorsa EFS creata in precedenza. Al termine, gli sviluppatori possono accedere alla risorsa EFS seguendo i passaggi descritti in Utilizzare una risorsa EFS.

  1. Creare un oggetto StorageClass che faccia riferimento all'ID risorsa EFS.

    Copia il seguente frammento YAML in un nuovo file denominato efs-storage-class.yaml. Per scoprire di più su come regolare le caratteristiche di StorageClass descritte in questo file, consulta la documentazione sui parametri 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"
    
    

    Sostituisci:

    • EFS_STORAGE_CLASS_NAME con il nome che hai scelto per StorageClass.
    • EFS_ID con il tuo ID risorsa EFS, ad esempio fs-12345678a.
  2. Applica il codice YAML al tuo cluster.

    kubectl apply -f efs-storage-class.yaml
    

    Se l'esito è positivo, l'output di questo comando conterrà una riga simile alla seguente:

    storageclass/EFS_STORAGE_CLASS_NAME created

Esegui la pulizia

Per rimuovere le risorse create nelle sezioni precedenti, esegui questi comandi:

  1. Usa kubectl per rimuovere la risorsa di attestazione EFS dal cluster:

    kubectl delete -f efs-claim.yaml
    
  2. Se utilizzi il provisioning statico, usa kubectl per rimuovere le risorse associate dal cluster:

    kubectl delete -f efs-volume.yaml
    
  3. Se utilizzi il provisioning dinamico, usa kubectl per rimuovere le risorse associate dal cluster:

    kubectl delete -f efs-storage-class.yaml
    
  4. Trova l'ID della destinazione del montaggio:

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

    Sostituisci quanto segue:

    • EFS_ID: l'ID della risorsa EFS
    • AWS_REGION: la regione AWS in cui viene eseguito il cluster

    L'output include l'ID della destinazione del montaggio. Salva questo valore. Ne avrai bisogno successivamente.

  5. Elimina la destinazione di montaggio EFS:

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

    Sostituisci quanto segue:

    • MOUNT_TARGET_ID: l'ID della destinazione del montaggio EFS
    • AWS_REGION: la regione AWS della destinazione del montaggio
  6. Elimina tutti i gruppi di sicurezza che hai creato.

  7. Elimina il file system utilizzando il comando dell'interfaccia a riga di comando delete-file-system. Puoi ottenere un elenco dei tuoi file system utilizzando il comando dell'interfaccia a riga di comando describe-file-systems. L'ID del file system è nella risposta.

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

    Sostituisci quanto segue:

    • EFS_ID
    • AWS_REGION

Passaggi successivi