Introdução ao GitOps
O gerenciamento de clusters Kubernetes pode ser um desafio, especialmente quando se trata de manter a consistência e a segurança. O GitOps oferece uma abordagem para gerenciar a infraestrutura e aplicações como código, utilizando o Git como a única fonte de verdade. Com o GitOps, é possível automatizar o processo de deploy e garantir que o estado do cluster esteja sempre alinhado com o que está definido no repositório Git.
Princípios do GitOps
O GitOps se baseia em quatro princípios fundamentais:
Declarativo,
Versionado e Imutável,
Puxado Automaticamente e
Reconciliado Continuamente.
Esses princípios garantem que o estado do cluster seja sempre consistente com o que está definido no Git e que qualquer mudança seja feita de forma controlada e auditável.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: gitops-argocd-demo
spec:
project: default
source:
repoURL: https://github.com/your-repo/your-repo.git
targetRevision: HEAD
destination:
server: https://kubernetes.default.svc
syncPolicy:
automated:
selfHeal: true
prune: true
Pré-requisitos
Para seguir este tutorial, você precisará ter os seguintes pré-requisitos atendidos:
- Repositório GitHub para servir como o Single Source of Truth.
- Conta no DockerHub para atuar como seu Container Registry.
- Cluster Kubernetes em execução.
- Ferramentas Kubernetes, como o kubectl, instaladas e configuradas.
- Conhecimento fundamental de Kubernetes.
O que é GitOps
Princípios do GitOps
GitOps é um framework operacional que utiliza o Git como a única fonte de verdade para a infraestrutura e aplicações. Ele é baseado em quatro princípios fundamentais:
- Declarativo: Você descreve o estado desejado, não os comandos para alcançá-lo.
- Versionado e imutável: Seu estado inteiro está no Git. Se uma implantação falhar, você pode reverter para um estado conhecido anterior.
- Puxado automaticamente: Um agente de software (como o Argo CD) puxa o estado do Git.
- Reconciliado continuamente: O sistema constantemente corrige a “deriva”. Se um desenvolvedor alterar manualmente um serviço no cluster, o Argo CD sobrescreverá para corresponder ao que está no Git.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: gitops-argocd-demo
namespace: argocd
spec:
project: default
source:
repoURL: 'https://github.com/your-repo/your-app.git'
targetRevision: HEAD
path: 'Kubernetes-manifest'
destination:
server: 'https://kubernetes.default.svc'
namespace: argocd-demo-ns
syncPolicy:
automated:
selfHeal: true
prune: true
O que é Argo CD
Definição e Funcionamento
Argo CD é um motor de entrega contínua declarativa, construído especificamente para Kubernetes, que ajuda a gerenciar a configuração do cluster e a automatizar a implantação de aplicações. Ele utiliza um modelo de “puxar” em vez de “empurrar”, onde o agente de Argo CD dentro do cluster puxa as alterações do repositório Git.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: gitops-argocd-demo
namespace: argocd
spec:
project: default
source:
repoURL: 'https://github.com/[seu-usuario]/[seu-repositorio].git'
targetRevision: HEAD
path: 'Kubernetes-manifest'
destination:
server: 'https://kubernetes.default.svc'
namespace: argocd-demo-ns
syncPolicy:
automated:
selfHeal: true
prune: true
syncOptions:
- CreateNamespace=true
Preparando o Código da Aplicação
Estrutura do Repositório
Para começar, precisamos criar a estrutura do repositório que conterá o código da nossa aplicação. A estrutura deve ser a seguinte:
GITOPS-ARGOCD-DEMO/
├── .github/workflows/main.yml
├── auxiliary-service/
│ └── Dockerfile
├── main-api/
│ └── Dockerfile
├── Kubernetes-manifest/
│ ├── aux-api.yaml
│ ├── kustomization.yaml
│ └── main-api.yaml
├── application.yaml
└── image-updater.yaml
Automatizando a Construção de Imagens com GitHub Actions
Criando o Workflow de GitHub Actions
Para automatizar a construção e publicação de imagens Docker, criaremos um workflow de GitHub Actions.
name: Build and Push Image to DockerHub
on:
push:
branches:
- main
# Skip builds for image updater commits
paths-ignore:
- 'Kubernetes-manifest/'
jobs:
docker_build:
name: Build & Push ${{ matrix.service }}
environment: argocd-demo
runs-on: ubuntu-latest
permissions:
contents: write
strategy:
matrix:
include:
- service: aux-service
dockerfile: auxiliary-service/Dockerfile
- service: main-service
dockerfile: main-api/Dockerfile
env:
DOCKER_USER: ${{ secrets.DOCKERHUB_USERNAME }}
RUN_TAG: ${{ github.run_number }}
steps:
- name: Check out code
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ env.DOCKER_USER }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Build and Push ${{ matrix.service }}
uses: docker/build-push-action@v6
with:
context: .
file: ${{ matrix.dockerfile }}
push: true
tags: ${{ env.DOCKER_USER }}/${{ matrix.service }}:${{ env.RUN_TAG }}
cache-from: type=gha,scope=${{ matrix.service }}
cache-to: type=gha,mode=max,scope=${{ matrix.service }}
Instalando e Acessando o Argo CD
Instalação do Argo CD
Para instalar o Argo CD, execute os seguintes comandos no terminal:
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
Aguarde alguns minutos para que os pods sejam inicializados.
Acessando a Interface do Usuário do Argo CD
Para acessar a interface do usuário do Argo CD, use o port forwarding para criar um túnel seguro entre o seu computador e o serviço do Argo CD no cluster.
kubectl port-forward svc/argocd-server -n argocd 8080:443
Abra um navegador e acesse https://localhost:8080.
Entendendo o Aplicativo Argo CD
Definição e Funcionalidade
Um Aplicativo Argo CD é um recurso personalizado (CRD) que atua como um “contrato” entre o repositório Git e o cluster Kubernetes.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: gitops-argocd-demo
namespace: argocd
spec:
project: default
source:
repoURL: 'https://github.com/SEU_USUARIO/SEU_REPOSITORIO.git'
targetRevision: HEAD
path: 'Kubernetes-manifest'
destination:
server: 'https://kubernetes.default.svc'
namespace: argocd-demo-ns
syncPolicy:
automated:
selfHeal: true
prune: true
syncOptions:
- CreateNamespace=true
Implantando o Manifesto da Aplicação
Criando o Manifesto da Aplicação
Para implantar a aplicação Argo CD, precisamos criar um manifesto que defina o repositório Git e o cluster de destino.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: gitops-argocd-demo
namespace: argocd
spec:
project: default
source:
repoURL: 'https://github.com/SEU_USUARIO/SEU_REPOSITORIO.git'
targetRevision: HEAD
path: 'Kubernetes-manifest'
destination:
server: 'https://kubernetes.default.svc'
namespace: argocd-demo-ns
syncPolicy:
automated:
selfHeal: true
prune: true
syncOptions:
- CreateNamespace=true
Automatizando Atualizações com o Argo CD Image Updater
Instalando o Argo CD Image Updater
Para automatizar a atualização de tags de imagem em manifestos Kubernetes, instale o Argo CD Image Updater.
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj-labs/argocd-image-updater/stable/config/install.yaml
Configurando o Image Updater
Para que o Image Updater funcione corretamente, crie um token de acesso pessoal no GitHub e armazene-o como um segredo no Kubernetes.
kubectl -n argocd create secret generic git-creds \
--from-literal=username= \
--from-literal=password=
Resumo do Fluxo de Trabalho GitOps
Com a implementação do fluxo de trabalho GitOps utilizando o Argo CD e o Image Updater, você pode automatizar a construção, implantação e atualização de suas aplicações em um cluster Kubernetes.
git add .
git commit -m "Initial Argo application deployment"
git push origin main
Benefícios do Uso do Argo CD e do Image Updater
O uso do Argo CD e do Image Updater proporciona vários benefícios, incluindo:
- Automatização da implantação e atualização da aplicação
- Garantia de consistência entre a configuração da aplicação no cluster e no repositório Git
- Redução do risco de erros humanos e configuração inconsistente
- Melhoria da segurança e auditoria
Fonte: freecodecamp.org.
Curadoria e Insights: Redação YTI&W (Developers).