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.
- As sub-redes privadas para sua instalação do GKE na AWS. Por padrão, o GKE na AWS cria sub-redes denominadas
- No seu diretório
anthos-aws
, useanthos-gke
para alternar o contexto para seu cluster de usuários. Substitua CLUSTER_NAME pelo nome do seu cluster de usuário.cd anthos-aws env HTTPS_PROXY=http://localhost:8118 \ anthos-gke aws clusters get-credentials CLUSTER_NAME
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.
No seu diretório
anthos-aws
, useanthos-gke
para alternar o contexto para seu cluster de usuários. Substitua CLUSTER_NAME pelo nome do seu cluster de usuário.cd anthos-aws env HTTPS_PROXY=http://localhost:8118 \ anthos-gke aws clusters get-credentials CLUSTER_NAME
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
.
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.
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
.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.
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 chamadoout.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
.
- CLAIM_NAME pelo nome do PersistentVolumeClaim especificado anteriormente. Por exemplo,
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.
Confirme se o Pod do StatefulSet está no status
Running
comkubectl 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
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.Para confirmar se o seu sistema de arquivos EFS está montado, verifique o conteúdo do arquivo
out.txt
com o comandotail
.tail /efs-data/out.txt
A saída contém horários recentes em UTC.
Desconecte-se do Pod com o comando
exit
.exit
Seu shell retorna para sua máquina local.
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
- Aprenda sobre maneiras adicionais de usar volumes EFS nos exemplos
aws-efs-csi-driver
.