GitOps, uma intro amigável
Tags: kubernetes, gitops
Published: 2023-10-18 00:01:37

> GitOps: CI/CD versionado sobre infraestrutura declarativa. Pare de criar scripts e comece a entregar. - [Kelsey Hightower](https://twitter.com/kelseyhightower/status/953638870888849408)

A citação acima declara uma promessa: adotando GitOps o tempo de entrega de software será otimizado e a complexidade reduzida. 

É nesse espírito que temos evangelizado a nossa infraestrutura de CI/CD alicerçada em GitOps, como ArgoCD e ArgoWorflow (CI), em busca da transformação da nossa pipeline em uma estrutura declarativa, tornando o trabalho de Operações (Ops) em algo facilmente realizável através de estrutura declarativa (Git).

Embora grande parte do ciclo de vida de desenvolvimento de software tenha sido automatizado, a infraestrutura permaneceu por muito tempo como um processo amplamente manual que requer equipes especializadas. Com as exigências impostas à infraestrutura atual, tornou-se cada vez mais crucial implementar a sua automação. A infraestrutura moderna precisa ser elástica para poder gerenciar com eficácia os recursos da nuvem necessários para implantações contínuas.

Aplicativos modernos e _cloud native_ são desenvolvidos pensando na velocidade e na escala. Organizações com uma cultura DevOps madura podem implantar código em produção centenas de vezes por dia. As equipes de DevOps podem fazer isso por meio de controle de versão, revisão de código e pipelines de CI/CD que automatizam testes e implantações.

GitOps é usado para automatizar o processo de provisionamento de infraestrutura, especialmente infraestrutura em nuvem moderna. Semelhante à forma como as equipes usam o código-fonte do aplicativo, as equipes de operações que adotam o GitOps usam arquivos de configuração armazenados como código (infraestrutura como código - IaC). Os arquivos de configuração do GitOps geram o mesmo ambiente de infraestrutura sempre que são implantados, assim como o código-fonte do aplicativo gera os mesmos binários do aplicativo sempre que é criado.

## Desafios do GitOps

Assim como qualquer esforço colaborativo, a mudança pode ser complicada e o GitOps não é exceção. GitOps é uma mudança de processo que exigirá disciplina de todos os participantes e um compromisso em fazer as coisas de uma nova maneira.

O GitOps permite maior colaboração, mas isso não é necessariamente algo que flua de maneira natural para alguns indivíduos ou organizações. Um processo de aprovação do GitOps significa que os desenvolvedores fazem alterações no código, criam um merge request, um aprovador realiza o merge dessas alterações e a alteração é implantada. Esta sequência introduz um elemento de “mudança por controle”, ou “Change by committee” na infraestrutura, que pode parecer tedioso e demorado para engenheiros treinados para fazer alterações rápidas e manuais, mas que se paga pela sua capacidade de auditoria e revisão das mudanças a serem implantadas.

É importante que todos na equipe registrem o que está acontecendo nas merge requests e issues. A tentação de editar algo diretamente na produção ou alterar algo manualmente será difícil de frear, mas quanto menos “engenharia cowboy ” houver, melhor o GitOps funcionará.

## Benefícios do GitOps

O GitOps oferece muitos benefícios, incluindo maior eficiência e segurança, melhor experiência do desenvolvedor, custos reduzidos e implantações mais rápidas.

Com o GitOps, as organizações podem gerenciar todo o seu ciclo de vida de infraestrutura e desenvolvimento de aplicativos usando uma ferramenta única e unificada. Isso permite maior colaboração e coordenação entre equipes e resulta em menos erros e resolução mais rápida de problemas.

Além disso, o GitOps pode ajudar as organizações a aproveitar contêineres e microsserviços e manter a consistência em toda a sua infraestrutura – desde configurações de cluster Kubernetes e imagens Docker até instâncias de nuvem e qualquer coisa _on-prem_.

## Afinal qual a diferença entre GitOps e DevOps?

Existem algumas diferenças importantes entre GitOps e DevOps. Por um lado, o GitOps depende muito da automação e de ferramentas para gerenciar e implantar alterações de código, enquanto o DevOps se concentra mais na comunicação e colaboração entre equipes. Além disso, o GitOps é normalmente usado em conjunto com tecnologias de conteinerização como Kubernetes, enquanto o DevOps pode ser usado com qualquer tipo de aplicação.

GitOps é um ramo do DevOps que se concentra no uso de repositórios de código Git para gerenciar implantações de infraestrutura e código de aplicativo. A principal diferença entre os dois é que no GitOps, o repositório Git é a fonte da verdade (SSoT) para o estado de implantação, enquanto no DevOps são os arquivos de configuração do aplicativo ou do servidor.

## Operador de GitOps

O loop de reconciliação do GitOps começa clonando o repositório para buscar a versão mais recente do repositório de configuração no armazenamento local (**git clone repo**). Em seguida, a etapa de descoberta do manifesto percorre o sistema de arquivos do repositório clonado, procurando quaisquer manifestos do Kubernetes para aplicar ao cluster (**discover manifests**). Por último, a etapa de aplicação do kubectl executa a implantação real aplicando todos os manifestos descobertos ao cluster (**kubectl apply**).


![Loop da reconciliação](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ltwqwuak61hin6ozn4hq.png)

## Pipeline de integração contínua 

Um pipeline de CI GitOps é semelhante a um pipeline de CI típico. O código é construído e testado e, em seguida, o artefato (uma imagem Docker “_tagueada_”) é enviada para o registro de imagem (_Artifact Registry_ do Google por exemplo). A etapa adicional é que o pipeline GitOps CI também atualiza os manifestos no repositório de configuração com a tag de imagem mais recente. Esta atualização pode acionar um trabalho de CD do GitOps para aplicar os manifestos atualizados ao cluster.


![GitOps CI/CD scheme](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/71ovh1stctmk7rccl3vq.png)


O objetivo de um pipeline GitOps CI é:
- Buildar a sua aplicação e executar testes unitários conforme necessário
- Publicar uma nova imagem de contêiner em um container registry
- Atualize os manifestos do Kubernetes no Git para refletir a nova imagem

## Estágios da pipeline de CI


![GitOps CI](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0rjixfs6fz8ou7lfz989.png)

A figura acima apresenta os estágios de CI em uma pipeline GitOps. As caixas em branco são referentes à imagem anterior, e as cinzas são os estágios adicionais que faltaram para se construir uma pipeline de CI completa.

## Estágios da pipeline de CD

E na imagem abaixo estão os estágios de uma pipeline de CD de GtOps. As caixas em branco são também da primeira imagem, e as caixas cinzas são estágios adicionais para uma pipeline de CD


![GitOps CD](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7r1xowmztj66b05znlgi.png)


## Estágios na pipeline CI/CD

Observer que é introduzido o conceito de prebuild, ou pré-construção.

A prebuild envolverá revisão de código e análise estática. Após a conclusão da compilação, o GitOps CI atualizará o manifesto (posteriormente implantado pelo operador GitOps).


![CI/CD steps](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tqpuvrwrfxoqkybiyu1j.png)

## Componentes chave de um workflow de GitOps

Para concluir esse post, vamos ver os quatro componentes principais para um fluxo de trabalho GitOps: um repositório Git, um pipeline de entrega contínua (CD), uma ferramenta de implantação de aplicativos e um sistema de monitoramento.

1. O repositório Git é a fonte da verdade para a configuração e o código do aplicativo.
2. O pipeline de CD é responsável por construir, testar e implantar o aplicativo.
4. A ferramenta de implantação é usada para gerenciar os recursos do aplicativo no ambiente de destino.
6. O sistema de monitoramento rastreia o desempenho do aplicativo e fornece feedback à equipe de desenvolvimento.
 

Se leu até aqui, muito obrigado!