Cheveo Cheatsheet

ArgoCD OutOfSync Cheatsheet

12 Patterns zum Copy-Pasten. Von Diagnose-Workflow über ignoreDifferences bis Server-Side Diff, inkl. häufige Fehler und Schnell-Entscheidungen.

Blog-Artikel lesen →

Der Workflow

1 Diff
2 Status
3 Logs
4 Fix
5 Verify

Diagnose-Workflow

1

App Diff anzeigen

argocd app diff <app-name>

→ Zeigt exakt welche Felder zwischen Git und Cluster abweichen.

2

App-Status prüfen

argocd app get <app-name>

→ Gesamt-Status: Sync, Health, letzte Operation, betroffene Ressourcen.

3

Controller-Logs prüfen

kubectl logs -n argocd -l app.kubernetes.io/name=argocd-application-controller --tail=50

→ Sync-Fehler, RBAC-Probleme und Timeouts die in der UI nicht sichtbar sind.

ignoreDifferences

4

Server-Side Defaults ignorieren

spec:
  ignoreDifferences:
    - group: apps
      kind: Deployment
      jsonPointers:
        - /spec/template/spec/dnsPolicy
        - /spec/template/spec/schedulerName
        - /spec/revisionHistoryLimit

→ Kubernetes-Defaults die der API-Server automatisch setzt.

5

Mutating Webhooks ignorieren (Istio)

spec:
  ignoreDifferences:
    - group: apps
      kind: Deployment
      jqPathExpressions:
        - .spec.template.metadata.annotations."sidecar.istio.io/status"
        - .spec.template.spec.initContainers[] | select(.name == "istio-init")
        - .spec.template.spec.containers[] | select(.name == "istio-proxy")

→ Injizierte Sidecar-Container und Annotations ignorieren.

6

Global ignoreDifferences (Cluster-weit)

# argocd-cm ConfigMap
resource.customizations.ignoreDifferences.apps_Deployment: |
  jsonPointers:
    - /spec/template/spec/dnsPolicy
    - /spec/template/spec/schedulerName

→ Ab ArgoCD 2.5+: einmal konfigurieren, gilt für alle Applications.

Sync-Probleme lösen

7

Immutable Fields (Replace-Sync)

metadata:
  annotations:
    argocd.argoproj.io/sync-options: Replace=true

→ Für Felder die nach Erstellung nicht änderbar sind (selector, clusterIP).

8

Namespace mit Sync Wave

apiVersion: v1
kind: Namespace
metadata:
  name: my-app
  annotations:
    argocd.argoproj.io/sync-wave: "-1"

→ Namespace vor den anderen Ressourcen erstellen lassen.

9

Finalizer entfernen

kubectl patch <resource> <name> --type merge -p '{"metadata":{"finalizers":null}}'

→ Wenn eine Ressource in Terminating hängt und den Sync blockiert.

Server-Side Diff & Cache

10

Server-Side Diff aktivieren

# argocd-cm ConfigMap
controller.diff.server.side: "true"

→ Nuklear-Option: 80% weniger Phantom-Diffs. Braucht PATCH-Rechte.

11

Soft Refresh

argocd app get <app-name> --refresh

→ Re-Compare ohne Cache-Invalidierung.

12

Hard Refresh + Repo-Server Restart

argocd app get <app-name> --hard-refresh
# Falls Problem persistiert:
kubectl rollout restart deployment argocd-repo-server -n argocd

→ Cache komplett invalidieren. Letzte Option bei Stale-Cache-Problemen.

5 häufigste Fehler

Jeder davon hat uns in Production schon mindestens einmal Stunden gekostet.

1

ignoreDifferences vergessen

Server-Side Defaults erzeugen Phantom-Diffs → Sync-Loop

2

helm template statt helm install

ArgoCD nutzt Client-Side Rendering: lookup und .Capabilities fehlen

3

Namespace nicht im Manifest

ArgoCD erstellt Namespaces nicht automatisch

4

Auto-Sync ohne ignoreDifferences

Ständiger Re-Sync durch Webhooks oder Defaults

5

Stale Cache nicht erkannt

Hard-Refresh löst Problem temporär, Cache veraltet wieder

Schnelle Entscheidungen

Nur Default-Felder im Diff
→ ignoreDifferences (Pattern 4-6)
field is immutable
→ Replace-Sync (Pattern 7)
namespace not found
→ Sync Wave (Pattern 8)
Sync-Loop alle 3 Min.
→ Server-Side Diff (Pattern 10)
ComparisonError
→ Repo-Credentials prüfen
2-Tage Hands-on Workshop

GitOps mit ArgoCD - vom Push zum Production-Deploy

Vom App-of-Apps Pattern bis Progressive Delivery: alles, was Sie für GitOps in der Produktion brauchen.

Workshop-Details ansehen