Impulsojunte-se à Impulso
Como criar e gerenciar ambientes EKS com terraform na AWS

10/11/21

7 min de leitura

Como criar e gerenciar ambientes EKS com terraform na AWS

Como criar e gerenciar ambientes EKS com terraform na AWS

Orlando Burli JúniorOrlando Burli Júnior

Devs sabem da dificuldade que é criar e gerenciar ambientes na AWS. É preciso muita paciência e um conhecimento extenso de ferramentas. Por conta disso, resolvi mostrar para vocês como fazer isso de forma eficiente e prática. Mas, antes do passo a passo, é preciso entender algumas definições.

Vamos começar por Kubernetes (também chamado como K8s), que é um sistema de orquestração de containers open source. Ele automatiza a implantação, o dimensionamento e a gestão de aplicações em containers. Foi originalmente projetado pelo Google e agora é mantido pela Cloud Native Computing Foundation, funcionando com uma variedade de ferramentas de conteinerização, incluindo Docker.

Dentro disso, temos o EKS, que é um serviço de kubernetes gerenciado pela Amazon. Existe também uma outra opção, chamada AWS Fargate, que é uma versão serverless deste serviço. Mas hoje iremos nos ater aos worknodes normais.

Alguns outros conceitos

Antes de continuarmos, ainda é preciso te explicar alguns termos. O primeiro deles é Terraform. Trata-se de uma infraestrutura de código aberto como ferramenta de software de código criada pela HashiCorp. Ele permite que os usuários definam e provisionem uma infraestrutura de datacenter, usando uma linguagem de configuração de alto nível conhecida como Hashicorp Configuration Language, ou, opcionalmente, JSON.

Agora, dentro do cluster do EKS, há uma composição de basicamente 2 elementos macros: cluster e workgroups.

  • cluster é o serviço principal, responsável por gerenciar os worker nodes e worker groups;
  • work node é uma máquina, física ou virtual, onde são publicados os containers, gerenciados por podsPods, por sua vez, é um grupo de um ou mais containers, que contém uma configuração específica de como rodar, em quantas cópias, etc;
  • work group, como o nome diz, é um grupo de work nodes, podendo, no ambiente AWS, ser gerenciado ou não.

Aqui iremos criar um projeto de exemplo, chamado PersonalERP. É um projeto que eu já desenvolvi há alguns anos e estou migrando para K8’s. Nele, iremos criar 2 ambientes: um de stage/testes e outro de produção. Este é o modo mais simples de demonstrar como criar múltiplos ambientes, aproveitando código do terraform e sua estrutura de modularização.

Estrutura de pastas

Esta é a estrutura básica de pastas do cluster que iremos criar.

Estrutura básica de pastas do cluster terraform

Abaixo segue a descrição de todas as pastas/módulos:

  • terraform: todos os scripts de terraform ficarão nesta pasta, separados por ambiente;
  • terraform\prd: aqui ficam os scripts de inicialização do ambiente de produção. É onde acontece a importação dos módulos que são compartilhados entre os ambientes;
  • terraform\stg: onde ficam os scripts de inicialização do ambiente de stage. É onde você importa os módulos que são compartilhados entre os ambientes, bem como define parâmetros para a criação do cluster;
  • terraform\modules: aqui é onde ficam os módulos do projeto;
  • terraform\modules\network: criação da infraestrutura básica de rede (VPC, subnets, route tables);
  • terraform\modules\cluster: onde acontece a criação do cluster e suas roles;
  • terraform\modules\worknodes: onde se criam os worknodes.

Módulo network

Para a criação do cluster, são necessárias 2 coisas: uma VPC (Virtual Private Cloud) e ao menos dois Subnet’s em pelo menos duas regiões diferentes. Também vale dizer que este módulo contém três arquivos: variables.tfmain.tf e output.tf.

Variables

Variáveis necessárias ao módulo. Reparem que, neste primeiro módulo, já estaremos definindo o nome do cluster, pois ele será necessário para criar a VPC.

Output

Aqui definimos as “saídas” do módulo. Estas variáveis serão usadas nos demais módulos. Perceba que estamos dando saída nos id’s da VPC, das subnet’s e no nome do cluster, que serão importantes nos demais módulos.

Main

Este é o arquivo principal, onde criamos a vpc personalerp_private_vpc, suas subredes e um internet gateway. Repare também nas tag’s, que são muito importantes para nosso cluster EKS, motivo pelo qual já definimos neste módulo o nome do cluster.

Outro ponto importante a destacar aqui é a criação de uma router table. Esta é importante para permitir o tráfego de informações entre as sub-redes. Este ponto não é citado nas documentações oficiais, então fique atento a este detalhe.

Enquanto isso, nas sub-redes utilizamos um counter do terraform para criar três redes. E já que usamos um datasource para pegar as regiões disponíveis, ele irá distribuir as três sub-redes entre as regiões que encontrar. No Brasil, temos três sub-regiões (sa-east-1asa-east-1b e sa-east-1c), então cada uma ficará em uma sub-rede.

Esse ponto de subredes é muito importante, porque se não houver pelo menos duas subredes em duas subregiões diferentes, o cluster não será criado.

Módulo Cluster

Este é o módulo principal do cluster em si. Como requisito, além das subnets previamente criadas, ele requer a criação de uma role para o cluster, com as permissões: AmazonEKSClusterPolicy e AmazonEKSServicePolicy. Então vamos ver com detalhes os arquivos deste módulo:

Variables

Aqui, novamente, as variáveis do módulo. Reparem que, neste caso, estamos recebendo três variáveis que sairão como output do módulo de network anterior: vpc_ideks_subnet_ids e cluster_name.

IAM

Neste arquivo definimos a role necessária e as permissões, conforme explicamos acima.

Main

Aqui temos a parte principal do cluster. Nela, definimos o nome, a versão, a role que criamos anteriormente, vinculando tudo às sub-redes criadas anteriormente, e colocamos explicitamente a dependência das roles. Esta dependência se faz necessária para que o terraform não crie o cluster antes das permissões necessárias.

Módulo WorkNodes

Agora é hora de definir os worknodes e workgroups do nosso cluster.

Variables

Aqui, novamente, definimos as variáveis dos nossos worknodes. As variáveis eks_subnet_ids e cluster_name virão do módulo de network, definido anteriormente.

  • worknodes: número de workgroups que iremos criar. Aqui será feito um loop para criar quantos workgroups desejarmos;
  • worknode_desired_size: tamanho desejável do grupo;
  • worknode_max_size: tamanho máximo do grupo;
  • worknode_min_size: tamanho mínimo do grupo.

IAM

Aqui definimos a role necessária para os worknodes. São essenciais as permissões: AmazonEKSWorkerNodePolicyAmazonEKS_CNI_Policy e AmazonEC2ContainerRegistryReadOnly.

Main

Aqui temos o arquivo principal dos worknode groups, onde vinculamos as sub-redes ao cluster. Além disso, definimos os tipos de instância EC2 (estas serão criadas de acordo com a escala a ser definida). Também vale mencionar que se o seu ambiente não possui necessidade de ficar criando e apagando pods o tempo todo, recomendo deixar os tamanhos iguais, para que nasça e permaneça sempre no mesmo tamanho.

Com isto, concluímos todos os módulos básicos do nosso cluster.

Agora, vamos criar nosso ambiente de stage (ou testes, se preferir). Para isso, é necessário fazer uso de todos os módulos que criamos anteriormente e definir os parâmetros de cada ambiente.

Primeiro, definimos o backend do terraform. É ele que irá armazenar o estado da sua infra. Existem vários providers para isso, mas aqui vamos utilizar o Amazon S3 Bucket para tal. Também é importante destacar que fixamos a versão do terraform na versão atual. Assim, garantimos que atualizações no terraform não quebrem nosso script futuramente.

Em seguida, declaramos o provider da aws, que é a base para os módulos que usamos neste tutorial.

Logo abaixo, usamos o primeiro módulo que criamos: network. Como declarado nas variáveis, ele precisa receber como parâmetro a variável tags, que é um conjunto de tag’s que será aplicada no nosso módulo de network.

Em seguida, declaramos o módulo cluster, onde usamos algumas variáveis de ambiente que foram saída de dados do módulo de network, como vpc_ideks_subnet_ids e cluster_name.

Por último, declaramos o módulo worknodes, onde novamente usamos as variáveis de saída do módulo de network. Aqui também definimos variáveis importantes para a escala dos nossos grupos, como a quantidade e tamanho mínimo, máximo e desejável do grupo.

Feito isto, vamos navegar até o diretório terraforms/stg da nossa aplicação e vamos preparar nossa aplicação para inserir as mudanças. Dentro deste diretório, digite o comando:

terraform init

Isso irá inicializar o backend do s3 e baixar os providers declarados. Depois, iremos executar o comando terraform plan, para vermos o que o terraform planeja criar/modificar na nossa infra:

Com essa mensagem, vimos os recursos que o terraform irá criar:

Plan: 18 to add, 0 to change, 0 to destroy.

Portanto, vimos que é relativamente simples, com esta ultima versão, criarmos ambientes EKS com terraform na AWS. Você pode baixar o fonte deste projeto e adicionar outras features, assim como parametrizar o tipo de instância. Vale lembrar que o código fonte deste projeto está disponível em https://github.com/orlandoburli/personalerp-ops. Agora é hora de colocar tudo isso em prática! Se precisar de mais dicas como estas, dê uma olhada nos outros textos do nosso Blog e não esqueça de seguir a Impulso nas redes sociais.

Nós usamos cookies para melhorar sua experiência no site. Ao aceitar, você concorda com nossa Política de Privacidade

Assine nossa newsletter

Toda semana uma News com oportunidades de trabalho, conteúdos selecionados, eventos importantes e novidades sobre o Mundo da Tecnologia.

Pronto, em breve você vai receber novidades 👍