Nesta página, descrevemos 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 AWS subjacente que fornece sistemas de arquivos de rede para o cluster. Um PersistentVolume baseado em EFS é um recurso de cluster que disponibiliza armazenamento para suas cargas de trabalho por 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 é destinada a operadores e especialistas em armazenamento que querem configurar e gerenciar o armazenamento. Para saber mais sobre papéis comuns e tarefas de exemplo referenciados no conteúdo do Google Cloud , consulte Tarefas e funções de usuário comuns do GKE.
O GKE na AWS é compatível com o provisionamento estático e dinâmico de PersistentVolumes. O provisionamento dinâmico usa uma configuração um pouco diferente, mas exige menos esforço administrativo depois.
Antes de começar
Para executar as etapas desta página, primeiro conclua o seguinte:
- Saiba como o Kubernetes e o GKE na AWS processam o armazenamento de cargas de trabalho. Para saber mais sobre esses tópicos, consulte Como usar o armazenamento permanente em cargas de trabalho do GKE na AWS e Como criar recursos do Amazon EFS.
- Faça upgrade para a versão 1.25 ou mais recente do Kubernetes para usar o provisionamento dinâmico de PersistentVolumes usando o EFS. Se você estiver usando a versão 1.24 do Kubernetes, entre em contato com o suporte para ter acesso a esse recurso.
Visão geral do provisionamento estático
Há quatro etapas para criar um sistema elástico (EFS) e disponibilizá-lo para cargas de trabalho no cluster:
- Criar o recurso EFS
- Configurar a rede
- Criar um destino de montagem
- Criar um
PersistentVolume
A etapa final é feita pela carga de trabalho: para solicitar armazenamento permanente, emita um
PersistentVolumeClaim
.
Visão geral do provisionamento dinâmico
Há quatro etapas para criar um recurso do EFS e disponibilizá-lo por provisionamento dinâmico:
- Criar o recurso EFS
- Configurar a rede
- Criar um destino de montagem
- Criar um
StorageClass
A criação do StorageClass
é uma operação única. Depois que uma classe de armazenamento com
determinadas características é definida, a carga de trabalho pode emitir um PersistentVolumeClaim,
ou solicitação de armazenamento permanente. Todos os PersistentVolumeClaims para armazenamento com essas características podem solicitar o mesmo StorageClass
.
Etapas comuns
Se você estiver usando provisionamento estático ou dinâmico no cluster, comece com as etapas de configuração listadas aqui e siga as etapas apropriadas, conforme apropriado. Depois de criar o EFS e torná-lo acessível, a carga de trabalho precisa realizar as etapas finais para acessá-lo. As etapas para fazer isso estão descritas em Usar o armazenamento do EFS.
Criar um recurso EFS da AWS
Um recurso do EFS é necessário, seja qual for o tipo de provisionamento usado. Se o cluster usar os dois, crie recursos separados do EFS para eles ou use o mesmo para ambos. Consulte Como criar sistemas de arquivos Amazon EFS para mais informações sobre como criar um recurso EFS.
Também é possível reutilizar um EFS atual. Nesse caso, pule esta seção e prossiga para Criar destinos de montagem.
Busque a região da AWS em que o cluster é executado.
gcloud container aws clusters describe CLUSTER_NAME \ --location=LOCATION \ --format="value(awsRegion)"
Substitua:
- CLUSTER_NAME: o nome do cluster da AWS.
- LOCATION: o Google Cloud local do cluster da AWS
Crie um sistema de recursos EFS na mesma região da AWS com o comando a seguir.
aws efs create-file-system \ --region AWS_REGION \ --performance-mode generalPurpose \ --query 'FileSystemId' \ --output text
Substitua:
- AWS_REGION: a região da AWS em que o cluster é executado.
A saída inclui o ID do sistema de arquivos. Salve esse valor. Você precisará dele mais tarde.
Criar destinos de montagem
O driver CSI para EFS acessa sistemas de arquivos por destinos de ativação EFS. Um destino de ativação é um endereço IP particular que usa grupos de segurança da AWS para controlar o acesso ao EFS subjacente.
Se os pools de nós no cluster estiverem sendo executados em sub-redes diferentes, crie um destino de ativação separado em cada sub-rede do pool de nós.
Neste exemplo, o acesso a cada destino de ativação é protegido por um único grupo de segurança que inclui os destinos de ativação e as máquinas de pool de nós. Dependendo da configuração da VPC e dos requisitos de segurança, é melhor 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 de pool de nós.
Criar um grupo de segurança dedicado para controlar o acesso ao EFS
Consiga o ID da VPC da AWS em que o cluster é executado.
gcloud container aws clusters describe CLUSTER_NAME \ --location=LOCATION \ --format="value(networking.vpcId)"
Substitua:
- CLUSTER_NAME
- LOCATION
A saída inclui o ID da VPC. Salve esse valor. Você precisará dele mais tarde.
Crie um grupo de segurança para controlar o acesso ao destino de ativação do 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 de VPC da AWS em que o cluster é executado.
A saída inclui o ID do novo grupo de segurança. Salve esse 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.
Autorize o tráfego de entrada e saída para o 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 ativação EFS em cada sub-rede do pool de nós.
Liste as 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:
- CLUSTER_NAME
- LOCATION
A saída é uma lista de IDs de sub-rede. Salve esse valor. Você precisará dele mais tarde.
Para cada sub-rede, crie um destino de ativação EFS associado ao 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:
- EFS_ID: o ID do seu recurso do 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.
Consiga a lista de todos os pools de nós.
gcloud container aws node-pools list \ --cluster=CLUSTER_NAME \ --location=LOCATION
Substitua:
- CLUSTER_NAME
- LOCATION
A saída inclui os nomes dos pools de nós do cluster. Salve esse 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:
- NODE_POOL_NAME: o nome do pool de nós.
- CLUSTER_NAME: o nome do cluster.
- LOCATION
- SECURITY_GROUP_IDS: a lista de IDs de grupo de segurança para nós de trabalho.
Criar um PersistentVolume (estático) ou StorageClass (dinâmico)
Se você estiver usando o provisionamento estático, a próxima etapa será criar um PersistentVolume. Se você estiver usando o provisionamento dinâmico, o driver do EFS fará isso por você. Em vez disso, defina uma StorageClass para que as cargas de trabalho especifiquem na PersistentVolumeClaim. Escolha a guia que corresponde ao método de provisionamento selecionado.
Provisionamento estático
Se você estiver usando o provisionamento estático, a próxima etapa será criar um PersistentVolume que ative um compartilhamento de EFS.
Escolha a guia apropriada se você estiver se conectando diretamente ao compartilhamento EFS ou por um ponto de acesso.
Conecte-se diretamente
Copie o seguinte manifesto do YAML para 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:
- VOLUME_NAME por um nome para o volume permanente.
- CLAIM_NAME pelo nome que você quer usar para o PersistentVolumeClaim.
- EFS_ID com o ID do recurso do EFS. Por exemplo,
fs-12345678a
.
Ponto de acesso
Para criar um volume baseado em ponto de acesso, é necessário provisioná-lo manualmente. Saiba mais em Como trabalhar com pontos de acesso EFS.
Copie o seguinte manifesto do YAML para 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:
- VOLUME_NAME por um nome para o volume permanente.
- CLAIM_NAME pelo nome que você quer usar para o PersistentVolumeClaim.
- EFS_ID com o ID do recurso do EFS. Por exemplo,
fs-12345678a
. - ACCESS_POINT_ID pelo código do ponto de acesso. Por exemplo,
fsap-1234567890abcde
.
Aplique o YAML ao 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. Depois disso, os desenvolvedores podem acessar o recurso do EFS seguindo as etapas descritas em Usar um recurso do EFS.
Crie uma StorageClass que faça referência ao ID do recurso do EFS.
Copie o seguinte fragmento YAML para um novo arquivo chamado
efs-storage-class.yaml
. Para saber como ajustar as características da StorageClass descrita neste arquivo, consulte a documentação sobre 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"
Substitua:
- EFS_STORAGE_CLASS_NAME com o nome escolhido para a StorageClass.
- EFS_ID pelo ID do recurso da EFS, por exemplo, fs-12345678a.
Aplique o YAML ao cluster.
kubectl apply -f efs-storage-class.yaml
Se for bem-sucedida, a saída desse comando conterá uma linha semelhante a esta:
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 do EFS do cluster:kubectl delete -f efs-claim.yaml
Se estiver usando provisionamento estático, use
kubectl
para remover os recursos associados do cluster:kubectl delete -f efs-volume.yaml
Se estiver usando provisionamento dinâmico, use
kubectl
para remover os recursos associados do cluster:kubectl delete -f efs-storage-class.yaml
Encontre o ID do destino de montagem:
aws efs describe-mount-targets \ --file-system-id EFS_ID \ --profile adminuser \ --region AWS_REGION
Substitua:
- EFS_ID: o ID do recurso do EFS.
- AWS_REGION: a região da AWS em que o cluster é executado.
A saída inclui o ID do destino de ativação. Salve esse valor. Você precisará dele mais tarde.
Exclua o destino de montagem do EFS:
aws efs delete-mount-target \ --mount-target-id MOUNT_TARGET_ID \ --profile adminuser \ --region AWS_REGION
Substitua:
- MOUNT_TARGET_ID: o ID do destino de ativação do EFS.
- AWS_REGION: a região da AWS do destino de ativação
Exclua todos os grupos de segurança que você criou.
Exclua o sistema de arquivos usando o comando delete-file-system da CLI. É possível conseguir uma lista dos seus sistemas de arquivos usando o comando describe-file-systems da CLI. 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:
- EFS_ID
- AWS_REGION
A seguir
- Saiba como usar um
PersistentVolumeClaim
de uma carga de trabalho para acessar um volume do EFS - Saiba mais sobre como usar os volumes EFS nos exemplos de
aws-efs-csi-driver
.