Provisionar um volume permanente com o EFS

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:

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.

  1. 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
  2. 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.

  1. 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.

  2. 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.

  3. 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.

  4. 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
    
  5. 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.

  6. 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
  7. 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.

  8. 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.

  1. 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.
  2. 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.

  1. 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.
  2. 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:

  1. Use kubectl para remover o recurso de reivindicação do EFS do cluster:

    kubectl delete -f efs-claim.yaml
    
  2. Se estiver usando provisionamento estático, use kubectl para remover os recursos associados do cluster:

    kubectl delete -f efs-volume.yaml
    
  3. Se estiver usando provisionamento dinâmico, use kubectl para remover os recursos associados do cluster:

    kubectl delete -f efs-storage-class.yaml
    
  4. 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.

  5. 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
  6. Exclua todos os grupos de segurança que você criou.

  7. 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