Esta página descreve como configurar um PersistentVolume baseado no EFS para utilização no GKE no AWS através do controlador CSI do EFS. O Elastic File System (EFS) é o mecanismo da AWS subjacente que fornece sistemas de ficheiros de rede ao seu cluster. Um PersistentVolume baseado no EFS é um recurso de cluster que disponibiliza armazenamento às suas cargas de trabalho através de um ponto de acesso do EFS e garante que o armazenamento persiste mesmo quando não existem cargas de trabalho ligadas ao mesmo.
Esta página destina-se a operadores e especialistas em armazenamento que querem configurar e gerir o armazenamento. Para saber mais sobre as funções comuns e as tarefas de exemplo a que fazemos referência no Google Cloud conteúdo, consulte Funções e tarefas comuns de utilizadores do GKE.
O GKE na AWS suporta o aprovisionamento estático e dinâmico de PersistentVolumes. O aprovisionamento dinâmico usa uma configuração ligeiramente diferente, mas requer menos esforço administrativo posteriormente.
Antes de começar
Para realizar os passos nesta página, conclua primeiro o seguinte:
- Familiarize-se com a forma como o Kubernetes e o GKE na AWS processam o armazenamento de cargas de trabalho. Para saber mais sobre estes tópicos, consulte os artigos Usar armazenamento persistente nas cargas de trabalho do GKE no AWS e Criar recursos do Amazon EFS.
- Atualize para a versão 1.25 ou posterior do Kubernetes para usar o aprovisionamento dinâmico de PersistentVolumes através do EFS. Se estiver a usar a versão 1.24 do Kubernetes, contacte o apoio técnico para aceder a esta funcionalidade.
Vista geral do aprovisionamento estático
A criação de um Elastic File System (EFS) e a sua disponibilização para cargas de trabalho no seu cluster através do aprovisionamento estático tem quatro passos:
- Crie o seu recurso do EFS
- Configure a sua rede
- Crie um destino de montagem
- Crie um
PersistentVolume
O passo final é por carga de trabalho: pedir armazenamento persistente emitindo um comando
PersistentVolumeClaim
.
Vista geral do aprovisionamento dinâmico
A criação de um recurso EFS e a sua disponibilização através do aprovisionamento dinâmico também tem quatro passos:
- Crie o seu recurso do EFS
- Configure a sua rede
- Crie um destino de montagem
- Crie um
StorageClass
A criação do StorageClass
é uma operação única. Depois de definir uma classe de armazenamento com determinadas características, a carga de trabalho pode emitir um PersistentVolumeClaim ou um pedido de armazenamento persistente. Todos os PersistentVolumeClaims para armazenamento com essas características podem pedir o mesmo StorageClass
.
Passos comuns
Quer esteja a usar o aprovisionamento estático ou dinâmico no seu cluster, tem de começar pelos passos de configuração indicados aqui e, em seguida, continuar com os passos de aprovisionamento estático ou dinâmico, conforme adequado. Depois de criar o EFS e torná-lo acessível, a carga de trabalho tem de dar os passos finais para aceder ao mesmo. Os passos para o fazer estão descritos no artigo Use o armazenamento EFS.
Crie um recurso do AWS EFS
É necessário um recurso do EFS, quer esteja a usar o aprovisionamento estático ou dinâmico. Se o seu cluster usar ambos, pode criar recursos EFS separados para eles ou usar o mesmo para ambos. Consulte o artigo Criar sistemas de ficheiros do Amazon EFS para ler mais sobre a criação de um recurso do EFS.
Também pode reutilizar um EFS existente. Nesse caso, pode ignorar esta secção e avançar para Criar destinos de montagem.
Obtenha a região da AWS onde o 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 da 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 ficheiros. Guarde este valor. Vai precisar dele mais tarde.
Crie destinos de montagem
O controlador CSI para o EFS acede aos sistemas de ficheiros através de destinos de montagem do EFS. Um destino de montagem é um endereço IP privado que usa grupos de segurança da AWS para controlar o acesso ao EFS subjacente.
Se os conjuntos de nós no seu cluster estiverem a ser executados em sub-redes diferentes, tem de criar um destino de montagem separado em cada sub-rede do conjunto de nós.
Neste exemplo, o acesso a cada destino de montagem está protegido por um único grupo de segurança que inclui os destinos de montagem e as máquinas do conjunto de nós. Consoante a configuração da VPC e os requisitos de segurança, pode optar por dividir esta 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 conjunto 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
O resultado inclui o ID da sua VPC. Guarde este valor. Vai precisar dele mais tarde.
Crie um grupo de segurança para controlar o acesso ao seu destino de montagem 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 da VPC da AWS onde o cluster é executado.
O resultado inclui o ID do novo grupo de segurança. Guarde este valor. Vai precisar dele mais tarde.
Por predefinição, a AWS cria grupos de segurança com uma regra predefinida que permite todo o tráfego de saída. Remova a regra de saída predefinida.
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 recebido e enviado 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 montagem do EFS em cada sub-rede do node pool.
Liste as sub-redes associadas a todos os conjuntos 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. Guarde este valor. Vai precisar dele mais tarde.
Para cada sub-rede, crie um destino de montagem do 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 do EFS.
- SUBNET_ID: o ID da sub-rede do node pool.
- SECURITY_GROUP_ID
Adicione o grupo de segurança do EFS a todos os conjuntos de nós do cluster.
Obter a lista de todos os seus conjuntos 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 conjuntos de nós do cluster. Guarde este valor. Vai precisar dele mais tarde.
Atualize cada node pool para incluir o novo grupo de segurança do 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 node pool.
- CLUSTER_NAME: o nome do 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 uma StorageClass (dinâmica)
Se estiver a usar o aprovisionamento estático, o passo seguinte é criar um PersistentVolume. Se estiver a usar o aprovisionamento dinâmico, o controlador EFS faz isto por si. Em alternativa, define uma StorageClass para que as cargas de trabalho especifiquem no respetivo PersistentVolumeClaim. Escolha o separador correspondente ao método de aprovisionamento escolhido.
Aprovisionamento estático
Se estiver a usar o aprovisionamento estático, o passo seguinte é criar um PersistentVolume que monte uma partilha do EFS.
Escolha o separador adequado consoante esteja a estabelecer ligação diretamente à partilha do EFS ou através de um ponto de acesso.
Interaja diretamente
Copie o seguinte manifesto YAML para um ficheiro com o nome
efs-volume.yaml
. O manifesto faz referência à classe de armazenamento do EFS que 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 com o nome que quer usar para o PersistentVolumeClaim.
- EFS_ID com o ID de recurso do EFS. Por
exemplo,
fs-12345678a
.
Ponto de acesso
Para criar um volume baseado num ponto de acesso, tem de o aprovisionar manualmente. Consulte o artigo Trabalhar com pontos de acesso EFS para mais informações.
Copie o seguinte manifesto YAML para um ficheiro com o nome
efs-volume.yaml
. O manifesto faz referência à classe de armazenamento do EFS que 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 com o nome que quer usar para o PersistentVolumeClaim.
- EFS_ID com o ID de recurso do 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
O resultado confirma a criação do PersistentVolume.
persistentvolume/VOLUME_NAME created
Aprovisionamento dinâmico
Esta secção descreve como criar uma StorageClass que faça referência ao recurso do EFS que criou anteriormente. Assim que isto estiver concluído, os programadores podem aceder ao recurso do EFS seguindo os passos descritos em Usar um recurso do EFS.
Crie uma StorageClass que faça referência ao ID do recurso do EFS.
Copie o fragmento YAML seguinte para um novo ficheiro denominado
efs-storage-class.yaml
. Para saber como ajustar as caraterísticas da StorageClass descrita por este ficheiro, 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"
Substituição:
- EFS_STORAGE_CLASS_NAME com o nome que escolheu para a StorageClass.
- EFS_ID com o ID do recurso do EFS, por exemplo, fs-12345678a.
Aplique o YAML ao seu cluster.
kubectl apply -f efs-storage-class.yaml
Se for bem-sucedido, o resultado deste comando contém uma linha semelhante à seguinte:
storageclass/EFS_STORAGE_CLASS_NAME created
Limpar
Para remover os recursos que criou nas secções anteriores, execute os seguintes comandos:
Use
kubectl
para remover o recurso de reivindicação do EFS do seu cluster:kubectl delete -f efs-claim.yaml
Se usar o aprovisionamento estático, use
kubectl
para remover os recursos associados do cluster:kubectl delete -f efs-volume.yaml
Se usar o aprovisionamento 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 o seguinte:
- EFS_ID: o ID do seu recurso do EFS
- AWS_REGION: a região da AWS onde o cluster é executado
A saída inclui o ID do destino de montagem. Guarde este valor. Vai precisar dele mais tarde.
Elimine o destino de montagem do 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 destino de montagem do EFS
- AWS_REGION: a região da AWS do seu destino de montagem
Elimine todos os grupos de segurança que criou.
Elimine o sistema de ficheiros com o comando CLI delete-file-system. Pode obter uma lista dos seus sistemas de ficheiros através do comando describe-file-systems da CLI. O ID do sistema de ficheiros 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 se segue?
- Saiba como usar um
PersistentVolumeClaim
de uma carga de trabalho para aceder a um volume do EFS - Saiba mais sobre formas adicionais de usar volumes do EFS nos
aws-efs-csi-driver
exemplos.