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.
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.
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.
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
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
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
Ao utilizar Sync Waves, garantimos que: