Pipeline GitOps com FluxCD
Irá auxiliar na implantação, atualização das aplicações no cluster kubernetes de forma automatizada.
A ideia central do GitOps é que exista uma “fonte da verdade” um repositório git que contém arquivos declarativos da infraestrutura (arquivos declarativos são os manifestos yaml que serão utilizados no deploy da aplicação no cluster). E um processo automatizado que irá garantir que tudo que está no git estará em execução no cluster Kubernetes.
O Flux é uma solução de entrega contínua e progressiva para Kubernete, ele mantém o cluster Kubernete em sincronia com a fonte da verdade (repositórios Git) e automatiza as implantações e atualizações.
- Fonte da verdade: É um repositório contendo o estado desejado da nossa aplicação. As alterações são verificadas em um intervalo de tempo definido, se houver uma versão mais recente um novo artefato será reproduzido.
- Reconciliação: garante o estado desejado definido declarativamente na fonte da verdade.
- Bootstrap: O processo de instalação dos componentes do Flux.
- O desenvolvedor commita as mudanças no repositório da aplicação.
- Github Actions irá buildar a imagem da aplicação e envia para repo docker, utilizaremos os 8 caracteres do hash do commit.
- Ainda no repositório da aplicação serão colhidas algumas variáveis de ambiente para preencher os manifestos que serão utilizados no k8s.
- Após o preenchimento dos manifestos o mesmo passará por uma validação usaremos kubeval.
- Após a validação do manifesto será aberto um PR automaticamente no repositório do FluxCD.
- Após as aprovações do PR e feito o merge fluxcd identifica as mudanças e faz o deploy no cluster.
Implantar Flux no cluster k8s.
Esse procedimento irá implantar Flux no cluster, criará um repositório flux-k8s e configura as chaves ssh pública no repositório flux-k8s.
$ export GITHUB_TOKEN=<your-token>
$ export GITHUB_USER=<your-username>
$ flux bootstrap github \
--owner=$GITHUB_USER \
--repository=$GITHUB_USER/flux-k8s \
--branch=main \
--path=clusters/production \
--interval=1m \
--log-level=info \
--namespace=flux \
--personal
Para conferir digite: kubectl get all -n flux
Para este procedimento vamos precisar da URL do webhook do Discord Server:
Para criar um webhook do discord server siga este artigo do Discord:
Criar secret webhook discord:
$ kubectl -n flux-system create secret generic discord-url \
--from-literal=address=https://discord.com/api/webhooks/WEBHOOK/DO_SEU/DISCORD_SERVER
Precisamos criar um provedor de notificação para o Discord fazendo referência as secrets acima.
- Clone o repositório que foi criado na implantação do Flux:
- Crie um diretório para nossas aplicações dentro desse diretório vamos manter os manifestos.
$ git clone https://github.com/$GITHUB_USER/flux-k8s.git
$ cd flux-k8s/clusters/production
$ mkdir apps
- Criar manifesto
provider.yaml
para provedor de notificação. Antes vamos criar um diretório para o app de notificação.
$ cd apps
$ mkdir notification
$ cd notification
Agora podemos criar o manifesto use o seguinte conteúdo. Não esqueça de alterar o canal.
---
apiVersion: notification.toolkit.fluxcd.io/v1beta1
kind: Provider
metadata:
name: naw-provider
namespace: flux
spec:
channel: SEU-CANAL-DISCORD-SERVER
secretRef:
name: discord-url
type: discord
username: flux-bot
- Criar manifesto
alert.yaml
define os alertas para repositório git: utilize o conteúdo a seguir.
---
apiVersion: notification.toolkit.fluxcd.io/v1beta1
kind: Alert
metadata:
name: naw-alert
namespace: flux
spec:
eventSeverity: info
eventSources:
- kind: Kustomization
name: '*'
- kind: GitRepository
name: '*'
providerRef:
name: naw-provider
- Não vamos implantar os manifestos manualmente o Flux fará isso pra gente. Vamos empurrar as alterações para repositório git.
$ git add .
$ git commit -m "feat: add recurso de notificacao discord"
$ git push
Aguarde alguns segundos o Flux fará implantaçao dos manifestos no cluster.
Para conferir as alterações digite:
$ kubectl get providers -n flux
$ kubectl get alerts -n flux
Vamos utilizar um manifesto do nginx como exemplo.
- Dentro do diretório production/apps do repositório do flux-k8s crie um diretório nginx.
$ mkdir nginx
- Crie o manifesto
deployment.yaml
com o seguinte conteúdo:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-flux-test
namespace: default
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx-flux-test
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
Não vamos implantar o manifesto manualmente o Flux fará isso pra gente. rsrsrsrsrs
- Faça o commit das alterações do repositório:
$ git add .
$ git commit -m "feat: add recurso ngix"
$ git push
Aguarde alguns segundos você receberá uma notificação no Discord.
Para conferir se app foi implantado no cluster utilize o comando: kubectl get pods
A saída será algo como:
NAME READY STATUS RESTARTS AGE
nginx-flux-test-6b759fdd4-hdbfh 1/1 Running 1 (13h ago) 15h