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:
- Impara a conoscere il modo in cui Kubernetes e GKE su AWS gestiscono l'archiviazione del carico di lavoro. Per saperne di più su questi argomenti, consulta Utilizzo dell'archiviazione permanente nei tuoi carichi di lavoro GKE su carichi di lavoro AWS e Creazione di risorse Amazon EFS.
- Esegui l'upgrade a Kubernetes versione 1.25 o successiva per utilizzare il provisioning dinamico degli oggetti PersistentVolume da EFS. Se utilizzi Kubernetes versione 1.24, contatta l'assistenza per accedere a questa funzionalità.
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.
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
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.
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.
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.
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.
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
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.
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
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.
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.
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
.
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.
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.
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:
Usa
kubectl
per rimuovere la risorsa di attestazione EFS dal cluster:kubectl delete -f efs-claim.yaml
Se utilizzi il provisioning statico, usa
kubectl
per rimuovere le risorse associate dal cluster:kubectl delete -f efs-volume.yaml
Se utilizzi il provisioning dinamico, usa
kubectl
per rimuovere le risorse associate dal cluster:kubectl delete -f efs-storage-class.yaml
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.
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
Elimina tutti i gruppi di sicurezza che hai creato.
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
- Scopri come utilizzare
PersistentVolumeClaim
da un carico di lavoro per accedere a un volume EFS - Scopri altri modi per utilizzare i volumi EFS negli esempi di
aws-efs-csi-driver
.