GitOps — Infraestrutura como código

Diego Rodrigues
Elo — Tecnologia e Inovação
5 min readSep 22, 2022

O que é GitOps?

O GitOps é um conjunto de práticas para gerenciar configurações de infraestrutura e aplicação usando o Git, um sistema de controle de versão open source. O GitOps funciona usando o Git como a única fonte de informações para infraestrutura e aplicações declarativas.

O GitOps usa pull requests do Git para gerenciar automaticamente o provisionamento e a implantação de infraestrutura. O repositório Git contém todo o estado do sistema, de modo que o registro de mudanças fique visível e possa ser auditado.

O GitOps foi projetado pensando na experiência do desenvolvedor e ajuda as equipes a gerenciar infraestruturas usando as mesmas ferramentas e processos utilizados para desenvolver software. Além do Git, o GitOps oferece a possibilidade de escolher as ferramentas de que você precisa.

Princípios GitOps

Existem princípios do GitOps que impulsionam sua implementação:

  1. Use a configuração declarativa para definir seu aplicativo e serviços.
  2. Todas as alterações precisam passar pelo seu processo de revisão do Git — ninguém deve usar o kubectl diretamente.
  3. Use um operator no cluster para identificar o estado desejado, conforme declarado pela sua configuração no Git.

Como Funciona?

Instalando o ArgoCD

Vamos instalar o ArgoCD e ver como funciona a implantação de um fluxo GitOps completo. Para seguir esse passo a passo, você precisa do kubectl e do minikube devidamente instalados.

Crie os dois clusters no minikube com os seguintes comandos.

minikube start -p argocd-k8s
minikube start -p target-k8s

Agora, iremos trabalhar no argocd-k8s cluster para realizarmos a instalação da nossa ferramenta de sincronização. Vamos mudar o contexto do kubectl para que termos acesso ao cluster do ArgoCD.

kubectl config use-context argocd-k8s

Vamos criar um namespace para isolar a instalação do ArgoCD.

kubectl create namespace argocd

Agora, vamos instalar nossa ferramenta de sincronização.

kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

O comando de instalação será concluído rapidamente, mas os pods ainda estarão sendo criados em background. Eles precisam estar em funcionamento antes de avançarmos. Use o comando watch para garantir que todos os pods estejam em execução.

kubectl get pods -n argocd --watch

Assim que os pods estiverem prontos, o ArgoCD estará em execução, mas ainda não estará acessível de fora do cluster. Como este é um ambiente de demonstração, use o seguinte comando para expor uma porta para o serviço.

kubectl port-forward svc/argocd-server -n argocd 8080:443

Seu cluster argocd-k8s estará disponível em https://localhost:8080. O comando port-forward agora também será executado em primeiro plano. Abra outra janela ou guia no terminal e volte para o diretório de trabalho.

Instale a versão mais recente do ArgoCD CLI. Você pode obter as instruções de instalação para o seu sistema operacional aqui.

Com a CLI devidamente instalada, utilize-a para fazer login no ArgoCD com o usuário admin e a senha (nome completo do pod cujo prefixo é argocd-server).

argocd login localhost:8080

Estamos quase prontos para implantar nosso primeiro aplicativo. Mas antes precisamos informar ao ArgoCD o destino de implantação. Por padrão, se não adicionarmos um destino, o ArgoCD implantará aplicativos no cluster em que está instalado. Para adicionar nosso cluster Kubernetes de destino ao ArgoCD, use o seguinte comando:

argocd cluster add target-k8s

Pronto, agora nosso ArgoCD está devidamente configurado.

Implantando nossa primeira aplicação

Para nossa primeira implantação, iremos utilizar uma das aplicações de exemplo disponíveis no repositório do ArgoCD.

O ArgoCD permite a implantação de aplicativos e infraestruturas de 4 formas, que são, através da CLI, interface Web, API Rest e declarativamente. Nesse artigo utilizaremos o modo declarativo.

Crie um arquivo chamado application.yaml com o seguinte conteúdo.

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: guestbook
namespace: argocd
spec:
destination:
namespace: default
name: target-k8s
project: default
source:
path: guestbook
repoURL: https://github.com/argoproj/argocd-example-apps
syncPolicy:
automated:
selfHeal: true
prune: true

O arquivo application.yaml é auto explicativo, nele definimos o nome da aplicação em metadata.name, o repositório da mesma em spec.source.repoURL, a pasta que contém a aplicação dentro do repositório em spec.source.path e o cluster de destino em spec.destination.name.

Crie o arquivo no cluster do ArgoCD com o seguinte comando.

kubectl apply -f application.yaml

Faça login no ArgoCD através da interface gráfica, acessando https://localhost:8080.

Veja a aplicação sendo criada no cluster de destino.

Clique em guestbook e veja os detalhes da implantação.

Vamos verificar nosso cluster de destino. Para isso, altere o contexto do kubectl para o cluster target-k8s.

kubectl config use-context target-k8s

Verifique se a aplicação foi instalada e está sendo executada corretamente.

Agora experimente deletar o deployment e verifique o que acontece logo em seguida.

Após detectar que o estado monitorado do cluster k8s-target estava diferente do estado especificado no repositório Git, o ArgoCD reconciliou automaticamente para que o cluster voltasse ao estado desejado novamente.

Essa auto cura, ocorreu graças a configuração spec.syncPolicy.automated.selfHeal realizada no arquivo application.yaml. Sem ela, o administrador do ArgoCD teria que sincronizar as configurações de volta para o estado desejado manualmente.

Você também pode testar o caminho inverso, realizando algum commit no repositório Git, para que o ArgoCD reconcilie o estado desejado no cluster de destino. Para isso, faça um fork do repositório de exemplo e altere o application.yaml, para que o mesmo referencie o repositório clonado.

Limpando

Execute os seguintes comandos para remover os clusters criados no artigo.

minikube delete -p argocd-k8s
minikube delete -p target-k8s

Conclusão

GitOps com Kubernetes leva a infraestrutura como código a um outro nível. O estilo declarativo e o modelo de reconciliação do Kubernetes, proporcionam um ambiente extremamente favorável para a sincronização e automação de infraestruturas através do Git.

O ArgoCD é uma excelente ferramenta para esse trabalho, pois além de ser um projeto encubado na Cloud Native Computing Foundation (CNCF) e ser extremamente flexível, ele também disponibiliza funcionalidades interessantes como a possibilidade de trabalhar com múltiplos clusters, múltiplos repositórios, interface web para atividades operacionais, API REST para integrações e Single Sign-On (SSO).

--

--