GitOps — Infraestrutura como código
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:
- Use a configuração declarativa para definir seu aplicativo e serviços.
- Todas as alterações precisam passar pelo seu processo de revisão do Git — ninguém deve usar o kubectl diretamente.
- 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).