GitOps z ArgoCD: wdrażanie deklaratywne i wdrażanie progresywne
GitOps to paradygmat, który przekształca Git z repozytorium kodu w jedyne źródło prawdy aby sprawdzić stan klastra Kubernetes. Pomysł jest prosty, ale potężny: wszystko jest wdrożone w klastrze muszą być opisane w manifestach YAML w wersji w Git. Agent w klastrze (ArgoCD) obserwuje repozytorium i dba o to, aby rzeczywisty stan klastra był zawsze zbieżny z żądanym stanem w Git. Jeśli ktoś ręcznie zastosuje poprawkę bezpośrednio za pomocą kubectl, ArgoCD wykrywa to i automatycznie anuluje.
W tym artykule zobaczymy, jak skonfigurować ArgoCD od zera, wdrażaj wzór Aplikacja aplikacji deklaratywnie zarządzać dziesiątkami aplikacji, używać Zestaw aplikacji dla wielu klastrów i wielu środowisk oraz integrować Wdrożenia Argo do wdrożenia na Wyspach Kanaryjskich i niebiesko-zielonych bez przestojów.
Czego się nauczysz
- Instalacja i konfiguracja ArgoCD z Helmem
- Utwórz aplikację ArgoCD do wdrożenia zsynchronizowanego z Git
- Wzór aplikacji do zarządzania wieloma aplikacjami
- ApplicationSet: zautomatyzowane wdrażanie w wielu klastrach i środowiskach
- Zasady synchronizacji: automatyczna synchronizacja, samonaprawa, czyszczenie
- Wdrożenia Argo: kanarek z analizą statystyczną, niebiesko-zielony, podział ruchu
- ArgoCD RBAC dla środowisk wielozespołowych
- Powiadomienia Slack/Teams o zdarzeniach wdrożeniowych
Instalacja 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
Pierwsza aplikacja ArgoCD
Una Aplikacja ArgoCD jest głównym zasobem: określa skąd pobierz manifesty (źródło) i miejsce ich wdrożenia (miejsce docelowe):
# 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 repozytorium Git dla GitOps
Struktura repozytorium GitOps ma bezpośredni wpływ na łatwość konserwacji. Najbardziej wzór wspólne i oddziel repozytorium kodu aplikacji od repozytorium 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
Aplikacja wzorca aplikacji
Dzięki App of Apps pojedyncza aplikacja ArgoCD („aplikacja root”) zarządza wszystkim inne aplikacje ArgoCD. Jest to najbardziej skalowalny wzorzec dla klastrów o wielu zastosowaniach:
# 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
Zestaw aplikacji: wiele klastrów i wiele środowisk
Zestaw aplikacji automatycznie generuje wiele aplikacji ArgoCD z jednej szablon. Idealny do wdrażania tej samej aplikacji w wielu klastrach lub środowiskach:
# 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
Wdrożenia Argo: wdrożenie Canary i niebiesko-zielone
Argo Rollouts rozszerza Kubernetes o zaawansowane strategie wdrażania: canary z analityką statystyki, niebiesko-zielony z ręcznym lub automatycznym przełączaniem, podział ruchu za pomocą Istio lub Wejście 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
Wdrożenie Canary z automatyczną analizą
# 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)
)
Zarządzanie wdrażaniem poprzez 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
Powiadomienia ArgoCD dla Slack i 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
Najlepsze praktyki GitOps z ArgoCD
Lista kontrolna GitOps produkcji
- Oddzielne repozytoria dla kodu aplikacji K8 i manifestu: Repozytorium GitOps nie może zawierać kodu aplikacji. Oddziel konfigurację od kodu
- Tag obrazu w repozytorium GitOps (nie „najnowszy”): Aby zapewnić powtarzalność, znacznik obrazu musi należeć do SHA lub konkretnej wersji, a nie „najnowszego”.
- Obowiązkowy przegląd do produkcji: PR do produkcji branżowej wymagają co najmniej jednego zatwierdzenia. ArgoCD nie powinien aplikować automatycznie bez sprawdzenia w prod
- Sekret z sekretami zewnętrznymi Operator: Nigdy nie wyjaśniaj sekretu w repozytorium GitOps. Użyj ESO z Menedżerem sekretów AWS lub Vault
- Samonaprawa w wersji deweloperskiej, instrukcja w wersji prod: Automatyczne samonaprawa jest przydatne w fazie deweloperskiej/stagingowej, ale ryzykowne w prod (może anulować pilne poprawki)
- Użyj Kustomize lub Helm, a nie surowego YAML: Szablony umożliwiają ponowne wykorzystanie nakładek w każdym środowisku, unikając powielania
Wnioski i dalsze kroki
ArgoCD przekształca wdrożenie Kubernetes z ręcznej i ryzykownej operacji w proces zautomatyzowane, kontrolowalne i odwracalne. Połączenie aplikacji do zarządzania tworzy deklaratywne dla całego klastra i Argo Rollouts dla progresywnych wdrożeń Canary rurociąg dostaw, który równoważy szybkość i bezpieczeństwo.
Kolejnym naturalnym krokiem po GitOps jest obserwowalność: bez metryk i rejestrowania nie możesz wiedzieć, czy Twój kanarek odnosi sukcesy, czy też wprowadza regresje. Artykuł 11 z tej serii — Prometheus, Grafana i OpenTelemetry — uzupełnia obraz.
Nadchodzące artykuły z serii Kubernetes at Scale
Powiązane serie
- DevSecOps — GitOps + skanowanie bezpieczeństwa w przygotowaniu
- Inżynieria Platformy — ArgoCD jako składnik IDP
- Terraforma i infrastruktura jako kod — udostępnianie klastrów przed GitOps







