GitOps s ArgoCD: Deklarativní nasazení a progresivní zavádění
GitOps je paradigma, které transformuje Git z úložiště kódu na jediný zdroj pravdy pro stav vašeho clusteru Kubernetes. Myšlenka je jednoduchá, ale účinná: vše je nasazeno v clusteru musí být popsány v manifestech YAML verzovaných v Git. Agent v clusteru (ArgoCD) sleduje úložiště a zajišťuje, že skutečný stav clusteru vždy konverguje s požadovaným stavem v Gitu. Pokud někdo ručně použije opravu hotfix přímo s kubectl, ArgoCD to detekuje a automaticky zruší.
V tomto článku uvidíme, jak nakonfigurovat ArgoCD od nuly, implementovat vzor Aplikace aplikací spravovat desítky aplikací deklarativně, použití Sada aplikací pro více klastrů a více prostředí a integrovat Zavádění Argo pro kanárkové nasazení a modrozelená bez prostojů.
Co se naučíte
- Instalace a konfigurace ArgoCD s Helm
- Vytvořte Application ArgoCD pro nasazení synchronizované s Git
- Vzor Apps pro správu mnoha aplikací
- ApplicationSet: automatizované nasazení ve více clusterech a více prostředích
- Zásady synchronizace: automatická synchronizace, samoléčení, prořezávání
- Argo Rollouts: kanár se statistickou analýzou, modro-zelená, rozdělení provozu
- ArgoCD RBAC pro prostředí s více týmy
- Oznámení Slack/Teams o událostech nasazení
Instalace ArgoCD
# Installa ArgoCD con Helm (raccomandato per produzione)
helm repo add argo https://argoproj.github.io/argo-helm
helm repo update
helm install argocd argo/argo-cd \
--namespace argocd \
--create-namespace \
--version 7.6.0 \
--set global.domain=argocd.company.com \
--set server.ingress.enabled=true \
--set server.ingress.ingressClassName=nginx \
--set configs.params."server.insecure"=true \
--set dex.enabled=false # disabilita se non usi SSO
# Ottieni la password admin iniziale
kubectl -n argocd get secret argocd-initial-admin-secret \
-o jsonpath="{.data.password}" | base64 -d
# Accedi con ArgoCD CLI
argocd login argocd.company.com
argocd account update-password
# Verifica stato
argocd version
kubectl get pods -n argocd
První aplikace ArgoCD
Una Aplikace ArgoCD je hlavním zdrojem: definuje odkud získat manifesty (zdroj) a kam je nasadit (cíl):
# application-api-service.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: api-service-production
namespace: argocd
labels:
team: team-alpha
environment: production
finalizers:
- resources-finalizer.argocd.argoproj.io # elimina risorse K8s quando Application viene eliminata
spec:
project: team-alpha # ArgoCD Project per RBAC
source:
repoURL: https://github.com/company/k8s-manifests
targetRevision: main # branch/tag/commit SHA
path: apps/api-service/production # path nel repo
destination:
server: https://kubernetes.default.svc # cluster locale
namespace: team-alpha-production
syncPolicy:
automated:
prune: true # elimina risorse non piu presenti in Git
selfHeal: true # ripristina modifiche manuali non autorizzate
syncOptions:
- CreateNamespace=true # crea namespace se non esiste
- PrunePropagationPolicy=foreground
- ApplyOutOfSyncOnly=true # applica solo le risorse cambiate
retry:
limit: 5
backoff:
duration: 5s
factor: 2
maxDuration: 3m
# Ignorare alcune differenze (es. annotation aggiunte dal cluster)
ignoreDifferences:
- group: apps
kind: Deployment
jsonPointers:
- /spec/replicas # ignora modifiche manuali al numero di repliche
Struktura úložiště Git pro GitOps
Struktura úložiště GitOps přímo ovlivňuje udržovatelnost. Nejvíce vzor společné a oddělte úložiště kódu aplikace od úložiště manifestu K8:
# Struttura raccomandata del repo k8s-manifests:
k8s-manifests/
├── apps/ # manifest applicazioni
│ ├── api-service/
│ │ ├── base/ # Kustomize base
│ │ │ ├── deployment.yaml
│ │ │ ├── service.yaml
│ │ │ └── kustomization.yaml
│ │ ├── dev/
│ │ │ ├── kustomization.yaml # overlays per dev
│ │ │ └── resources-patch.yaml
│ │ ├── staging/
│ │ │ └── kustomization.yaml
│ │ └── production/
│ │ ├── kustomization.yaml
│ │ └── hpa.yaml
│ └── worker-service/
│ └── ...
├── platform/ # risorse platform (ingress, cert-manager, etc.)
│ ├── ingress-nginx/
│ ├── cert-manager/
│ └── monitoring/
└── argocd/ # App of Apps: Application resources
├── root-app.yaml # App of Apps root
├── team-alpha.yaml
└── platform.yaml
# Kustomize base per api-service
# base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
commonLabels:
app: api-service
managed-by: argocd
# production/kustomization.yaml - overlay con 3 repliche
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
bases:
- ../base
replicas:
- name: api-service
count: 3
images:
- name: company.registry.io/api-service
newTag: "v2.5.1" # aggiornato dalla CI/CD pipeline
patchesStrategicMerge:
- resources-patch.yaml
Vzor aplikace Apps
S aplikací App of Apps vše spravuje jediná aplikace ArgoCD („kořenová aplikace“) další aplikace ArgoCD. Je to nejvíce škálovatelný vzor pro clustery s mnoha aplikacemi:
# argocd/root-app.yaml - la App of Apps root
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: root-app
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/company/k8s-manifests
targetRevision: main
path: argocd/ # questa cartella contiene le Application resources
destination:
server: https://kubernetes.default.svc
namespace: argocd
syncPolicy:
automated:
prune: true
selfHeal: true
---
# argocd/team-alpha.yaml - Application che punta agli overlay di team-alpha
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: team-alpha-production
namespace: argocd
spec:
project: team-alpha
source:
repoURL: https://github.com/company/k8s-manifests
targetRevision: main
path: apps/api-service/production
kustomize:
images:
- company.registry.io/api-service:v2.5.1 # aggiornato dalla CI
destination:
server: https://kubernetes.default.svc
namespace: team-alpha-production
syncPolicy:
automated:
prune: true
selfHeal: true
Sada aplikací: Multi-Cluster a Multi-Environment
Sada aplikací automaticky generuje více ArgoCD aplikací z jedné šablona. Ideální pro nasazení stejné aplikace v mnoha clusterech nebo prostředích:
# applicationset-multi-env.yaml
# Deploy api-service su dev, staging e production dallo stesso template
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: api-service-all-envs
namespace: argocd
spec:
generators:
- list:
elements:
- environment: dev
namespace: team-alpha-dev
replicaCount: "1"
imageTag: "latest"
cluster: in-cluster
- environment: staging
namespace: team-alpha-staging
replicaCount: "2"
imageTag: "v2.5.0"
cluster: in-cluster
- environment: production
namespace: team-alpha-production
replicaCount: "5"
imageTag: "v2.4.9" # production usa tag stabile
cluster: production-cluster
template:
metadata:
name: 'api-service-{{environment}}'
labels:
environment: '{{environment}}'
spec:
project: team-alpha
source:
repoURL: https://github.com/company/k8s-manifests
targetRevision: main
path: 'apps/api-service/{{environment}}'
kustomize:
images:
- 'company.registry.io/api-service:{{imageTag}}'
destination:
server: '{{cluster}}'
namespace: '{{namespace}}'
syncPolicy:
automated:
prune: true
selfHeal: '{{eq environment "production" | not}}' # no selfHeal in prod
Argo Rollouts: Canary Deploy a Blue-Green
Argo Rollouts rozšiřuje Kubernetes o pokročilé strategie nasazení: canary s analytiky statistiky, modro-zelené s ručním nebo automatickým přepínáním, rozdělení provozu s Istio popř Vstup NGINX:
# Installa Argo Rollouts
kubectl create namespace argo-rollouts
kubectl apply -n argo-rollouts \
-f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml
# Installa plugin kubectl
curl -LO https://github.com/argoproj/argo-rollouts/releases/latest/download/kubectl-argo-rollouts-linux-amd64
chmod +x kubectl-argo-rollouts-linux-amd64
sudo mv kubectl-argo-rollouts-linux-amd64 /usr/local/bin/kubectl-argo-rollouts
Canary Deploy s automatickou analýzou
# rollout-canary.yaml
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: api-service
namespace: team-alpha-production
spec:
replicas: 10
selector:
matchLabels:
app: api-service
template:
metadata:
labels:
app: api-service
spec:
containers:
- name: api
image: company.registry.io/api-service:v2.5.1
resources:
requests:
cpu: 250m
memory: 512Mi
limits:
cpu: 500m
memory: 1Gi
strategy:
canary:
# Step 1: 10% traffico alla nuova versione
# Step 2: analisi automatica per 5 minuti
# Step 3: se ok, vai al 30% poi 100%
steps:
- setWeight: 10 # 10% traffico al canary
- analysis: # analisi automatica
templates:
- templateName: success-rate
args:
- name: service-name
value: api-service
- pause: {duration: 5m}
- setWeight: 30
- pause: {duration: 5m}
- setWeight: 100
# Canary Service: il nuovo Service per il traffico canary
canaryService: api-service-canary
stableService: api-service-stable
# Traffic routing con NGINX Ingress
trafficRouting:
nginx:
stableIngress: api-service-ingress
---
# AnalysisTemplate: definisce i criteri di successo
apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata:
name: success-rate
namespace: team-alpha-production
spec:
args:
- name: service-name
metrics:
- name: success-rate
interval: 1m
successCondition: result[0] >= 0.95 # 95% di successo richiesto
failureLimit: 3 # fallisce dopo 3 misurazioni consecutive < 95%
provider:
prometheus:
address: http://prometheus.monitoring.svc:9090
query: |
sum(rate(http_requests_total{service="{{args.service-name}}",status=~"2.."}[5m]))
/
sum(rate(http_requests_total{service="{{args.service-name}}"}[5m]))
- name: latency-p99
interval: 1m
successCondition: result[0] < 0.5 # P99 < 500ms
provider:
prometheus:
address: http://prometheus.monitoring.svc:9090
query: |
histogram_quantile(0.99,
sum(rate(http_request_duration_seconds_bucket{service="{{args.service-name}}"}[5m])) by (le)
)
Správa rolloutu přes CLI
# Visualizza stato del rollout in tempo reale
kubectl argo rollouts get rollout api-service -n team-alpha-production --watch
# Promuovi manualmente al prossimo step (se pause)
kubectl argo rollouts promote api-service -n team-alpha-production
# Rollback immediato se qualcosa va storto
kubectl argo rollouts abort api-service -n team-alpha-production
kubectl argo rollouts undo api-service -n team-alpha-production
# Dashboard UI di Argo Rollouts
kubectl argo rollouts dashboard &
# Apri http://localhost:3100
Upozornění ArgoCD pro Slack a Teams
# argocd-notifications-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-notifications-cm
namespace: argocd
data:
service.slack: |
token: $slack-token
template.app-deployed: |
message: |
:rocket: Application *{{.app.metadata.name}}* deployed to *{{.app.spec.destination.namespace}}*
Image: `{{index .app.status.summary.images 0}}`
Sync: {{.app.status.sync.status}}
template.app-health-degraded: |
message: |
:red_circle: Application *{{.app.metadata.name}}* health degraded!
{{range .app.status.conditions}}{{.message}}{{end}}
trigger.on-deployed: |
- description: Application is synced and healthy
send:
- app-deployed
when: app.status.operationState.phase in ['Succeeded'] and
app.health.status == 'Healthy'
trigger.on-health-degraded: |
- description: Application has degraded
send:
- app-health-degraded
when: app.health.status == 'Degraded'
---
# Applica annotazione sull'Application per ricevere notifiche
kubectl annotate app api-service-production \
notifications.argoproj.io/subscribe.on-deployed.slack="deployments-channel" \
-n argocd
GitOps Best Practices s ArgoCD
Kontrolní seznam produkce GitOps
- Samostatná úložiště pro kód aplikace K8s a manifest: Úložiště GitOps nesmí obsahovat kód aplikace. Oddělte konfiguraci od kódu
- Značka obrázku v úložišti GitOps (nikoli „nejnovější“): Značka obrázku musí být specifická pro SHA nebo verzi, nikoli „nejnovější“ – kvůli reprodukovatelnosti
- Povinná kontrola pro výrobu: PR pro pobočkovou výrobu vyžadují alespoň jedno schválení. ArgoCD by se nemělo automaticky používat bez kontroly v prod
- Tajné s operátorem externích tajemství: Nikdy nevysvětlujte tajemství v repozitáři GitOps. Použijte ESO s AWS Secrets Manager nebo Vault
- Self-heal ve vývoji, manuál ve verzi: Automatické self-heal je užitečné ve vývoji/stagingu, ale riskantní v prod (může zrušit urgentní opravy hotfix)
- Použijte Kustomize nebo Helm, ne raw YAML: Šablony umožňují opakované použití překryvů v jednotlivých prostředích, aby se zabránilo duplicitě
Závěry a další kroky
ArgoCD transformuje nasazení Kubernetes z manuální a riskantní operace na proces automatizované, auditovatelné a reverzibilní. Kombinace App of Apps pro správu deklarativní a Argo Rollouts pro progresivní nasazení kanárků vytváří doručovací potrubí, které vyvažuje rychlost a bezpečnost.
Dalším přirozeným krokem po GitOps je pozorovatelnost: bez metrik a protokolování ne můžete vědět, zda je váš kanárek úspěšný nebo zavádí regrese. Článek 11 z této série — Prometheus, Grafana a OpenTelemetry — doplňuje obrázek.
Připravované články v sérii Kubernetes at Scale
Související série
- DevSecOps — GitOps + bezpečnostní skenování se připravuje
- Platform Engineering — ArgoCD jako součást IDP
- Terraform a infrastruktura jako kód — zřízení clusteru před GitOps







