Questa pagina descrive come configurare un PersistentVolume basato su EFS da utilizzare in GKE su AWS utilizzando il driver CSI EFS. Elastic File System (EFS) è il meccanismo AWS sottostante che fornisce file system di rete al tuo cluster. Un PersistentVolume basato su EFS è una risorsa del cluster che rende disponibile lo spazio di archiviazione ai tuoi carichi di lavoro tramite un punto di accesso EFS e garantisce che lo spazio di archiviazione venga mantenuto anche quando non sono connessi carichi di lavoro.
Questa pagina è rivolta agli operatori e agli esperti di archiviazione che vogliono configurare e gestire l'archiviazione. Per scoprire di più sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nei contenuti di Google Cloud , consulta Ruoli e attività comuni degli utenti GKE.
GKE su AWS supporta il provisioning statico e dinamico di PersistentVolume. Il provisioning dinamico utilizza una configurazione leggermente diversa, ma richiede meno impegno amministrativo in seguito.
Prima di iniziare
Per eseguire i passaggi descritti in questa pagina, completa prima le seguenti operazioni:
- Acquisisci familiarità con il modo in cui Kubernetes e GKE su AWS gestiscono l'archiviazione dei carichi di lavoro. Per saperne di più su questi argomenti, consulta Utilizzo dell'archiviazione permanente nei carichi di lavoro GKE su AWS e Creazione di risorse Amazon EFS.
- Esegui l'upgrade a Kubernetes versione 1.25 o successive per utilizzare il provisioning dinamico di PersistentVolumes utilizzando EFS. Se utilizzi Kubernetes versione 1.24, contatta l'assistenza per accedere a questa funzionalità.
Panoramica del provisioning statico
La creazione di un file system elastico (EFS) e la sua disponibilità per i carichi di lavoro nel tuo cluster tramite il provisioning statico prevede quattro passaggi:
- Crea la risorsa EFS
- Configurare la rete
- Crea una destinazione di montaggio
- Crea un
PersistentVolume
L'ultimo passaggio è per il workload: richiedere l'archiviazione permanente emettendo un
PersistentVolumeClaim
.
Panoramica del provisioning dinamico
La creazione di una risorsa EFS e la sua disponibilità tramite il provisioning dinamico richiede quattro passaggi:
- Crea la risorsa EFS
- Configurare la rete
- Crea una destinazione di montaggio
- Crea un
StorageClass
La creazione di StorageClass
è un'operazione una tantum. Una volta definita una classe di archiviazione con determinate caratteristiche, il workload può emettere un PersistentVolumeClaim o una richiesta di spazio di archiviazione permanente. Tutti i PersistentVolumeClaim per lo spazio di archiviazione con
queste caratteristiche possono richiedere lo stesso StorageClass
.
Passaggi comuni
Indipendentemente dal fatto che utilizzi il provisioning statico o dinamico nel cluster, devi iniziare con i passaggi di configurazione elencati qui, quindi continuare con i passaggi di provisioning statico o dinamico a seconda dei casi. Dopo aver creato l'EFS e averlo reso accessibile, il workload deve eseguire i passaggi finali per accedervi. I passaggi da seguire sono descritti in Utilizzare lo spazio di archiviazione EFS.
Crea una risorsa AWS EFS
Una risorsa EFS è obbligatoria indipendentemente dal fatto che utilizzi il provisioning statico o dinamico. Se il tuo cluster utilizza entrambi, puoi creare risorse EFS separate per ciascuno o utilizzare la stessa per entrambi. Consulta Creazione di file system Amazon EFS per saperne di più sulla creazione di una risorsa EFS.
Puoi anche riutilizzare un EFS esistente, nel qual caso puoi saltare questa sezione e procedere con Crea 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 Google Cloud posizione del cluster AWS
Crea un sistema di risorse EFS nella stessa regione AWS con il seguente comando.
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 i target di montaggio EFS. Un target di montaggio è un indirizzo IP privato che utilizza i gruppi di sicurezza AWS per controllare l'accesso all'EFS sottostante.
Se i node pool nel cluster vengono eseguiti su subnet diverse, devi creare un target di montaggio separato su ogni subnet del pool di nodi.
In questo esempio, l'accesso a ogni target di montaggio è protetto da un singolo gruppo di sicurezza che include sia i target di montaggio sia le macchine del pool di nodi. A seconda della configurazione VPC e dei requisiti di sicurezza, potresti scegliere di dividere questa configurazione in due o più gruppi di sicurezza, ad esempio uno per le destinazioni di montaggio e un altro per i nodi di lavoro del pool di nodi.
Crea un gruppo di sicurezza dedicato per controllare l'accesso a EFS
Ottieni l'ID del VPC AWS in 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 tuo VPC. Salva questo valore. Ne avrai bisogno successivamente.
Crea un gruppo di sicurezza per controllare l'accesso alla destinazione di 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 di 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 in 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 che includa 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 una StorageClass (dinamica)
Se utilizzi il provisioning statico, il passaggio successivo consiste nel creare un PersistentVolume. Se utilizzi il provisioning dinamico, il driver EFS lo fa per te. Invece, definisci uno StorageClass per i carichi di lavoro da specificare nel PersistentVolumeClaim. Scegli la scheda corrispondente al metodo di provisioning scelto.
Provisioning statico
Se utilizzi il provisioning statico, il passaggio successivo consiste nel creare un PersistentVolume che monta una condivisione EFS.
Scegli la scheda appropriata a seconda che tu ti connetta direttamente alla condivisione EFS o tramite un punto di accesso.
Connettersi direttamente
Copia il seguente manifest YAML in un file denominato
efs-volume.yaml
. Il manifest fa riferimento alla classe di archiviazione EFS che hai creato 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 PersistentVolumeClaim.
- EFS_ID con l'ID risorsa EFS. Ad esempio,
fs-12345678a
.
Punto di accesso
Per creare un volume basato su un punto di accesso, devi eseguirne il provisioning manualmente. Per ulteriori informazioni, consulta la sezione Utilizzo dei punti di accesso EFS.
Copia il seguente manifest YAML in un file denominato
efs-volume.yaml
. Il manifest fa riferimento alla classe di archiviazione EFS che hai creato 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 PersistentVolumeClaim.
- EFS_ID con l'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 di PersistentVolume.
persistentvolume/VOLUME_NAME created
Provisioning dinamico
Questa sezione descrive come creare una StorageClass che fa riferimento alla risorsa EFS che hai creato in precedenza. Una volta completata questa operazione, gli sviluppatori possono accedere alla risorsa EFS seguendo i passaggi descritti in Utilizzare una risorsa EFS.
Crea una 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 modificare 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 l'ID risorsa EFS, ad esempio fs-12345678a.
Applica il codice YAML al tuo cluster.
kubectl apply -f efs-storage-class.yaml
Se l'operazione va a buon fine, 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 i seguenti comandi:
Utilizza
kubectl
per rimuovere la risorsa di rivendicazione EFS dal cluster:kubectl delete -f efs-claim.yaml
Se utilizzi il provisioning statico, utilizza
kubectl
per rimuovere le risorse associate dal cluster:kubectl delete -f efs-volume.yaml
Se utilizzi il provisioning dinamico, utilizza
kubectl
per rimuovere le risorse associate dal cluster:kubectl delete -f efs-storage-class.yaml
Trova l'ID della destinazione di 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 di 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 di montaggio EFS
- AWS_REGION: la regione AWS della destinazione di montaggio
Elimina tutti i gruppi di sicurezza che hai creato.
Elimina il file system utilizzando il comando CLI delete-file-system. Puoi ottenere un elenco dei tuoi file system utilizzando il comando CLI 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 un
PersistentVolumeClaim
da un workload per accedere a un volume EFS - Scopri altri modi per utilizzare i volumi EFS negli
esempi di
aws-efs-csi-driver
.