Usar sistemas de ficheiros EFS

As versões 1.6 e posteriores do GKE no AWS suportam o Elastic File System (EFS) da AWS através do controlador CSI do EFS. Este tópico explica como montar um sistema de ficheiros EFS existente como um PersistentVolume nos seus clusters de utilizadores.

Antes de começar

Para executar os passos neste tópico, precisa do seguinte:

  • Um sistema de ficheiros EFS existente na mesma VPC da AWS que a sua instalação do GKE na AWS.
  • Pelo menos, um destino de montagem do EFS na mesma VPC da AWS que a sua instalação do GKE na AWS.
  • Todos os destinos de montagem do EFS têm de pertencer ao seguinte:
    • As sub-redes privadas para a sua instalação do GKE no AWS. Por predefinição, o GKE na AWS cria sub-redes com o nome gke-CLUSTER_ID-private-AWS_ZONE, em que CLUSTER_ID é o ID do cluster de utilizadores e AWS_ZONE é a zona de disponibilidade da AWS.
    • O grupo de segurança do node pool. Por predefinição, o GKE na AWS cria node pools com o nome gke-CLUSTER_ID-nodepool, em que CLUSTER_ID é o ID do cluster de utilizadores.
  • No diretório do anthos-aws, use anthos-gke para mudar o contexto para o cluster de utilizadores.
    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 utilizadores.

Usar um PersistentVolume do EFS

Para usar um sistema de ficheiros EFS como PersistentVolume com os seus clusters de utilizadores, primeiro cria um PersistentVolume e, em seguida, cria um PersistentVolumeClaim ao qual faz referência na sua carga de trabalho.

Criar um PersistentVolume

Para criar um PersistentVolume com o controlador CSI do EFS, siga os passos seguintes.

  1. No diretório do anthos-aws, use anthos-gke para mudar o contexto para o cluster de utilizadores.

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

  2. A configuração do PersistentVolume que usa depende de se está a estabelecer ligação diretamente ao Elastic File System ou através de um ponto de acesso. Selecione esta opção se estiver a estabelecer ligação ao Elastic File System diretamente 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_FILE_SYSTEM_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_FILE_SYSTEM_ID com o ID do sistema de ficheiros EFS. Por exemplo, fs-12345678a.

    Ponto de acesso

    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_FILE_SYSTEM_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_FILE_SYSTEM_ID com o ID do sistema de ficheiros EFS. Por exemplo, fs-12345678a.
    • ACCESS_POINT_ID com o ID do seu ponto de acesso. Por exemplo, fsap-1234567890abcde.
  3. Aplique o YAML ao cluster de utilizadores.

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

    O resultado confirma a criação do PersistentVolume.

    persistentvolume/VOLUME_NAME created
    

Criar um PersistentVolumeClaim

Para usar o sistema de ficheiros EFS com as suas cargas de trabalho, crie um PersistentVolumeClaim.

  1. Para criar o PersistentVolumeClaim, copie o manifesto YAML seguinte para um ficheiro denominado 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 seu PersistentVolumeClaim. Por exemplo, efs-claim1.

  2. Aplique o YAML ao cluster de utilizadores.

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

    O resultado confirma a criação do PersistentVolumeClaim.

    persistentvolumeclaim/CLAIM_NAME created
    

Crie um StatefulSet

Depois de criar um PersistentVolumeClaim, pode usá-lo num volume de trabalho. Os passos nesta secção criam um StatefulSet de exemplo com o seu sistema de ficheiros EFS montado. Também pode usar um PersistentVolumeClaim com outros tipos de carga de trabalho, como pods e implementações, referenciando a reivindicação em spec.volumes.

Para criar um StatefulSet que monte o sistema de ficheiros EFS referenciado no seu PersistentVolumeClaim, siga estes passos.

  1. Copie o seguinte manifesto YAML para um ficheiro com o nome efs-statefulset.yaml. Este manifesto de exemplo inicia um contentor do Ubuntu Linux que monta o seu sistema de ficheiros EFS em /efs-data. O contentor escreve a cada cinco segundos num ficheiro no seu sistema de ficheiros EFS denominado 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 o seguinte:

    • CLAIM_NAME com o nome do PersistentVolumeClaim que especificou anteriormente. Por exemplo, efs-claim1.
  2. Aplique o YAML ao cluster de utilizadores.

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

    O resultado confirma a criação do StatefulSet.

    statefulset.apps/efs-shell created
    

    O StatefulSet pode demorar vários minutos a transferir a imagem do contentor e a iniciar.

  3. Confirme se o pod do StatefulSet está no estado Running com kubectl get pods.

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

    A saída inclui o nome do pod e o respetivo estado. Na resposta seguinte, o nome do pod é efs-shell-0.

    NAME          READY   STATUS    RESTARTS   AGE
    efs-shell-0   1/1     Running   0          1m
    
  4. Depois de o pod estar no estado Running, use kubectl exec para se ligar ao pod que aloja o StatefulSet.

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

    O comando kubectl inicia uma shell no pod.

  5. Para confirmar que o sistema de ficheiros EFS está montado, verifique o conteúdo do ficheiro out.txt com o comando tail.

    tail /efs-data/out.txt
    

    O resultado contém horas recentes em UTC.

  6. Desligue-se do Pod com o comando exit.

    exit
    

    A shell regressa à sua máquina local.

  7. Para remover o StatefulSet, use kubectl delete.

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

Limpar

Para remover os recursos que criou nas secçõ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

O que se segue?