Criando e gerenciando um cluster kubernetes stage e produção na AWS com terraform

Orlando Burli Júnior
Mar 19 · 6 min read

Criar o ambiente na AWS é simples, mas requer atenção a alguns detalhes

Introdução

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

Amazon Elastic Kubernetes Service (EKS)

O EKS é um serviço de kubernetes gerenciado pela amazon, sendo compatível até o momento deste artigo até a versão 1.15. Existe ainda uma opção chamada AWS Fargate, que é uma versão serverless deste serviço. Aqui iremos nos ater aos worknodes normais.

Terraform

Terraform é 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. (Fonte: Wikipédia)


Alguns conceitos…

O cluster do EKS é composto basicamente de 2 elementos macros: cluster e workgroups.

O cluster é o serviço principal, responsável por gerenciar os worker nodes e worker groups.

O work node é uma máquina, física ou virtual, onde serão publicados os containers, gerenciados por pods. Pods, 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.

O work group, como o nome diz, é um grupo de work nodes, podendo, no ambiente AWS, ser gerenciado ou não.

O projeto de exemplo

Aqui iremos criar um projeto de exemplo, chamado PersonalERP. É um projeto que eu já desenvolvi a alguns anos e estou migrando para K8's.

Neste projeto iremos criar 2 ambientes, um de stage/testes e outro de produção. Iremos 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
Estrutura básica de pastas do cluster

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. Irá importar os módulos que são compartilhados entre os ambientes,

terraform\stg — Aqui ficam os scripts de inicialização do ambiente de stage. Irá importar os módulos que são compartilhados entre os ambientes, bem como definir parâmetros para a criação do cluster.

terraform\modules — Aqui ficam os módulos do projeto.

terraform\modules\network— Criação da infraestrutura básica de rede (VPC, subnets, route tables).

terraform\modules\cluster — Criação do cluster e suas roles.

terraform\modules\worknodes — Criação dos worknodes.

Módulo network

Para a criação do cluster, são necessárias 2 coisas: Uma VPC (Virtual Private Cloud) e ao menos 2 Subnet's em pelo menos 2 regiões diferentes.

Este módulo irá conter 3 arquivos: variables.tf, main.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 neste detalhe.

Quanto as sub-redes, utilizamos um counter do terraform para criar 3 redes, e como usamos um datasource para pegar as regiões disponíveis, ele irá distribuir as 3 sub-redes entre as regiões que encontrar. No Brasil, temos 3 sub-regiões (sa-east-1a, sa-east-1b e sa-east-1c), então irá ficar uma em cada sub-rede.

Esse ponto de subredes é muito importante, pois se não houver pelo menos 2 subredes em 2 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. Vejamos agora com detalhes os arquivos deste módulo.

Variables

Aqui novamente, as variáveis do módulo. Reparem que aqui estamos recebendo 3 variáveis que sairão como output do módulo de network anterior: vpc_id, eks_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, onde definimos o nome do cluster, a versão, a role que criamos anteriormente, vinculados à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

Aqui iremos definir os work nodes e work groups do nosso cluster. Como iremos usar grupos gerenciados do EKS, então a nossa única definição é do workgroup.

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 desejamos.

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 necessárias as permissões: AmazonEKSWorkerNodePolicy, AmazonEKS_CNI_Policy e AmazonEC2ContainerRegistryReadOnly.

Main

Aqui temos o arquivo principal dos worknode groups, onde vinculamos às sub-redes, ao cluster, definimos os tipos de instância EC2 (estas instâncias serão criadas de acordo com a escala a ser definida). Como parâmetros, definidas no arquivo de variáveis, temos:

Como boa prática, se o teu ambiente não possui necessidade de ficar criando e apagando pods o tempo todo, recomendo deixar estes 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.

Ambiente STG (Stage)

Agora vamos criar nosso ambiente de stage, ou testes, como preferir. Vamos fazer uso de todos os módulos que criamos anteriormente, e definir os parâmetros de cada ambiente.

Primeiramente, definimos o backend do terraform. O backend do terraform é o local onde ele irá armazenar o estado da sua infra. Existem vários providers para isso, mas aqui iremos utilizar o Amazon S3 Bucket para tal. Também é importante destacar que fixamos a versão do terraform na versão atual do mesmo, 0.12.20, de forma a garantirmos 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_id, eks_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. Também aqui definimos variáveis importantes para a escala dos nossos grupos, como a quantidade de grupos, 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 aplicar as mudanças. Dentro deste diretório, digite o comando:

terraform init

Isso irá inicializar o backend do s3, e baixar os providers declarados. Após isso, 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.

Conclusão

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, parametrizar o tipo de instância, por exemplo.

O código fonte deste projeto está disponível em https://github.com/orlandoburli/personalerp-ops

Agradecimentos

Agradeço ao colega Rafael Santos, que colaborou (e muito!) com a elaboração deste pequeno tutorial.

Orlando Burli Júnior

Written by

Software Architect, 16 years of experience. Expertise with microservices, SRE and CI/CD. https://www.linkedin.com/in/orlando-burli-junior/

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade