Esta página describe cómo configurar un PersistentVolume basado en EFS para su uso en GKE en AWS mediante el controlador CSI de EFS . El Elastic File System (EFS) es el mecanismo subyacente de AWS que proporciona sistemas de archivos de red a su clúster. Un PersistentVolume basado en EFS es un recurso de clúster que proporciona almacenamiento a sus cargas de trabajo a través de un punto de acceso de EFS y garantiza su persistencia incluso cuando no hay cargas de trabajo conectadas.
Esta página está dirigida a operadores y especialistas en almacenamiento que desean configurar y administrar el almacenamiento. Para obtener más información sobre los roles comunes y las tareas de ejemplo que mencionamos en Google Cloud contenido, consulte Roles y tareas de usuario comunes de GKE Enterprise .
GKE en AWS admite el aprovisionamiento estático y dinámico de volúmenes persistentes. El aprovisionamiento dinámico utiliza una configuración ligeramente diferente, pero requiere menos esfuerzo administrativo posterior.
Antes de empezar
Para realizar los pasos de esta página, primero complete lo siguiente:
- Familiarícese con la gestión del almacenamiento de cargas de trabajo en Kubernetes y GKE en AWS. Para obtener más información sobre estos temas, consulte Uso del almacenamiento persistente en sus cargas de trabajo de GKE en AWS y Creación de recursos de Amazon EFS .
- Actualice a la versión 1.25 o posterior de Kubernetes para usar el aprovisionamiento dinámico de PersistentVolumes mediante EFS. Si usa la versión 1.24 de Kubernetes, contacte con el equipo de soporte para acceder a esta función.
Descripción general del aprovisionamiento estático
La creación de un sistema de archivos elástico (EFS) y su puesta a disposición de las cargas de trabajo en su clúster a través del aprovisionamiento estático consta de cuatro pasos:
- Crea tu recurso EFS
- Configura tu red
- Crear un objetivo de montaje
- Crear un
PersistentVolume
El paso final es por carga de trabajo: solicitar almacenamiento persistente emitiendo un PersistentVolumeClaim
.
Descripción general del aprovisionamiento dinámico
La creación de un recurso EFS y su puesta a disposición a través del aprovisionamiento dinámico también consta de cuatro pasos:
- Crea tu recurso EFS
- Configura tu red
- Crear un objetivo de montaje
- Crear una
StorageClass
La creación de la StorageClass
se realiza una sola vez. Una vez definida una clase de almacenamiento con las características dadas, la carga de trabajo puede emitir un PersistentVolumeClaim o una solicitud de almacenamiento persistente. Todos los PersistentVolumeClaims para almacenamiento con esas características pueden solicitar la misma StorageClass
.
Pasos comunes
Independientemente de si utiliza aprovisionamiento estático o dinámico en su clúster, debe comenzar con los pasos de configuración que se indican aquí y luego continuar con los pasos de aprovisionamiento estático o dinámico, según corresponda. Una vez creado su EFS y habilitado para el acceso, la carga de trabajo debe completar los pasos finales para acceder a él. Los pasos para ello se describen en Usar almacenamiento EFS .
Crear un recurso de AWS EFS
Se requiere un recurso EFS tanto si se utiliza aprovisionamiento estático como dinámico. Si el clúster utiliza ambos, puede crear recursos EFS independientes o usar el mismo para ambos. Consulte "Creación de sistemas de archivos de Amazon EFS" para obtener más información sobre la creación de un recurso EFS.
También puede reutilizar un EFS existente, en cuyo caso puede omitir esta sección y continuar con Crear objetivos de montaje .
Obtenga la región de AWS donde se ejecuta su clúster.
gcloud container aws clusters describe CLUSTER_NAME \ --location=LOCATION \ --format="value(awsRegion)"
Reemplace lo siguiente:
- CLUSTER_NAME : el nombre del clúster de AWS.
- LOCATION : el Google Cloud ubicación del clúster de AWS
Cree un sistema de recursos EFS en la misma región de AWS con el siguiente comando.
aws efs create-file-system \ --region AWS_REGION \ --performance-mode generalPurpose \ --query 'FileSystemId' \ --output text
Reemplace lo siguiente:
- AWS_REGION : la región de AWS donde se ejecuta el clúster
La salida incluye el ID del sistema de archivos. Guarde este valor. Lo necesitará más adelante.
Crear objetivos de montaje
El controlador CSI para EFS accede a los sistemas de archivos a través de destinos de montaje de EFS. Un destino de montaje es una dirección IP privada que utiliza grupos de seguridad de AWS para controlar el acceso al EFS subyacente.
Si los grupos de nodos de su clúster se ejecutan en diferentes subredes, debe crear un destino de montaje independiente en cada subred del grupo de nodos.
En este ejemplo, el acceso a cada destino de montaje está protegido por un único grupo de seguridad que incluye tanto los destinos de montaje como las máquinas del grupo de nodos. Según la configuración de su VPC y los requisitos de seguridad, puede dividir esta configuración en dos o más grupos de seguridad; por ejemplo, uno para los destinos de montaje y otro para los nodos de trabajo del grupo de nodos.
Cree un grupo de seguridad dedicado para controlar el acceso al EFS
Obtenga el ID de la VPC de AWS donde se ejecuta el clúster.
gcloud container aws clusters describe CLUSTER_NAME \ --location=LOCATION \ --format="value(networking.vpcId)"
Reemplace lo siguiente:
- CLUSTER_NAME
- LOCATION
La salida incluye el ID de tu VPC. Guarda este valor. Lo necesitarás más adelante.
Cree un grupo de seguridad para controlar el acceso a su destino de montaje EFS.
aws ec2 create-security-group \ --group-name gke-efs-security-group \ --description "EFS security group" \ --vpc-id VPC_ID \ --output text
Reemplace VPC_ID con el ID de la VPC de AWS donde se ejecuta el clúster.
La salida incluye el ID del nuevo grupo de seguridad. Guarde este valor. Lo necesitará más adelante.
De forma predeterminada, AWS crea grupos de seguridad con una regla predeterminada que permite todo el tráfico saliente. Elimine la regla de salida predeterminada.
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"}]}]'
Reemplace SECURITY_GROUP_ID con el ID del grupo de seguridad de AWS.
Autorizar el tráfico entrante y saliente para EFS (puerto 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
Cree un destino de montaje EFS en cada subred del grupo de nodos.
Enumere las subredes asociadas con todos los grupos de nodos.
gcloud container aws node-pools list \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --format="value(subnetId)"
Reemplace lo siguiente:
- CLUSTER_NAME
- LOCATION
El resultado es una lista de ID de subred. Guarde este valor. Lo necesitará más adelante.
Para cada subred, cree un destino de montaje EFS asociado con el grupo de seguridad aplicado.
aws efs create-mount-target \ --file-system-id EFS_ID \ --subnet-id SUBNET_ID \ --security-groups SECURITY_GROUP_ID
Reemplace lo siguiente:
- EFS_ID : el ID de su recurso EFS.
- SUBNET_ID : el ID de la subred del grupo de nodos.
- SECURITY_GROUP_ID
Agregue el grupo de seguridad EFS a todos los grupos de nodos del clúster.
Obtenga la lista de todos sus grupos de nodos.
gcloud container aws node-pools list \ --cluster=CLUSTER_NAME \ --location=LOCATION
Reemplace lo siguiente:
- CLUSTER_NAME
- LOCATION
La salida incluye los nombres de los grupos de nodos de tu clúster. Guarda este valor. Lo necesitarás más adelante.
Actualice cada grupo de nodos para incluir el nuevo grupo de seguridad EFS.
gcloud container aws node-pools update NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --security-group-ids=SECURITY_GROUP_IDS
Reemplace lo siguiente:
- NODE_POOL_NAME : el nombre del grupo de nodos.
- CLUSTER_NAME : el nombre de su clúster.
- LOCATION
- SECURITY_GROUP_IDS la lista de ID de grupos de seguridad para nodos de trabajo.
Crear un PersistentVolume (estático) o StorageClass (dinámico)
Si usa aprovisionamiento estático, el siguiente paso es crear un PersistentVolume. Si usa aprovisionamiento dinámico, el controlador EFS lo hace automáticamente; en su lugar, usted define una StorageClass para que las cargas de trabajo la especifiquen en su PersistentVolumeClaim. Seleccione la pestaña que corresponda a su método de aprovisionamiento elegido.
Aprovisionamiento estático
Si está utilizando aprovisionamiento estático, el siguiente paso es crear un PersistentVolume que monte un recurso compartido EFS.
Seleccione la pestaña adecuada dependiendo de si se está conectando directamente al recurso compartido EFS o a través de un punto de acceso.
Conectar directamente
Copie el siguiente manifiesto YAML en un archivo llamado
efs-volume.yaml
. El manifiesto hace referencia a la clase de almacenamiento EFS que creó anteriormente.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
Reemplace lo siguiente:
- VOLUME_NAME con un nombre para el volumen persistente.
- CLAIM_NAME con el nombre que desea utilizar para PersistentVolumeClaim.
- EFS_ID con el ID de su recurso EFS. Por ejemplo,
fs-12345678a
.
Punto de acceso
Para crear un volumen basado en un punto de acceso, debe aprovisionarlo manualmente. Consulte "Trabajar con puntos de acceso EFS" para obtener más información.
Copie el siguiente manifiesto YAML en un archivo llamado
efs-volume.yaml
. El manifiesto hace referencia a la clase de almacenamiento EFS que creó anteriormente.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
Reemplace lo siguiente:
- VOLUME_NAME con un nombre para el volumen persistente.
- CLAIM_NAME con el nombre que desea utilizar para PersistentVolumeClaim.
- EFS_ID con el ID de su recurso EFS. Por ejemplo,
fs-12345678a
. - ACCESS_POINT_ID con el ID de su punto de acceso. Por ejemplo,
fsap-1234567890abcde
.
Aplique el YAML a su clúster.
kubectl apply -f efs-volume.yaml
La salida confirma la creación de PersistentVolume.
persistentvolume/VOLUME_NAME created
Aprovisionamiento dinámico
Esta sección describe cómo crear una clase de almacenamiento que haga referencia al recurso EFS creado anteriormente. Una vez hecho esto, los desarrolladores pueden acceder al recurso EFS siguiendo los pasos descritos en "Usar un recurso EFS" .
Cree una StorageClass que haga referencia al ID del recurso EFS.
Copie el siguiente fragmento de YAML en un nuevo archivo llamado
efs-storage-class.yaml
. Para obtener más información sobre cómo ajustar las características de la clase de almacenamiento descrita en este archivo, consulte la documentación sobre los parámetros de la clase de almacenamiento de 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"
Reemplazar:
- EFS_STORAGE_CLASS_NAME con el nombre que ha elegido para StorageClass.
- EFS_ID con su ID de recurso EFS, por ejemplo, fs-12345678a.
Aplique el YAML a su clúster.
kubectl apply -f efs-storage-class.yaml
Si tiene éxito, la salida de este comando contendrá una línea similar a la siguiente:
storageclass/ EFS_STORAGE_CLASS_NAME created
Limpiar
Para eliminar los recursos que creó en las secciones anteriores, ejecute los siguientes comandos:
Utilice
kubectl
para eliminar el recurso de reclamación de EFS de su clúster:kubectl delete -f efs-claim.yaml
Si utiliza aprovisionamiento estático, utilice
kubectl
para eliminar los recursos asociados de su clúster:kubectl delete -f efs-volume.yaml
Si utiliza aprovisionamiento dinámico, utilice
kubectl
para eliminar los recursos asociados de su clúster:kubectl delete -f efs-storage-class.yaml
Encuentra el ID del objetivo de tu montura:
aws efs describe-mount-targets \ --file-system-id EFS_ID \ --profile adminuser \ --region AWS_REGION
Reemplace lo siguiente:
- EFS_ID : el ID de su recurso EFS
- AWS_REGION : la región de AWS donde se ejecuta el clúster
La salida incluye el ID del objetivo de montaje. Guarde este valor. Lo necesitará más adelante.
Eliminar su objetivo de montaje EFS:
aws efs delete-mount-target \ --mount-target-id MOUNT_TARGET_ID \ --profile adminuser \ --region AWS_REGION
Reemplace lo siguiente:
- MOUNT_TARGET_ID : el ID de su objetivo de montaje EFS
- AWS_REGION : la región de AWS de su destino de montaje
Elimina cualquier grupo de seguridad que hayas creado.
Elimine el sistema de archivos con el comando de la CLI "delete-file-system". Puede obtener una lista de sus sistemas de archivos con el comando de la CLI "describe-file-systems". El ID del sistema de archivos se encuentra en la respuesta.
aws efs delete-file-system \ --file-system-id EFS_ID \ --profile adminuser \ --region AWS_REGION
Reemplace lo siguiente:
- EFS_ID
- AWS_REGION
¿Qué sigue?
- Aprenda a usar un
PersistentVolumeClaim
desde una carga de trabajo para acceder a un volumen EFS - Obtenga información sobre formas adicionales de usar volúmenes EFS en los ejemplos de
aws-efs-csi-driver
.