O ArgoCD é uma ferramenta popular de entrega contínua para Kubernetes, que facilita a gestão e sincronização de aplicações. Um dos recursos poderosos do ArgoCD é a capacidade de controlar a ordem de sincronização dos recursos através de "Sync Waves". Neste artigo, vamos explorar como utilizar Sync Waves para gerenciar a implantação de um banco de dados Postgres e garantir que suas dependências sejam aplicadas na ordem correta.

O que são Sync Waves?

Sync Waves são um mecanismo do ArgoCD que permite controlar a ordem em que os recursos são sincronizados. Cada recurso pode ser anotado com uma "wave" específica, que define quando ele deve ser aplicado em relação aos outros recursos. Recursos com a mesma wave são aplicados simultaneamente, enquanto recursos em waves diferentes são aplicados sequencialmente, respeitando a ordem numérica das waves.

Exemplo Prático com Postgres

Vamos considerar um cenário onde precisamos implantar um banco de dados Postgres junto com um ConfigMap que contém suas configurações, seguido por uma aplicação que depende desse banco de dados. Utilizaremos Sync Waves para garantir que os recursos sejam aplicados na ordem correta.

Passo 1: ConfigMap para Configurações do Postgres

Primeiro, criamos um ConfigMap com as configurações necessárias para o Postgres. Este ConfigMap deve ser aplicado antes do StatefulSet do Postgres.

apiVersion: v1
kind: ConfigMap
metadata:
  name: postgres-config
  annotations:
    argocd.argoproj.io/sync-wave: "0"
data:
  POSTGRES_DB: database
  POSTGRES_USER: username
  POSTGRES_PASSWORD: password

Passo 2: StatefulSet para o Postgres

Em seguida, definimos o StatefulSet para o Postgres. Este recurso será aplicado após o ConfigMap, garantindo que as configurações estejam disponíveis quando o Postgres for iniciado.

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: postgres
  annotations:
    argocd.argoproj.io/sync-wave: "1"
spec:
  serviceName: "postgres"
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
        - name: postgres
          image: postgres:13
          envFrom:
            - configMapRef:
                name: postgres-config
          ports:
            - containerPort: 5432
          readinessProbe:
            exec:
              command:
                - pg_isready
            initialDelaySeconds: 5
            periodSeconds: 10

Passo 3: Deployment da Aplicação

Finalmente, definimos o Deployment para a aplicação que depende do Postgres. Esta aplicação será implantada somente após o Postgres estar pronto.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
  annotations:
    argocd.argoproj.io/sync-wave: "2"
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
        - name: myapp
          image: myapp:latest
          env:
            - name: DATABASE_URL
              value: postgres://username:password@postgres:5432/database
          ports:
            - containerPort: 8080
          readinessProbe:
            httpGet:
              path: /healthz
              port: 8080
            initialDelaySeconds: 5
            periodSeconds: 10

Benefícios das Sync Waves

Ao utilizar Sync Waves, garantimos que:

  1. As configurações sensíveis e necessárias são aplicadas antes dos recursos que delas dependem.
  2. O banco de dados Postgres está corretamente configurado e operacional antes da aplicação que o utiliza ser implantada.
  3. Há um controle mais refinado sobre a ordem de implantação dos recursos, reduzindo a chance de falhas devido a dependências não resolvidas.

Conclusão