Argo CD: GitOps, Terraform a Helm pre microservices (Časť 1)
Argo CD: Keď nasadenie novej verzie nemusí byť ruská ruleta
Piatok, 16:30. Kolega pushne novú verziu payment service. CI pipeline prejde. Deployment prebehne. A o 5 minút volá support: "Zákazníci nemôžu platiť."
Poznáte to? Ja áno. A presne preto som si zamiloval Argo CD — nástroj, ktorý premení deployment z adrenalínovej jazdy na nudný, predvídateľný proces. A to je presne to, čo chcete.
Problém: Deployment bez záchrannej siete
Klasický CI/CD pipeline v mnohých tímoch vyzerá takto:
Developer → Push → CI Build → Docker Image → kubectl apply → 🤞 Modlíme saČo sa stane, keď niečo zlyhá?
# Panika mode
kubectl rollout undo deployment/payment-service # Funguje to?
kubectl set image deployment/payment-service ... # Ktorá verzia bola predtým?
ssh production-server "docker run old-image..." # Kto to robí v 2026?!Problémy tohto prístupu:
- ❌ Nikto nevie, aký presný stav bol pred deploymentom
- ❌
kubectl rollout undofunguje len na posledný rollout (čo ak potrebujete ísť 3 verzie späť?) - ❌ Žiadny audit trail — kto, kedy a čo nasadil
- ❌ Manuálne zásahy na klastri = configuration drift
Riešenie: GitOps s Argo CD
Argo CD implementuje štyri princípy GitOps:
Deklaratívna konfigurácia
Git ako single source of truth
Automatická aplikácia
Continuous reconciliation
Ako to funguje v praxi?
┌─────────────┐ ┌──────────────┐ ┌─────────────────┐
│ Developer │────▶│ Git Repo │────▶│ Argo CD │
│ (push) │ │ (manifests) │ │ (controller) │
└─────────────┘ └──────────────┘ └────────┬────────┘
│
▼
┌─────────────────┐
│ Kubernetes │
│ Cluster │
│ │
│ Desired State │
│ = Git State │
└─────────────────┘Argo CD beží vo vašom Kubernetes klastri ako set controllerov. Polluje vaše Git repozitáre (alebo počúva webhooky), porovnáva manifesty s live klastrom a reportuje sync status. Ak sa niečo líši — opraví to.
Terraform: Infraštruktúra pod kontrolou
Pred Argo CD potrebujete infraštruktúru. Terraform sa postará o to, aby váš Kubernetes klaster existoval a Argo CD bolo nainštalované.
Kubernetes klaster + Argo CD cez Terraform
# terraform/main.tf
# 1. Kubernetes klaster (príklad s AWS EKS)
module "eks" {
source = "terraform-aws-modules/eks/aws"
version = "~> 20.0"
cluster_name = "production-cluster"
cluster_version = "1.29"
vpc_id = module.vpc.vpc_id
subnet_ids = module.vpc.private_subnets
eks_managed_node_groups = {
default = {
instance_types = ["t3.large"]
min_size = 2
max_size = 5
desired_size = 3
}
}
}
# 2. Argo CD cez Helm provider
resource "helm_release" "argocd" {
name = "argocd"
repository = "https://argoproj.github.io/argo-helm"
chart = "argo-cd"
version = "7.7.5"
namespace = "argocd"
create_namespace = true
set {
name = "server.service.type"
value = "LoadBalancer"
}
set {
name = "configs.params.server\\.insecure"
value = "false"
}
depends_on = [module.eks]
}
# 3. Registrácia Git repozitára s manifestmi
resource "kubectl_manifest" "argocd_repo" {
yaml_body = <<-YAML
apiVersion: v1
kind: Secret
metadata:
name: platform-repo
namespace: argocd
labels:
argocd.argoproj.io/secret-type: repository
stringData:
url: https://github.com/your-org/k8s-manifests.git
username: argocd-bot
password: ${var.github_token}
YAML
depends_on = [helm_release.argocd]
}Terraform sa stará o infraštruktúru. Argo CD sa stará o aplikácie. Čisté rozdelenie zodpovedností.
Helm: Šablóny pre microservices
Každá microservice má svoj Helm chart. Namiesto kopírovania YAML súborov pre každý servis máte jednu šablónu s rôznymi hodnotami.
Univerzálny Helm chart pre microservice
# helm/microservice/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Values.name }}
labels:
app: {{ .Values.name }}
version: {{ .Values.image.tag }}
spec:
replicas: {{ .Values.replicas | default 2 }}
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0 # Nikdy nestratiť kapacitu
maxSurge: 1 # Maximálne 1 extra pod
selector:
matchLabels:
app: {{ .Values.name }}
template:
metadata:
labels:
app: {{ .Values.name }}
version: {{ .Values.image.tag }}
spec:
containers:
- name: {{ .Values.name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
ports:
- containerPort: {{ .Values.port | default 8080 }}
readinessProbe:
httpGet:
path: {{ .Values.healthCheck | default "/health" }}
port: {{ .Values.port | default 8080 }}
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
httpGet:
path: {{ .Values.healthCheck | default "/health" }}
port: {{ .Values.port | default 8080 }}
initialDelaySeconds: 15
periodSeconds: 20
resources:
requests:
cpu: {{ .Values.resources.requests.cpu }}
memory: {{ .Values.resources.requests.memory }}
limits:
cpu: {{ .Values.resources.limits.cpu }}
memory: {{ .Values.resources.limits.memory }}Values pre konkrétnu microservice
# environments/production/payment-service.yaml
name: payment-service
replicas: 3
image:
repository: registry.your-org.com/payment-service
tag: "2.4.1" # ← TOTO sa mení pri release
port: 8080
healthCheck: /actuator/health
resources:
requests:
cpu: "500m"
memory: "512Mi"
limits:
cpu: "1000m"
memory: "1Gi"V ďalšej časti sa pozrieme na to, ako Argo CD Application spojí všetko dohromady, ako funguje rollback v praxi a ako spravovať 20+ microservices s App of Apps patternom.