Obsah článku / Contents
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á?

bash
# 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 undo funguje 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:

1

Deklaratívna konfigurácia

— celý stav systému žije v Gite ako YAML
2

Git ako single source of truth

— každá zmena má autora, timestamp a commit message
3

Automatická aplikácia

— schválené zmeny sa nasadia bez manuálneho zásahu
4

Continuous reconciliation

— controller deteguje drift a opravuje ho

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

hcl
# 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

yaml
# 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

yaml
# 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.

Všetky články