Usando sistemas de arquivos EFS

O GKE na AWS versões 1.6 e posteriores oferece suporte ao Sistema de Arquivos Elástico (EFS) da AWS por meio do Driver CSI do EFS . Este tópico explica como montar um sistema de arquivos EFS existente como um PersistentVolume nos seus clusters de usuários.

Antes de começar

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

  • Um sistema de arquivos EFS existente na mesma VPC da AWS que sua instalação do GKE na AWS.
  • Pelo menos um destino de montagem EFS na mesma VPC da AWS que sua instalação do GKE na AWS.
  • Todos os seus destinos de montagem EFS devem pertencer ao seguinte:
    • As sub-redes privadas para sua instalação do GKE na AWS. Por padrão, o GKE na AWS cria sub-redes denominadas gke- CLUSTER_ID -private- AWS_ZONE , onde CLUSTER_ID é o ID do cluster do usuário 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 denominados gke- CLUSTER_ID -nodepool , onde CLUSTER_ID é o ID do cluster do usuário.
  • No seu diretório anthos-aws , use anthos-gke para alternar o contexto para seu 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 seu cluster de usuário.

Usando um EFS PersistentVolume

Para usar um sistema de arquivos EFS como um PersistentVolume com seus clusters de usuários, primeiro crie um PersistentVolume e depois crie um PersistentVolumeClaim que você referencia em sua carga de trabalho.

Criando um PersistentVolume

Para criar um PersistentVolume com o driver EFS CSI, execute as seguintes etapas.

  1. No seu diretório anthos-aws , use anthos-gke para alternar o contexto para seu 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 seu cluster de usuário.

  2. A configuração do PersistentVolume que você usa depende se você está se conectando diretamente ao Elastic File System ou por meio de um ponto de acesso. Selecione se você está se conectando ao Elastic File System diretamente ou por meio de um ponto de acesso.

    Conecte-se diretamente

    Copie o seguinte manifesto YAML em 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 o seguinte:

    • VOLUME_NAME com um nome para o volume persistente.
    • CLAIM_NAME pelo nome que você deseja usar para o PersistentVolumeClaim.
    • EFS_FILE_SYSTEM_ID com o ID do seu sistema de arquivos EFS. Por exemplo, fs-12345678a .

    Ponto de acesso

    Copie o seguinte manifesto YAML em 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 o seguinte:

    • VOLUME_NAME com um nome para o volume persistente.
    • CLAIM_NAME pelo nome que você deseja usar para o PersistentVolumeClaim.
    • EFS_FILE_SYSTEM_ID com o ID do seu sistema de arquivos 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 seu cluster de usuários.

    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
    

Criando 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 seu PersistentVolumeClaim. Por exemplo, efs-claim1 .

  2. Aplique o YAML ao seu cluster de usuários.

    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
    

Criar um StatefulSet

Após criar um PersistentVolumeClaim, você poderá usá-lo em uma carga de trabalho. As etapas desta seção criam um StatefulSet de exemplo com seu sistema de arquivos EFS montado. Você também pode usar um PersistentVolumeClaim com outros tipos de carga de trabalho, como Pods e Implantações, referenciando a reivindicação em spec.volumes .

Para criar um StatefulSet que monte o sistema de arquivos EFS referenciado em seu PersistentVolumeClaim, execute as seguintes etapas.

  1. Copie o seguinte manifesto YAML em um arquivo chamado efs-statefulset.yaml . Este manifesto de exemplo inicia um contêiner Ubuntu Linux que monta seu sistema de arquivos EFS em /efs-data . O contêiner grava a cada cinco segundos em um arquivo no seu 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 o seguinte:

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

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

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

    statefulset.apps/efs-shell created
    

    O StatefulSet pode levar vários minutos para baixar a imagem do contêiner e iniciar.

  3. Confirme se o Pod do StatefulSet está no status 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 seu status. 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 seu sistema de arquivos EFS está montado, verifique o conteúdo do arquivo out.txt com o comando tail .

    tail /efs-data/out.txt
    

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

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

    exit
    

    Seu shell retorna para sua 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

O que vem a seguir