Terraform vs. Kubernetes: Qual ferramenta DevOps escolher?

A automatização no desenvolvimento de software tornou-se um pilar fundamental. A automação da infraestrutura simplifica as alterações de configuração e minimiza o risco de erros humanos. Adicionalmente, proporciona maior visibilidade para todas as equipes envolvidas no projeto.

O lançamento de um novo produto ou a melhoria de uma infraestrutura existente podem ser complexos sem a devida automatização. Felizmente, existem diversas ferramentas de automação que podem otimizar o ciclo de vida do seu projeto.

Este artigo focará em duas das ferramentas de automatização mais utilizadas, Terraform e Kubernetes, destacando suas principais diferenças.

Introdução ao Terraform

O Terraform é um software de código aberto que permite gerenciar infraestruturas de forma segura e previsível em larga escala, utilizando o conceito de infraestrutura como código e princípios de independência de nuvem. Esta ferramenta poderosa, desenvolvida pela Hashicorp, possibilita o provisionamento de infraestrutura tanto localmente quanto na nuvem.

O Terraform é construído com uma linguagem de configuração declarativa chamada Hashicorp Configuration Language (HCL). Isso possibilita a automação do gerenciamento de infraestrutura em qualquer ambiente. Além disso, permite que profissionais de TI trabalhem em conjunto e implementem mudanças de forma segura em ambientes de nuvem, ajustando-os de acordo com as necessidades do negócio.

Os módulos oferecem alta reutilização e oportunidades para compartilhar código, o que melhora a colaboração e produtividade de equipes que trabalham na nuvem. Os provedores são plugins que facilitam a interação e integração com diversas APIs, sendo uma das formas mais importantes de expandir a funcionalidade do Terraform.

O Terraform mantém um estado interno da infraestrutura que é gerenciada, o que inclui recursos, configuração, metadados e suas relações. Esse estado é ativamente mantido e utilizado para planejar, monitorar mudanças e modificar ambientes de infraestrutura. Para facilitar o trabalho em equipe e a colaboração, é recomendável que o estado seja mantido remotamente.

O fluxo de trabalho principal do Terraform consiste em três etapas: primeiro, é preciso gerar os arquivos de configuração do código de infraestrutura representando o ambiente desejado. Em seguida, verifica-se se o plano gerado é consistente com as configurações. Após uma análise cuidadosa, aplica-se o plano para provisionar os recursos de infraestrutura.

Introdução ao Kubernetes

Kubernetes (K8s) é uma plataforma de código aberto para orquestração de contêineres, implantações automatizadas e gestão de aplicações em contêineres. Este sistema de orquestração permite que as aplicações sejam facilmente escaladas e atinjam alta disponibilidade. O Google desenvolveu-o com base em sua vasta experiência com cargas de trabalho críticas de produção.

O Kubernetes é independente de nuvem, o que oferece grande flexibilidade ao executar cargas de trabalho em ambientes de nuvem e locais. Além disso, é extensível, permitindo adicionar facilmente funcionalidades ou ferramentas personalizadas aos clusters.

Uma das maiores vantagens do Kubernetes é sua capacidade de autocura. Falhas em contêineres são automaticamente reiniciadas e reprogramadas. Os nós podem ser configurados para substituir automaticamente outros nós e o tráfego é direcionado apenas para componentes saudáveis que passaram em verificações de integridade.

As distribuições podem ser feitas em etapas, e o Kubernetes possui mecanismos inteligentes que monitoram a integridade das aplicações durante as implantações. Caso a integridade da aplicação não retorne um estado saudável após uma implantação, uma reversão de qualquer alteração problemática é feita automaticamente.

Ao longo dos anos, tem havido muita discussão sobre como manter a aplicação em execução enquanto novas versões de software são lançadas. O Kubernetes oferece várias opções de implantação.

O Kubernetes gerencia a descoberta de serviços e o balanceamento de carga de tráfego entre pods semelhantes. Não são necessárias soluções externas complexas.

Você pode estender os mecanismos internos fornecidos para gerenciar configurações e segredos para suas aplicações. Adicionalmente, facilita o dimensionamento das aplicações com suas opções de autoescalonamento e escalonamento por demanda.

Terraform x Kubernetes

Ambas as tecnologias modernas compartilham semelhanças, mas também têm diferenças fundamentais. Vamos analisar algumas delas.

Área de foco

Terraform e Kubernetes são distintos porque têm objetivos diferentes e resolvem problemas diferentes. O Terraform foca no provisionamento de componentes de infraestrutura e tem como alvo a infraestrutura como código. Já o Kubernetes foi projetado para permitir a execução de cargas de trabalho de contêiner e direciona a área de orquestração de contêineres.

Linguagem de configuração

O Terraform define objetos declarativos utilizando a Hashicorp Configuration Language (HCL). É possível criar recursos que são executados em diferentes plataformas de nuvem usando um arquivo HCL.

O Kubernetes define objetos declarativos em arquivos YAML e JSON. Estes arquivos são usados para demonstrar como gerenciar objetos do Kubernetes. YAML é geralmente preferido a JSON para a escrita de arquivos de configuração, mas eles podem ser usados de forma intercambiável.

Fluxo de trabalho da ferramenta

O fluxo de trabalho do Terraform é intuitivo e oferece uma experiência amigável para novos usuários. No entanto, para executar aplicações no Kubernetes de forma eficiente, é preciso compreender vários componentes e mecanismos internos do cluster. Geralmente, o Kubernetes apresenta uma curva de aprendizado mais acentuada para novos usuários.

Fase de planejamento e desvio de configuração

O Terraform permite identificar e notificar desvios de configuração através da fase de planejamento do fluxo de trabalho padrão. O Kubernetes, por outro lado, não oferece essa funcionalidade.

Criação de recursos

A Terraform CLI fornece uma interface de linha de comando para o Terraform, suportando opções e subcomandos como `terraform plan` e `terraform apply`. O Terraform utiliza a CLI para executar e gerenciar configurações declarativas na criação de recursos.

O Kubernetes vem com sua própria ferramenta de linha de comando, `kubectl`, para gerenciar clusters de recursos do Kubernetes. Com `kubectl`, é possível criar recursos, alocar memória e CPU para contêineres e criar nós. Também permite a implantação de aplicações.

Vantagens do Terraform e Kubernetes 👍

Vantagens do Terraform:

  • Implantações em várias nuvens são possíveis graças a diversos recursos.
  • Ajuda a evitar tempo de inatividade.
  • Facilita o registro, monitoramento, gestão e geração de relatórios de mudanças.
  • Sintaxe declarativa de recursos.
  • Documentação completa e de fácil compreensão.

Vantagens do Kubernetes:

  • Compatibilidade com recursos: permite o dimensionamento horizontal da infraestrutura.
  • Evita o aprisionamento em infraestruturas específicas.
  • Sintaxe declarativa de recursos.
  • Automatiza a recuperação, monitorando réplicas e assegurando que o sistema esteja sempre saudável.
  • Principal ferramenta de gerenciamento de contêineres, apoiada pelo Google, com extensa documentação.

Desvantagens do Terraform e Kubernetes 👎

Desvantagens do Terraform:

  • Não oferece suporte total ao GKE (Google Kubernetes Engine).
  • Não possui tratamento de erros.
  • Não possui reversão. Se necessário, o usuário precisa destruir o objeto gerenciado e aplicá-lo novamente.
  • Bugs são comuns em novas versões.

Desvantagens do Kubernetes:

  • É difícil de dominar.
  • Apenas a orquestração de infraestrutura é possível.
  • Pode ser necessário ajustar fluxos de trabalho para introduzir K8s em uma organização.

A seguir, uma comparação entre Kubernetes e Terraform:

Kubernetes Terraform
Descrição Sistema de orquestração de contêiner de código aberto Código aberto, infraestrutura como código, ferramenta de software
Data de lançamento inicial 9 de setembro de 2014 28 de julho de 2014
Desenvolvedor Google, Rancher Labs, Cloud Native Computing Foundation HashiCorp
Linguagem de configuração YAML/JSON Hashicorp Configuration Language (HCL)
Comandos Utiliza `kubectl` para executar comandos do Kubernetes Utiliza Terraform CLI para executar comandos
Curva de Aprendizado Requer o entendimento de diversos componentes e mecanismos internos do cluster Fácil de entender

Casos de uso comuns do Kubernetes

Orquestrando contêineres em vários hosts

O Kubernetes é independente de plataforma, permitindo hospedar seus contêineres em diversas máquinas ou na nuvem. Para garantir alta disponibilidade, também possui uma camada de failover.

Gerenciando recursos de computação

Geralmente é mais econômico hospedar um cluster Kubernetes dedicado do que executar vários servidores. Além disso, é mais fácil gerenciar um cluster Kubernetes do que vários hosts com servidores diferentes.

Executando plataformas de CI/CD

O Kubernetes é um componente chave das metodologias de CI/CD e a escolha preferida para executar plataformas de CI/CD como Jenkins, Spinnaker e Drone. O Kubernetes executará plataformas de CI/CD, desde que elas possam ser empacotadas em um contêiner.

Orquestração de armazenamento

O Kubernetes oferece suporte ao provisionamento dinâmico de volumes de armazenamento. Sistemas de armazenamento podem ser conectados a qualquer plataforma escolhida, incluindo rede e armazenamento em nuvem.

Descoberta de serviço e balanceamento de carga

O Kubernetes expõe o serviço de cluster de contêiner para outras plataformas através de um ponto DNS do cluster. Ele também pode distribuir e balancear a carga do tráfego para garantir que as instâncias implantadas estejam disponíveis e estáveis quando houver um alto volume de tráfego de rede.

Casos de uso comuns do Terraform

Infraestrutura de rastreamento

O Terraform rastreia seus recursos usando um arquivo de estado para acompanhar as mudanças. Este arquivo serve como ponto de referência para quando os recursos são alterados. O Terraform utiliza o arquivo de estado para determinar as mudanças necessárias na infraestrutura, visando atingir qualquer estado final desejado.

Implantação em várias nuvens

O Terraform é uma plataforma que pode ser utilizada em qualquer nuvem. Para gerenciar recursos de infraestrutura hospedados por diversos provedores de nuvem, é possível usar um único arquivo de configuração HCL. Ele também pode gerenciar as dependências entre nuvens. Implementações em várias nuvens aumentam a robustez e tolerância a falhas.

Gerenciando aplicações multicamadas

Aplicações multicamadas podem ser separadas definindo uma lógica individual para cada camada. O Terraform gerencia automaticamente as dependências entre as camadas, definindo cada camada como uma coleção. Dependências e plugins são necessários para garantir consistência entre as camadas, e podem ser difíceis de instalar manualmente.

O provisionamento do Terraform garante que essas dependências sejam instaladas e implementadas corretamente. Por exemplo, o Terraform confirma que a camada do banco de dados está disponível antes de provisionar servidores web ou balanceadores de carga.

Rede Definida por Software

O Terraform pode interagir com Redes Definidas por Software para configurar a rede de acordo com as necessidades de suas aplicações. Isso permite que você deixe um fluxo de trabalho baseado em tickets e automatize o processo de implantação, reduzindo o tempo de lançamento.

Considerações Finais

Exploramos as principais diferenças entre Terraform e Kubernetes, duas das ferramentas DevOps mais populares. Descobrimos o que cada ferramenta oferece para desenvolvedores e operadores de TI e em que são melhores. O Terraform é uma estrutura que automatiza recursos de forma declarativa em várias plataformas de nuvem. O Kubernetes gerencia o gerenciamento de recursos, implantações e balanceamento de carga em ambientes de contêiner.

Essas ferramentas facilitam a automatização da infraestrutura, implantações de aplicações, monitoramento e outras tarefas.

Em seguida, você pode conferir as práticas recomendadas do Terraform.