Esta página descreve como configurar um PersistentVolume baseado em EFS para uso no GKE na AWS usando o driver CSI do EFS . O Elastic File System (EFS) é o mecanismo subjacente da AWS que fornece sistemas de arquivos de rede ao seu cluster. Um PersistentVolume baseado em EFS é um recurso de cluster que disponibiliza armazenamento para suas cargas de trabalho por meio de um ponto de acesso do EFS e garante que o armazenamento persista mesmo quando nenhuma carga de trabalho estiver conectada a ele.
Esta página é para operadores e especialistas em armazenamento que desejam configurar e gerenciar o armazenamento. Para saber mais sobre funções comuns e tarefas de exemplo que mencionamos em Google Cloud conteúdo, consulte Funções e tarefas comuns do usuário do GKE Enterprise .
O GKE na AWS oferece suporte ao provisionamento estático e dinâmico de PersistentVolumes. O provisionamento dinâmico usa uma configuração ligeiramente diferente, mas exige menos esforço administrativo posteriormente.
Antes de começar
Para executar as etapas desta página, primeiro conclua o seguinte:
- Familiarize-se com a forma como o Kubernetes e o GKE na AWS gerenciam o armazenamento de cargas de trabalho. Para saber mais sobre esses tópicos, consulte Como usar armazenamento persistente em suas cargas de trabalho do GKE na AWS e Como criar recursos do Amazon EFS .
- Atualize para o Kubernetes versão 1.25 ou posterior para usar o provisionamento dinâmico de PersistentVolumes usando o EFS. Se você estiver usando o Kubernetes versão 1.24, entre em contato com o suporte para acessar este recurso.
Visão geral do provisionamento estático
Criar um Sistema de Arquivos Elástico (EFS) e disponibilizá-lo para cargas de trabalho no seu cluster por meio de provisionamento estático tem quatro etapas:
- Crie seu recurso EFS
- Configure sua rede
- Criar um alvo de montagem
- Criar um
PersistentVolume
A etapa final é pela carga de trabalho: solicitar armazenamento persistente emitindo um PersistentVolumeClaim
.
Visão geral do provisionamento dinâmico
Criar um recurso EFS e disponibilizá-lo por meio de provisionamento dinâmico também tem quatro etapas:
- Crie seu recurso EFS
- Configure sua rede
- Criar um alvo de montagem
- Criar uma
StorageClass
A criação da StorageClass
é uma operação única. Após a definição de uma classe de armazenamento com determinadas características, a carga de trabalho pode emitir uma PersistentVolumeClaim ou solicitar armazenamento persistente. Todas as PersistentVolumeClaims para armazenamento com essas características podem solicitar a mesma StorageClass
.
Etapas comuns
Independentemente de usar provisionamento estático ou dinâmico no seu cluster, você deve começar com as etapas de configuração listadas aqui e, em seguida, prosseguir com as etapas de provisionamento estático ou dinâmico, conforme apropriado. Depois de criar seu EFS e torná-lo acessível, a carga de trabalho deve executar as etapas finais para acessá-lo. As etapas para isso estão descritas em Usar o armazenamento EFS .
Criar um recurso do AWS EFS
Um recurso EFS é necessário tanto para provisionamento estático quanto dinâmico. Se o seu cluster usa ambos, você pode criar recursos EFS separados para eles ou usar o mesmo para ambos. Consulte "Criando sistemas de arquivos Amazon EFS" para saber mais sobre como criar um recurso EFS.
Você também pode reutilizar um EFS existente; nesse caso, você pode pular esta seção e prosseguir para Criar destinos de montagem .
Obtenha a região da AWS onde seu cluster é executado.
gcloud container aws clusters describe CLUSTER_NAME \ --location=LOCATION \ --format="value(awsRegion)"
Substitua o seguinte:
- CLUSTER_NAME : o nome do cluster da AWS.
- LOCATION : a Google Cloud localização do cluster AWS
Crie um sistema de recursos EFS na mesma região da AWS com o seguinte comando.
aws efs create-file-system \ --region AWS_REGION \ --performance-mode generalPurpose \ --query 'FileSystemId' \ --output text
Substitua o seguinte:
- AWS_REGION : a região da AWS onde o cluster é executado
A saída inclui o ID do sistema de arquivos. Salve este valor. Você precisará dele mais tarde.
Criar alvos de montagem
O driver CSI para EFS acessa sistemas de arquivos por meio de alvos de montagem EFS. Um alvo de montagem é um endereço IP privado que usa grupos de segurança da AWS para controlar o acesso ao EFS subjacente.
Se os pools de nós no seu cluster estiverem sendo executados em sub-redes diferentes, você deverá criar um destino de montagem separado em cada sub-rede do pool de nós.
Neste exemplo, o acesso a cada destino de montagem é protegido por um único grupo de segurança que inclui os destinos de montagem e as máquinas do pool de nós. Dependendo da configuração da sua VPC e dos requisitos de segurança, você pode optar por dividir essa configuração em dois ou mais grupos de segurança — por exemplo, um para destinos de montagem e outro para nós de trabalho do pool de nós.
Crie um grupo de segurança dedicado para controlar o acesso ao EFS
Obtenha o ID da VPC da AWS onde o cluster é executado.
gcloud container aws clusters describe CLUSTER_NAME \ --location=LOCATION \ --format="value(networking.vpcId)"
Substitua o seguinte:
- CLUSTER_NAME
- LOCATION
A saída inclui o ID da sua VPC. Salve este valor. Você precisará dele mais tarde.
Crie um grupo de segurança para controlar o acesso ao seu destino de montagem EFS.
aws ec2 create-security-group \ --group-name gke-efs-security-group \ --description "EFS security group" \ --vpc-id VPC_ID \ --output text
Substitua VPC_ID pelo ID da VPC da AWS onde o cluster é executado.
A saída inclui o ID do novo grupo de segurança. Salve este valor. Você precisará dele mais tarde.
Por padrão, a AWS cria grupos de segurança com uma regra padrão que permite todo o tráfego de saída. Remova a regra de saída padrão.
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"}]}]'
Substitua SECURITY_GROUP_ID pelo ID do grupo de segurança da AWS.
Autorizar tráfego de entrada e saída para 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
Crie um destino de montagem EFS em cada sub-rede do pool de nós.
Listar sub-redes associadas a todos os pools de nós.
gcloud container aws node-pools list \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --format="value(subnetId)"
Substitua o seguinte:
- CLUSTER_NAME
- LOCATION
A saída é uma lista de IDs de sub-rede. Salve este valor. Você precisará dele mais tarde.
Para cada sub-rede, crie um destino de montagem EFS associado com o grupo de segurança aplicado.
aws efs create-mount-target \ --file-system-id EFS_ID \ --subnet-id SUBNET_ID \ --security-groups SECURITY_GROUP_ID
Substitua o seguinte:
- EFS_ID : o ID do seu recurso EFS.
- SUBNET_ID : o ID da sub-rede do pool de nós.
- SECURITY_GROUP_ID
Adicione o grupo de segurança EFS a todos os pools de nós do cluster.
Obtenha a lista de todos os seus pools de nós.
gcloud container aws node-pools list \ --cluster=CLUSTER_NAME \ --location=LOCATION
Substitua o seguinte:
- CLUSTER_NAME
- LOCATION
A saída inclui os nomes dos pools de nós do seu cluster. Salve este valor. Você precisará dele mais tarde.
Atualize cada pool de nós para incluir o novo grupo de segurança EFS.
gcloud container aws node-pools update NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --security-group-ids=SECURITY_GROUP_IDS
Substitua o seguinte:
- NODE_POOL_NAME : o nome do pool de nós.
- CLUSTER_NAME : o nome do seu cluster.
- LOCATION
- SECURITY_GROUP_IDS a lista de IDs de grupos de segurança para nós de trabalho.
Crie um PersistentVolume (estático) ou StorageClass (dinâmico)
Se estiver usando provisionamento estático, o próximo passo é criar um PersistentVolume. Se estiver usando provisionamento dinâmico, o driver EFS faz isso por você; em vez disso, você define uma StorageClass para as cargas de trabalho a serem especificadas em seu PersistentVolumeClaim. Selecione a guia correspondente ao método de provisionamento escolhido.
Provisionamento estático
Se você estiver usando o provisionamento estático, a próxima etapa é criar um PersistentVolume que monte um compartilhamento EFS.
Escolha a guia apropriada dependendo se você está se conectando diretamente ao compartilhamento EFS ou por meio de um ponto de acesso.
Conecte-se diretamente
Copie o seguinte manifesto YAML em um arquivo chamado
efs-volume.yaml
. O manifesto faz referência à classe de armazenamento EFS que você criou 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
Substitua o seguinte:
- VOLUME_NAME com um nome para o volume persistente.
- CLAIM_NAME pelo nome que você deseja usar para o PersistentVolumeClaim.
- EFS_ID com o seu ID de recurso EFS. Por exemplo,
fs-12345678a
.
Ponto de acesso
Para criar um volume baseado em ponto de acesso, você precisa provisioná-lo manualmente. Consulte Trabalhando com pontos de acesso EFS para obter mais informações.
Copie o seguinte manifesto YAML em um arquivo chamado
efs-volume.yaml
. O manifesto faz referência à classe de armazenamento EFS que você criou 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
Substitua o seguinte:
- VOLUME_NAME com um nome para o volume persistente.
- CLAIM_NAME pelo nome que você deseja usar para o PersistentVolumeClaim.
- EFS_ID com o seu ID de recurso EFS. Por exemplo,
fs-12345678a
. - ACCESS_POINT_ID com o ID do seu ponto de acesso. Por exemplo,
fsap-1234567890abcde
.
Aplique o YAML ao seu cluster.
kubectl apply -f efs-volume.yaml
A saída confirma a criação do PersistentVolume.
persistentvolume/VOLUME_NAME created
Provisionamento dinâmico
Esta seção descreve como criar uma StorageClass que faz referência ao recurso EFS criado anteriormente. Uma vez feito isso, os desenvolvedores podem acessar o recurso EFS seguindo as etapas descritas em Usar um recurso EFS .
Crie uma StorageClass que faça referência ao ID do recurso EFS.
Copie o seguinte fragmento YAML para um novo arquivo chamado
efs-storage-class.yaml
. Para saber mais sobre como ajustar as características da StorageClass descritas neste arquivo, consulte a documentação sobre os parâmetros da StorageClass do 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"
Substituir:
- EFS_STORAGE_CLASS_NAME pelo nome que você escolheu para a StorageClass.
- EFS_ID com seu ID de recurso EFS - por exemplo, fs-12345678a.
Aplique o YAML ao seu cluster.
kubectl apply -f efs-storage-class.yaml
Se bem-sucedido, a saída deste comando conterá uma linha semelhante à seguinte:
storageclass/ EFS_STORAGE_CLASS_NAME created
Limpar
Para remover os recursos criados nas seções anteriores, execute os seguintes comandos:
Use
kubectl
para remover o recurso de reivindicação EFS do seu cluster:kubectl delete -f efs-claim.yaml
Se estiver usando o provisionamento estático, use
kubectl
para remover os recursos associados do seu cluster:kubectl delete -f efs-volume.yaml
Se estiver usando o provisionamento dinâmico, use
kubectl
para remover os recursos associados do seu cluster:kubectl delete -f efs-storage-class.yaml
Encontre o ID do seu alvo de montagem:
aws efs describe-mount-targets \ --file-system-id EFS_ID \ --profile adminuser \ --region AWS_REGION
Substitua o seguinte:
- EFS_ID : o ID do seu recurso EFS
- AWS_REGION : a região da AWS onde o cluster é executado
A saída inclui o ID do alvo de montagem. Salve este valor. Você precisará dele mais tarde.
Exclua seu destino de montagem EFS:
aws efs delete-mount-target \ --mount-target-id MOUNT_TARGET_ID \ --profile adminuser \ --region AWS_REGION
Substitua o seguinte:
- MOUNT_TARGET_ID : o ID do seu destino de montagem EFS
- AWS_REGION : a região AWS do seu destino de montagem
Exclua todos os grupos de segurança que você criou.
Exclua o sistema de arquivos usando o comando CLI delete-file-system. Você pode obter uma lista dos seus sistemas de arquivos usando o comando CLI describe-file-systems. O ID do sistema de arquivos está na resposta.
aws efs delete-file-system \ --file-system-id EFS_ID \ --profile adminuser \ --region AWS_REGION
Substitua o seguinte:
- EFS_ID
- AWS_REGION
O que vem a seguir
- Aprenda a usar um
PersistentVolumeClaim
de uma carga de trabalho para acessar um volume EFS - Aprenda sobre maneiras adicionais de usar volumes EFS nos exemplos
aws-efs-csi-driver
.