Como usar sistemas de arquivos EFS

As versões 1.6 e posteriores do GKE na AWS são compatíveis com o Elastic File System (EFS) da AWS por meio do driver CSI do EFS. Neste tópico, explicamos como montar um sistema de arquivos EFS atual como um PersistentVolume nos clusters do usuário.

Antes de começar

Para executar as etapas deste tópico, você precisa do seguinte:

  • Um sistema de arquivos EFS atual na mesma VPC da AWS que a instalação do GKE na AWS.
  • Pelo menos um destino de montagem do EFS na mesma VPC da AWS que a instalação do GKE na AWS.
  • Todos os destinos de ativação do EFS precisam pertencer ao seguinte:
    • As sub-redes particulares da instalação do GKE na AWS. Por padrão, o GKE na AWS cria sub-redes chamadas gke-CLUSTER_ID-private-AWS_ZONE, em que CLUSTER_ID é o ID do cluster de usuários e AWS_ZONE é a zona de disponibilidade da AWS.
    • O grupo de segurança do pool de nós. Por padrão, o GKE na AWS cria pools de nós chamados gke-CLUSTER_ID-nodepool, em que CLUSTER_ID é o ID do cluster de usuários.
  • No diretório anthos-aws, use anthos-gke para alternar o contexto para o cluster de usuários.
    cd anthos-aws
    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    Substitua CLUSTER_NAME pelo nome do cluster de usuários.

Como usar um PersistentVolumeS EFS

Para usar um sistema de arquivos EFS como um PersistentVolume com os clusters de usuário, primeiro é preciso criar um PersistentVolume e depois criar um PersistentVolumeClaim que será referenciado na carga de trabalho.

Como criar um PersistentVolume

Para criar um PersistentVolume com o driver de EFS CS, siga as etapas abaixo.

  1. No diretório anthos-aws, use anthos-gke para alternar o contexto para o cluster de usuários.

    cd anthos-aws
    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    Substitua CLUSTER_NAME pelo nome do cluster de usuários.

  2. A configuração do PersistentVolume que você usa depende de uma conexão direta com o Elastic File System ou de um ponto de acesso. Selecione se você estiver se conectando ao Elastic File System diretamente ou por meio de 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_FILE_SYSTEM_ID
    

    Substitua:

    • VOLUME_NAME por um nome para o volume permanente.
    • CLAIM_NAME pelo nome que você quer usar para o PersistentVolumeClaim.
    • EFS_FILE_SYSTEM_ID pelo código do sistema de arquivos EFS. Por exemplo, fs-12345678a.

    Ponto de acesso

    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_FILE_SYSTEM_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_FILE_SYSTEM_ID pelo código do sistema de arquivos EFS. Por exemplo, fs-12345678a.
    • ACCESS_POINT_ID pelo código do ponto de acesso. Por exemplo, fsap-1234567890abcde.
  3. Aplique o YAML ao usuário do cluster.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f efs-volume.yaml
    

    A saída confirma a criação do PersistentVolume.

    persistentvolume/VOLUME_NAME created
    

Como criar um PersistentVolumeClaim

Para usar seu sistema de arquivos EFS com suas cargas de trabalho, crie um PersistentVolumeClaim.

  1. Para criar o PersistentVolumeClaim, copie o seguinte manifesto YAML em um arquivo chamado efs-claim.yaml.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: CLAIM_NAME
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: ""
      resources:
        requests:
          storage: 5Gi
    

    Substitua CLAIM_NAME por um nome para o PersistentVolumeClaim. Por exemplo, efs-claim1.

  2. Aplique o YAML ao usuário do cluster.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f efs-claim.yaml
    

    A saída confirma a criação do PersistentVolumeClaim.

    persistentvolumeclaim/CLAIM_NAME created
    

Crie um StatefulSet

Depois de criar um PersistentVolumeClaim, você pode usá-lo em uma carga de trabalho. As etapas nesta seção criam um exemplo de StatefulSet com o sistema de arquivos EFS ativado. Também é possível usar um PersistentVolumeClaim com outros tipos de carga de trabalho, como pods e implantações, fazendo referência à declaração em spec.volumes.

Para criar um StatefulSet que ative o sistema de arquivos EFS referenciado no PersistentVolumeClaim, execute as etapas a seguir.

  1. Copie o seguinte manifesto do YAML para um arquivo chamado efs-statefulset.yaml: Este manifesto de exemplo inicia um contêiner do Ubuntu Linux que ativa o sistema de arquivos EFS em /efs-data. O contêiner grava a cada cinco segundos em um arquivo no sistema de arquivos EFS chamado out.txt.

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: efs-shell
    spec:
      selector:
        matchLabels:
          app: test-efs
      serviceName: efs-app
      replicas: 1
      template:
        metadata:
          labels:
            app: test-efs
        spec:
          terminationGracePeriodSeconds: 10
          containers:
          - name: linux
            image: ubuntu:bionic
            command: ["/bin/sh"]
            args: ["-c", "while true; do echo $(date -u) >> /efs-data/out.txt; sleep 5; done"]
            volumeMounts:
            - name: efs-volume
              mountPath: /efs-data
          volumes:
          - name: efs-volume
            persistentVolumeClaim:
              claimName: CLAIM_NAME
    

    Substitua:

    • CLAIM_NAME pelo nome do PersistentVolumeClaim especificado anteriormente. Por exemplo, efs-claim1.
  2. Aplique o YAML ao usuário do cluster.

    env HTTPS_PROXY=http://localhost:8118 \
     kubectl apply -f efs-statefulset.yaml
    

    A resposta confirma a criação do StatefulSet.

    statefulset.apps/efs-shell created
    

    O StatefulSet pode levar vários minutos para fazer o download da imagem do contêiner e ser iniciada.

  3. Confirme se o pod de StatefulSet está no status Running com kubectl get pods.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl get pods -l app=test-efs
    

    A resposta inclui o nome do pod e o status dele. Na resposta a seguir, o nome do pod é efs-shell-0.

    NAME          READY   STATUS    RESTARTS   AGE
    efs-shell-0   1/1     Running   0          1m
    
  4. Depois que o pod estiver no status "Em execução", use kubectl exec para se conectar ao pod que hospeda o StatefulSet.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl exec -it efs-shell-0 -- bash
    

    O comando kubectl inicia um shell no pod.

  5. Para confirmar se o sistema de arquivos EFS está ativado, verifique o conteúdo do arquivo out.txt com o comando tail.

    tail /efs-data/out.txt
    

    A saída contém os horários recentes em UTC.

  6. Desconecte-se do pod com o comando exit.

    exit
    

    O shell retorna à máquina local.

  7. Para remover o StatefulSet, use kubectl delete.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl delete -f efs-statefulset.yaml
    

Limpeza

Para remover os recursos criados nas seções anteriores, execute os seguintes comandos:

env HTTPS_PROXY=http://localhost:8118 \
  kubectl delete -f efs-statefulset.yaml
env HTTPS_PROXY=http://localhost:8118 \
  kubectl delete -f efs-claim.yaml
env HTTPS_PROXY=http://localhost:8118 \
  kubectl delete -f efs-volume.yaml

A seguir