Aprovisione um volume persistente com o EFS

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:

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.

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

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

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

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

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

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

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

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

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

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

    kubectl delete -f efs-claim.yaml
    
  2. Se usar o aprovisionamento estático, use kubectl para remover os recursos associados do cluster:

    kubectl delete -f efs-volume.yaml
    
  3. Se usar o aprovisionamento 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 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.

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

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