Executar workloads monitoradas com armazenamento de dados persistente usando o Amazon EFS no Amazon EKS com o AWS Fargate - Recomendações da AWS

Executar workloads monitoradas com armazenamento de dados persistente usando o Amazon EFS no Amazon EKS com o AWS Fargate

Ricardo Morais, Rodrigo Bersa e Lucio Pereira, Amazon Web Services

Resumo

Este padrão fornece orientação para habilitar o Amazon Elastic File System (Amazon EFS) como um dispositivo de armazenamento para contêineres que estão sendo executados no Amazon Elastic Kubernetes Service (Amazon EKS) usando o AWS Fargate para provisionar seus recursos computacionais.

A configuração descrita nesse padrão segue as práticas recomendadas de segurança e fornece segurança em repouso e segurança em trânsito por padrão. Para criptografar seu sistema de arquivos Amazon EFS, ele usa uma chave do AWS Key Management Service (AWS KMS), mas você também pode especificar um alias de chave que despacha o processo de criação de uma chave KMS.

Você pode seguir as etapas deste padrão para criar um namespace e um perfil Fargate para um aplicativo de prova de conceito (PoC), instalar o driver Amazon EFS Container Storage Interface (CSI) usado para integrar o cluster Kubernetes ao Amazon EFS, configurar a classe de armazenamento e implantar o aplicativo PoC. Essas etapas resultam em um sistema de arquivos Amazon EFS que é compartilhado entre várias workloads do Kubernetes, executado no Fargate. O padrão é acompanhado por scripts que automatizam essas etapas.

Você pode usar este padrão se quiser garantir a persistência dos dados em suas aplicações em contêineres e evitar a perda de dados em operações de redução ou aumento da escala horizontalmente. Por exemplo:

  • Ferramentas de DevOps: um cenário comum é desenvolver uma estratégia de integração contínua e entrega contínua (CI/CD). Nesse caso, você pode usar o Amazon EFS como um sistema de arquivos compartilhado para armazenar configurações entre diferentes instâncias da ferramenta de CI/CD ou armazenar um cache (por exemplo, um repositório Apache Maven) para estágios de pipeline entre diferentes instâncias da ferramenta de CI/CD.

  • Servidores web: um cenário comum é usar o Apache como um servidor web HTTP. Você pode usar o Amazon EFS como um sistema de arquivos compartilhado para armazenar arquivos estáticos que são compartilhados entre diferentes instâncias do servidor web. Neste cenário de exemplo, as modificações são aplicadas diretamente ao sistema de arquivos em vez de arquivos estáticos serem incorporados a uma imagem do Docker.

Pré-requisitos e limitações

Pré-requisitos

  • Uma conta AWS ativa

  • Um cluster do Amazon EKS com Kubernetes versão 1.17 ou posterior (testado até a versão 1.27)

  • Um sistema de arquivos Amazon EFS existente para vincular um StorageClass do Kubernetes e provisionar sistemas de arquivos dinamicamente

  • Permissões de administração do cluster

  • Contexto configurado para apontar para o cluster Amazon EKS desejado

Limitações

  • Há algumas limitações a serem consideradas ao usar o Amazon EKS com o Fargate. Por exemplo, não é suporte para o uso de alguns constructos do Kubernetes, como DaemonSets e contêineres privilegiados. Para obter mais informações sobre as limitações do Fargate, consulte Considerações sobre o AWS Fargate na documentação do Amazon EKS.

  • O código fornecido com esse padrão é compatível com estações de trabalho que executam Linux ou macOS.

Versões do produto

  • AWS Command Line Interface (AWS CLI) versão 2 ou superior

  • Driver da CSI do Amazon EFS versão 1.0 ou posterior (testado até a versão 2.4.8)

  • eksctl versão 0.24.0 ou posterior (testado até a versão 0.158.0)

  • jq versão 1.6 ou posterior

  • Kubectl versão 1.17 ou posterior (testado até a versão 1.27)

  • Kubernetes versão 1.17 ou posterior (testado até a versão 1.27)

Arquitetura

Diagrama de arquitetura da execução de workloads monitoradas com armazenamento de dados persistente usando o Amazon EFS

A arquitetura de destino é composta pela seguinte infraestrutura:

  • Uma nuvem privada virtual (VPC).

  • Duas zonas de disponibilidade

  • Uma sub-rede pública com um gateway NAT que fornece acesso à Internet

  • Uma sub-rede privada com um cluster do Amazon EKS e destinos de montagem do Amazon EFS (também conhecidos como pontos de montagem)

  • Amazon EFS no nível da VPC

Veja abaixo a infraestrutura de ambiente para o cluster do Amazon EKS:

  • Perfis do AWS Fargate que acomodam os constructos do Kubernetes no nível do namespace

  • Um namespace Kubernetes com:

    • Dois pods de aplicações distribuídos em zonas de disponibilidade

    • Uma declaração de volume persistente (PVC) vinculada a um volume persistente (PV) no nível do cluster

  • Um PV em todo o cluster que está vinculado ao PVC no namespace e que aponta para os destinos de montagem do Amazon EFS na sub-rede privada, fora do cluster

Ferramentas

Serviços da AWS

  • A AWS Command Line Interface (AWS CLI) é uma ferramenta de código aberto que você pode usar para interagir com os serviços da AWS por meio da linha de comando.

  • Amazon Elastic File System (Amazon EFS) ajuda você a criar e configurar sistemas de arquivos compartilhados na Nuvem AWS. Nesse padrão, ele fornece um sistema de arquivos simples, escalável, totalmente gerenciado e compartilhado para uso com o Amazon EKS.

  • O Amazon Elastic Kubernetes Service (Amazon EKS) ajuda você a executar o Kubernetes na AWS sem precisar instalar ou operar seus próprios clusters.

  • O AWS Fargate é um mecanismo de computação de tecnologia sem servidor para o Amazon EKS. Ele cria e gerencia recursos computacionais para seus aplicativos Kubernetes.

  • O AWS Key Management Service (AWS KMS) ajuda você a criar e controlar chaves criptográficas para proteger seus dados.

Outras ferramentas

  • O Docker é um conjunto de produtos de plataforma como serviço (PaaS) que usam a virtualização no nível do sistema operacional para fornecer software em contêineres.

  • O eksctl é utilitário de linha de comando para criar e gerenciar clusters do Kubernetes no Amazon EKS.

  • kubectl é uma interface de linha de comando que ajuda você na execução de comandos em clusters do Kubernetes.

  • O jq é uma ferramenta de linha de comando para analisar JSON.

Código da

O código para este padrão é fornecido no repositório Persistence Configuration with Amazon EFS on Amazon EKS using AWS Fargate do GitHub. Os scripts são organizados por épico, nas pastas epic01 a epic06, correspondendo à ordem na seção Épicos neste padrão.

Práticas recomendadas

A arquitetura de destino inclui os seguintes serviços e componentes e segue as práticas recomendadas do AWS Well-Architected Framework:

  • Amazon EFS, que fornece um sistema de arquivos NFS elástico simples, escalável e totalmente gerenciado. Isso é usado como um sistema de arquivos compartilhado entre todas as replicações do aplicativo PoC que estão sendo executadas em pods, que são distribuídos nas sub-redes privadas do cluster Amazon EKS escolhido.

  • Um destino de montagem do Amazon EFS para cada sub-rede privada. Isso fornece redundância por zona de disponibilidade na nuvem privada virtual (VPC) do cluster.

  • Amazon EKS, que executa as workloads do Kubernetes. Você deve provisionar um cluster do Amazon EKS antes de usar esse padrão, conforme descrito na seção Pré-requisitos.

  • AWS KMS, que fornece criptografia em repouso para o conteúdo armazenado no sistema de arquivos Amazon EFS.

  • Fargate, que gerencia os recursos computacionais dos contêineres para que você possa se concentrar nos requisitos de negócios em vez da carga de infraestrutura. O perfil Fargate é criado para todas as sub-redes privadas. Ele fornece redundância por zona de disponibilidade na nuvem privada virtual (VPC) do cluster.

  • Pods do Kubernetes, para validar se o conteúdo pode ser compartilhado, consumido e gravado por diferentes instâncias de uma aplicação.

Épicos

TarefaDescriçãoHabilidades necessárias

Crie um cluster do Amazon EKS.

nota

Se você já tem um cluster implantado, passe para o próximo épico. Crie um cluster do Amazon EKS em sua conta da AWS. No diretório do GitHub, use um dos padrões para implantar um cluster do Amazon EKS usando o Terraform ou o eksctl. Para obter mais informações, consulte Criação de um cluster para o Amazon EKS na documentação do Amazon EKS. No padrão Terraform, também há exemplos que mostram como: vincular perfis do Fargate ao seu cluster do Amazon EKS, criar um sistema de arquivos do Amazon EFS e implantar o driver CSI do Amazon EFS no seu cluster do Amazon EKS.

Administrador da AWS, administrador do Terraform ou eksctl, administrador do Kubernetes

Exportar as variáveis de ambiente.

Executar o script env.sh. Isso fornece as informações necessárias para as próximas etapas.

source ./scripts/env.sh Inform the AWS Account ID: <13-digit-account-id> Inform your AWS Region: <aws-Region-code> Inform your Amazon EKS Cluster Name: <amazon-eks-cluster-name> Inform the Amazon EFS Creation Token: <self-genereated-uuid>

Caso não as tenha ainda, você pode obter todas as informações solicitadas acima com os seguintes comandos da CLI.

# ACCOUNT ID aws sts get-caller-identity --query "Account" --output text
# REGION CODE aws configure get region
# CLUSTER EKS NAME aws eks list-clusters --query "clusters" --output text
# GENERATE EFS TOKEN uuidgen
Administrador de sistemas AWS
TarefaDescriçãoHabilidades necessárias

Crie um namespace do Kubernetes e um perfil do Fargate para workloads da aplicação.

Crie um namespace para receber as workloads do aplicativo que interagem com o Amazon EFS. Execute o script create-k8s-ns-and-linked-fargate-profile.sh. Você pode optar por usar um nome de namespace personalizado ou o namespace padrão fornecido poc-efs-eks-fargate.

Com um nome de namespace de aplicação personalizado:

export $APP_NAMESPACE=<CUSTOM_NAME> ./scripts/epic01/create-k8s-ns-and-linked-fargate-profile.sh \ -c "$CLUSTER_NAME" -n "$APP_NAMESPACE"

Sem um nome de namespace de aplicação personalizado:

./scripts/epic01/create-k8s-ns-and-linked-fargate-profile.sh \ -c "$CLUSTER_NAME"

onde $CLUSTER_NAME é o nome do cluster do Amazon EKS. O parâmetro -n <NAMESPACE> é opcional; se não for informado, um nome de namespace padrão gerado será fornecido.

Usuário do Kubernetes com permissões concedidas
TarefaDescriçãoHabilidades necessárias

Gere um token exclusivo.

O Amazon EFS requer um token de criação para garantir uma operação idempotente (chamar a operação com o mesmo token de criação não tem efeito). Para atender a esse requisito, você deve gerar um token exclusivo por meio de uma técnica disponível. Por exemplo, você pode gerar um identificador universal exclusivo (UUID) para usar como um token de criação.

Administrador de sistemas AWS

Criar um sistema de arquivos do Amazon EFS.

Crie o sistema de arquivos para receber os arquivos de dados que são lidos e gravados pelas workloads do aplicativo. Você pode criar um sistema de arquivos criptografado ou não criptografado. (Como prática recomendada, o código deste padrão cria um sistema criptografado para habilitar a criptografia em repouso por padrão.) Você pode usar uma chave do AWS KMS exclusiva e simétrica do AWS KMS para criptografar o sistema de arquivos. Se não for especificada, uma chave gerenciada pela AWS será usada.

Use o script create-efs.sh para criar um sistema de arquivos Amazon EFS criptografado ou não criptografado, depois de gerar um token exclusivo para o Amazon EFS.

Com a criptografia em repouso, sem uma chave KMS:

./scripts/epic02/create-efs.sh \ -c "$CLUSTER_NAME" \ -t "$EFS_CREATION_TOKEN"

onde $CLUSTER_NAME é o nome do seu cluster Amazon EKS e $EFS_CREATION_TOKEN é um token de criação exclusivo para o sistema de arquivos.

Com a criptografia em repouso, com uma chave KMS:

./scripts/epic02/create-efs.sh \ -c "$CLUSTER_NAME" \ -t "$EFS_CREATION_TOKEN" \ -k "$KMS_KEY_ALIAS"

onde $CLUSTER_NAME é o nome do seu cluster Amazon EKS e $EFS_CREATION_TOKEN é um token de criação exclusivo para o sistema de arquivos, e $KMS_KEY_ALIAS é o alias para a chave do KMS.

Sem criptografia:

./scripts/epic02/create-efs.sh -d \ -c "$CLUSTER_NAME" \ -t "$EFS_CREATION_TOKEN"

onde $CLUSTER_NAME é o nome do seu cluster Amazon EKS, $EFS_CREATION_TOKEN é um token de criação exclusivo para o sistema de arquivos e –d desabilita a criptografia em repouso.

Administrador de sistemas AWS

Crie um grupo de segurança.

Crie um grupo de segurança para permitir que o cluster do Amazon EKS acesse o sistema de arquivos do Amazon EFS.

Administrador de sistemas AWS

Atualize a regra de entrada para o grupo de segurança.

Atualize as regras de entrada do grupo de segurança para permitir o tráfego de entrada nas seguintes configurações:

  • Protocolo TCP: porta 2049

  • Origem: intervalos de blocos CIDR para as sub-redes privadas na VPC que contém o cluster do Kubernetes

Administrador de sistemas AWS

Adicione um destino de montagem para cada sub-rede privada.

Para cada sub-rede privada do cluster Kubernetes, crie um destino de montagem para o sistema de arquivos e o grupo de segurança.

Administrador de sistemas AWS
TarefaDescriçãoHabilidades necessárias

Implemente o driver da CSI do Amazon EFS.

Implemente o driver da CSI do Amazon EFS no cluster. O driver provisiona o armazenamento de acordo com as declarações de volume persistentes criadas pelas aplicações. Execute o script create-k8s-efs-csi-sc.sh para implantar o driver da CSI do Amazon EFS e a classe de armazenamento no cluster.

./scripts/epic03/create-k8s-efs-csi-sc.sh

Esse script usa o utilitário kubectl, portanto, certifique-se de que o contexto tenha sido configurado para apontar para o cluster do Amazon EKS desejado.

Usuário do Kubernetes com permissões concedidas

Implante a classe de armazenamento.

Implante a classe de armazenamento no cluster do provisionador Amazon EFS (efs.csi.aws.com).

Usuário do Kubernetes com permissões concedidas
TarefaDescriçãoHabilidades necessárias

Implante o volume persistente.

Implante o volume persistente e vincule-o à classe de armazenamento criada e ao ID do sistema de arquivos Amazon EFS. O aplicativo usa o volume persistente para ler e gravar conteúdo. Você pode especificar qualquer tamanho para o volume persistente no campo de armazenamento. O Kubernetes requer esse campo, mas como o Amazon EFS é um sistema de arquivos elástico, ele não impõe nenhuma capacidade de sistema de arquivos. Você pode implantar o volume persistente com ou sem criptografia. (O driver CSI do Amazon EFS habilita a criptografia por padrão, como uma prática recomendada.) Execute o script deploy-poc-app.sh para implantar o volume persistente, a declaração de volume persistente e as duas workloads.

Com criptografia em trânsito:

./scripts/epic04/deploy-poc-app.sh \ -t "$EFS_CREATION_TOKEN"

onde $EFS_CREATION_TOKEN é o token de criação exclusivo para o sistema de arquivos.

Sem criptografia em trânsito:

./scripts/epic04/deploy-poc-app.sh -d \ -t "$EFS_CREATION_TOKEN"

onde $EFS_CREATION_TOKEN é o token de criação exclusivo para o sistema de arquivos e –d desativa a criptografia em trânsito.

Usuário do Kubernetes com permissões concedidas

Implante a declaração de volume persistente solicitada pelo aplicativo.

Implante a declaração de volume persistente solicitada pelo aplicativo e vincule-a à classe de armazenamento. Use o mesmo modo de acesso do volume persistente que você criou anteriormente. Você pode especificar qualquer tamanho para a reivindicação de volume persistente no campo de armazenamento. O Kubernetes requer esse campo, mas como o Amazon EFS é um sistema de arquivos elástico, ele não impõe nenhuma capacidade de sistema de arquivos.

Usuário do Kubernetes com permissões concedidas

Implante a workload 1.

Implante o pod que representa a workload 1 do aplicativo. Essa workload grava conteúdo no arquivo /data/out1.txt.

Usuário do Kubernetes com permissões concedidas

Implante a workload 2.

Implante o pod que representa a workload 2 do aplicativo. Essa workload grava conteúdo no arquivo /data/out2.txt.

Usuário do Kubernetes com permissões concedidas
TarefaDescriçãoHabilidades necessárias

Verifique o status de PersistentVolume.

Para conferir o status do PersistentVolume, insira o comando a seguir.

kubectl get pv

Para obter um exemplo de saída, consulte a seção Informações adicionais.

Usuário do Kubernetes com permissões concedidas

Verifique o status de PersistentVolumeClaim.

Para conferir o status do PersistentVolumeClaim, insira o comando a seguir.

kubectl -n poc-efs-eks-fargate get pvc

Para obter um exemplo de saída, consulte a seção Informações adicionais.

Usuário do Kubernetes com permissões concedidas

Validar se a workload 1 pode gravar no sistema de arquivos.

Insira o seguinte comando para validar se a workload 1 está gravando em /data/out1.txt.

kubectl exec -ti poc-app1 -n poc-efs-eks-fargate -- tail -f /data/out1.txt

Os resultados são semelhantes ao seguinte:

... Thu Sep 3 15:25:07 UTC 2023 - PoC APP 1 Thu Sep 3 15:25:12 UTC 2023 - PoC APP 1 Thu Sep 3 15:25:17 UTC 2023 - PoC APP 1 ...
Usuário do Kubernetes com permissões concedidas

Validar se a workload 2 pode gravar no sistema de arquivos.

Insira o seguinte comando para validar se a workload 2 está gravando em /data/out2.txt.

kubectl -n $APP_NAMESPACE exec -ti poc-app2 -- tail -f /data/out2.txt

Os resultados são semelhantes ao seguinte:

... Thu Sep 3 15:26:48 UTC 2023 - PoC APP 2 Thu Sep 3 15:26:53 UTC 2023 - PoC APP 2 Thu Sep 3 15:26:58 UTC 2023 - PoC APP 2 ...
Usuário do Kubernetes com permissões concedidas

Validar se a workload 1 pode ler o arquivo gravado pela workload 2.

Insira o comando a seguir para validar que a workload 1 pode ler o arquivo /data/out2.txt gravado pela workload 2:

kubectl exec -ti poc-app1 -n poc-efs-eks-fargate -- tail -n 3 /data/out2.txt

Os resultados são semelhantes ao seguinte:

... Thu Sep 3 15:26:48 UTC 2023 - PoC APP 2 Thu Sep 3 15:26:53 UTC 2023 - PoC APP 2 Thu Sep 3 15:26:58 UTC 2023 - PoC APP 2 ...
Usuário do Kubernetes com permissões concedidas

Validar se a workload 2 pode ler o arquivo gravado pela workload 1.

Insira o comando a seguir para validar que a workload 2 pode ler o arquivo /data/out1.txt gravado pela workload 1:

kubectl -n $APP_NAMESPACE exec -ti poc-app2 -- tail -n 3 /data/out1.txt

Os resultados são semelhantes ao seguinte:

... Thu Sep 3 15:29:22 UTC 2023 - PoC APP 1 Thu Sep 3 15:29:27 UTC 2023 - PoC APP 1 Thu Sep 3 15:29:32 UTC 2023 - PoC APP 1 ...
Usuário do Kubernetes com permissões concedidas

Valide se os arquivos são retidos após a remoção dos componentes do aplicativo.

Em seguida, use um script para remover os componentes da aplicação (volume persistente, declaração de volume persistente e pods) e verifique se os arquivos /data/out1.txt e /data/out2.txt estão retidos no sistema de arquivos. Execute o script validate-efs-content.sh usando o comando a seguir.

./scripts/epic05/validate-efs-content.sh \ -t "$EFS_CREATION_TOKEN"

onde $EFS_CREATION_TOKEN é o token de criação exclusivo para o sistema de arquivos.

Os resultados são semelhantes ao seguinte:

pod/poc-app-validation created Waiting for pod get Running state... Waiting for pod get Running state... Waiting for pod get Running state... Results from execution of 'find /data' on validation process pod: /data /data/out2.txt /data/out1.txt
Usuário do Kubernetes com permissões concedidas, administrador do sistema
TarefaDescriçãoHabilidades necessárias

Monitore os registros do aplicativo.

Como parte de uma operação do segundo dia, envie os registros do aplicativo para o Amazon CloudWatch para monitoramento.

Administrador de sistemas da AWS, usuário do Kubernetes com permissões concedidas

Monitore os contêineres do Amazon EKS e do Kubernetes com o Container Insights.

Como parte de uma operação do segundo dia, monitore os sistemas Amazon EKS e Kubernetes usando o Amazon CloudWatch Container Insights. Essa ferramenta coleta, agrega e resume métricas de aplicações em contêineres em diferentes níveis e dimensões. Para obter mais informações, consulte a seção Recursos relacionados.

Administrador de sistemas da AWS, usuário do Kubernetes com permissões concedidas

Monitorar o Amazon EFS com o CloudWatch

Como parte da operação do segundo dia, monitore os sistemas de arquivos usando o Amazon CloudWatch, que coleta e processa os dados brutos do Amazon EFS em métricas legíveis, quase em tempo real. Para obter mais informações, consulte a seção Recursos relacionados.

Administrador de sistemas AWS
TarefaDescriçãoHabilidades necessárias

Limpe todos os recursos criados para o padrão.

Depois de concluir esse padrão, limpe todos os recursos para evitar incorrer em cobranças da AWS. Execute o script clean-up-resources.sh para remover todos os recursos depois de terminar de usar a aplicação PoC. Escolha uma das seguintes opções:

Com a criptografia em repouso, com uma chave KMS:

./scripts/epic06/clean-up-resources.sh \ -c "$CLUSTER_NAME" \ -t "$EFS_CREATION_TOKEN" \ -k "$KMS_KEY_ALIAS"

onde $CLUSTER_NAME é o nome do seu cluster Amazon EKS, $EFS_CREATION_TOKEN é o token de criação exclusivo para o sistema de arquivos e $KMS_KEY_ALIAS é o alias da chave KMS.

Sem criptografia em repouso:

./scripts/epic06/clean-up-resources.sh \ -c "$CLUSTER_NAME" \ -t "$EFS_CREATION_TOKEN"

onde $CLUSTER_NAME é o nome do seu cluster Amazon EKS e $EFS_CREATION_TOKEN é um token de criação para o sistema de arquivos.

Usuário do Kubernetes com permissões concedidas, administrador do sistema

Recursos relacionados

Referências

Tutoriais e exemplos do GitHub

Ferramentas necessárias

Mais informações

Veja abaixo um exemplo de saída do comando kubectl get pv.

NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE poc-app-pv 1Mi RWX Retain Bound poc-efs-eks-fargate/poc-app-pvc efs-sc 3m56s

Veja abaixo um exemplo de saída do comando kubectl -n poc-efs-eks-fargate get pvc.

NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE poc-app-pvc Bound poc-app-pv 1Mi RWX efs-sc 4m34s