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

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 Fargateepic01 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
| Tarefa | Descrição | Habilidades necessárias |
|---|---|---|
Crie um cluster do Amazon EKS. | notaSe 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 | 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.
Caso não as tenha ainda, você pode obter todas as informações solicitadas acima com os seguintes comandos da CLI.
| Administrador de sistemas AWS |
| Tarefa | Descrição | Habilidades 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 Com um nome de namespace de aplicação personalizado:
Sem um nome de namespace de aplicação personalizado:
onde | Usuário do Kubernetes com permissões concedidas |
| Tarefa | Descrição | Habilidades 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:
onde Com a criptografia em repouso, com uma chave KMS:
onde Sem criptografia:
onde | 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:
| 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 |
| Tarefa | Descrição | Habilidades 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
Esse script usa o utilitário | 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 |
| Tarefa | Descrição | Habilidades 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 Com criptografia em trânsito:
onde Sem criptografia em trânsito:
onde | 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 | 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 | Usuário do Kubernetes com permissões concedidas |
| Tarefa | Descrição | Habilidades necessárias |
|---|---|---|
Verifique o status de | Para conferir o status do
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 | Para conferir o status do
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
Os resultados são semelhantes ao seguinte:
| 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
Os resultados são semelhantes ao seguinte:
| 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
Os resultados são semelhantes ao seguinte:
| 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
Os resultados são semelhantes ao seguinte:
| 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
onde Os resultados são semelhantes ao seguinte:
| Usuário do Kubernetes com permissões concedidas, administrador do sistema |
| Tarefa | Descrição | Habilidades 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 |
| Tarefa | Descrição | Habilidades 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 Com a criptografia em repouso, com uma chave KMS:
onde Sem criptografia em repouso:
onde | Usuário do Kubernetes com permissões concedidas, administrador do sistema |
Recursos relacionados
Referências
AWS Fargate for Amazon EKS now supports Amazon EFS
(anúncio) How to capture application logs when using Amazon EKS on AWS Fargate (Como capturar registros de aplicativos ao usar o Amazon EKS no AWS Fargate)
(publicação do blog) Usando o Container Insights (documentação do Amazon CloudWatch)
Configuração do Container Insights no Amazon EKS e no Kubernetes (documentação do Amazon CloudWatch)
Métricas do Amazon EKS e do Kubernetes (documentação do Amazon CloudWatch)
Monitoramento do Amazon EFS com o Amazon CloudWatch (documentação do Amazon EFS)
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