Veröffentlicht am

ArgoCD Enterprise: App-of-Apps, RBAC und SSO

Teilen:
Authors

TL;DR

  • ArgoCD synchronisiert den gewünschten Zustand aus Git mit dem tatsächlichen Cluster-Zustand -- vollautomatisch und auditierbar
  • Das App-of-Apps-Pattern ist der beste Einstiegspunkt fuer Enterprise-Setups mit vielen Microservices
  • Multi-Repo schlaegt Mono-Repo, sobald mehrere Teams unabhaengig deployen muessen
  • RBAC ueber ArgoCD-Projects und SSO-Integration (OIDC/SAML) sind Pflicht fuer den Produktivbetrieb
  • Kustomize fuer einfache Umgebungs-Overrides, Helm fuer komplexe Third-Party-Charts -- beides laesst sich kombinieren

Warum GitOps mit ArgoCD?

GitOps verlagert die Wahrheit ueber den Cluster-Zustand in ein Git-Repository. ArgoCD ueberwacht dieses Repository und gleicht Abweichungen automatisch ab. Dadurch entfallen manuelle kubectl apply-Aktionen, und jede Aenderung ist ueber Git-History nachvollziehbar.

Gegenueber Flux bietet ArgoCD eine ausgereifte Web-UI, feingranulares RBAC ueber Projects und native Multi-Cluster-Unterstuetzung. Fuer Unternehmen, die Wert auf Sichtbarkeit und Zugriffskontrolle legen, ist das oft entscheidend.

Architekturentscheidung: Mono-Repo vs. Multi-Repo

KriteriumMono-RepoMulti-Repo
Team-AutonomieGering -- alle Teams arbeiten im selben RepoHoch -- jedes Team verwaltet eigene Manifests
ZugriffssteuerungUeber CODEOWNERS/Branch-ProtectionNatuerliche Trennung ueber Repo-Permissions
CI/CD-KomplexitaetEinfacher Start, skaliert schlechtMehr Setup, skaliert besser
Blast RadiusEin fehlerhafter Merge betrifft potenziell allesIsoliert auf das jeweilige Repo
EmpfehlungKleine Teams (unter 5 Devs, unter 10 Services)Ab 3+ Teams oder 15+ Services

Praxis-Empfehlung: Starten Sie mit einem dedizierten Infrastruktur-Repo (Cluster-weite Ressourcen wie Namespaces, RBAC, Monitoring) und separaten App-Repos pro Team.

Beispiel-Verzeichnisstruktur (Multi-Repo)

# Repo: infra-gitops
├── argocd/
│   ├── projects/         # ArgoCD AppProjects
│   ├── apps/             # App-of-Apps Definitionen
│   └── root-app.yaml     # Bootstrap-Application
├── cluster-config/
│   ├── namespaces/
│   ├── rbac/
│   └── network-policies/
└── monitoring/
    ├── prometheus/
    └── grafana/

# Repo: team-a-apps
├── base/
│   ├── deployment.yaml
│   ├── service.yaml
│   └── kustomization.yaml
└── overlays/
    ├── dev/
    │   └── kustomization.yaml
    ├── staging/
    │   └── kustomization.yaml
    └── prod/
        └── kustomization.yaml

ArgoCD installieren

Fuer den Produktivbetrieb empfiehlt sich die HA-Installation:

# Namespace anlegen
kubectl create namespace argocd

# HA-Installation (empfohlen fuer Produktion)
kubectl apply -n argocd \
  -f https://raw.githubusercontent.com/argoproj/argo-cd/v2.13.3/manifests/ha/install.yaml

# CLI installieren (macOS)
brew install argocd

# Initiales Admin-Passwort auslesen
argocd admin initial-password -n argocd

# Sofort aendern
argocd login argocd-server.argocd.svc.cluster.local
argocd account update-password

Nach der Installation sollte das initiale Admin-Passwort sofort geaendert und die Secret-basierte Authentifizierung durch SSO ersetzt werden.

Das App-of-Apps-Pattern

Das zentrale Pattern fuer Enterprise-ArgoCD: Eine Root-Application verwaltet alle anderen Applications. Aenderungen an der Anwendungslandschaft werden so ebenfalls ueber Git gesteuert.

Root Application

# argocd/root-app.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: root-app
  namespace: argocd
  finalizers:
    - resources-finalizer.argocd.argoproj.io
spec:
  project: default
  source:
    repoURL: https://github.com/mein-unternehmen/infra-gitops.git
    targetRevision: main
    path: argocd/apps
  destination:
    server: https://kubernetes.default.svc
    namespace: argocd
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

Einzelne Application-Definition

# argocd/apps/team-a-api.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: team-a-api
  namespace: argocd
  labels:
    team: team-a
    env: production
spec:
  project: team-a
  source:
    repoURL: https://github.com/mein-unternehmen/team-a-apps.git
    targetRevision: main
    path: overlays/prod
  destination:
    server: https://kubernetes.default.svc
    namespace: team-a-prod
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true
    retry:
      limit: 3
      backoff:
        duration: 5s
        factor: 2
        maxDuration: 3m

RBAC mit ArgoCD Projects

ArgoCD Projects definieren, welche Teams auf welche Repositories, Cluster und Namespaces zugreifen duerfen. Das ist unabhaengig von Kubernetes-RBAC und eine zusaetzliche Schutzschicht.

# argocd/projects/team-a.yaml
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: team-a
  namespace: argocd
spec:
  description: "Projekt fuer Team A - Payment Service"
  sourceRepos:
    - 'https://github.com/mein-unternehmen/team-a-apps.git'
  destinations:
    - namespace: 'team-a-*'
      server: https://kubernetes.default.svc
  # Cluster-weite Ressourcen verbieten
  clusterResourceWhitelist: []
  # Nur bestimmte Namespace-Ressourcen erlauben
  namespaceResourceWhitelist:
    - group: 'apps'
      kind: 'Deployment'
    - group: ''
      kind: 'Service'
    - group: ''
      kind: 'ConfigMap'
    - group: 'networking.k8s.io'
      kind: 'Ingress'
  roles:
    - name: team-a-dev
      description: "Entwickler Team A"
      policies:
        - p, proj:team-a:team-a-dev, applications, get, team-a/*, allow
        - p, proj:team-a:team-a-dev, applications, sync, team-a/*, allow
      groups:
        - team-a-developers
    - name: team-a-admin
      description: "Admin Team A"
      policies:
        - p, proj:team-a:team-a-admin, applications, *, team-a/*, allow
      groups:
        - team-a-leads

SSO-Integration (OIDC)

Fuer Unternehmen ist SSO ueber den vorhandenen Identity Provider Pflicht. ArgoCD unterstuetzt OIDC, SAML und Dex als Vermittler.

# argocd-cm ConfigMap (Auszug)
apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-cm
  namespace: argocd
data:
  url: https://argocd.mein-unternehmen.de
  oidc.config: |
    name: Keycloak
    issuer: https://keycloak.mein-unternehmen.de/realms/infra
    clientID: argocd
    clientSecret: $oidc.keycloak.clientSecret
    requestedScopes:
      - openid
      - profile
      - email
      - groups

Die Gruppen aus dem Identity Provider werden dann in den ArgoCD-Project-Roles referenziert (siehe groups im Beispiel oben).

Kustomize und Helm kombinieren

ArgoCD unterstuetzt beide Tools nativ. Eine bewaehlte Strategie: Kustomize fuer eigene Anwendungen, Helm fuer Third-Party-Software.

Kustomize-Overlay fuer verschiedene Umgebungen

# overlays/prod/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: team-a-prod

resources:
  - ../../base

replicas:
  - name: api-server
    count: 3

patches:
  - target:
      kind: Deployment
      name: api-server
    patch: |
      - op: replace
        path: /spec/template/spec/containers/0/resources/requests/memory
        value: "512Mi"
      - op: replace
        path: /spec/template/spec/containers/0/resources/limits/memory
        value: "1Gi"

images:
  - name: api-server
    newTag: v2.4.1

Helm-Chart ueber ArgoCD deployen

# argocd/apps/prometheus.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: prometheus-stack
  namespace: argocd
spec:
  project: infra
  source:
    repoURL: https://prometheus-community.github.io/helm-charts
    chart: kube-prometheus-stack
    targetRevision: 65.8.1
    helm:
      releaseName: monitoring
      valuesObject:
        prometheus:
          retention: 30d
          storageSpec:
            volumeClaimTemplate:
              spec:
                storageClassName: gp3
                resources:
                  requests:
                    storage: 100Gi
        grafana:
          adminPassword: vault:secret/grafana#admin-password
  destination:
    server: https://kubernetes.default.svc
    namespace: monitoring
  syncPolicy:
    automated:
      selfHeal: true
    syncOptions:
      - CreateNamespace=true
      - ServerSideApply=true

Sync-Strategien und Waves

Fuer komplexe Deployments koennen Sie mit Sync-Waves die Reihenfolge steuern:

# Namespace zuerst (Wave -1)
apiVersion: v1
kind: Namespace
metadata:
  name: team-a-prod
  annotations:
    argocd.argoproj.io/sync-wave: "-1"

---
# Secrets vor dem Deployment (Wave 0)
apiVersion: v1
kind: Secret
metadata:
  name: db-credentials
  namespace: team-a-prod
  annotations:
    argocd.argoproj.io/sync-wave: "0"
type: Opaque
data:
  password: base64-encoded-value

---
# Deployment zuletzt (Wave 1)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-server
  namespace: team-a-prod
  annotations:
    argocd.argoproj.io/sync-wave: "1"
spec:
  # ...

Notifications einrichten

ArgoCD Notifications informiert Teams ueber Sync-Status per Slack, Teams oder E-Mail:

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-notifications-cm
  namespace: argocd
data:
  trigger.on-sync-failed: |
    - when: app.status.operationState.phase in ['Error', 'Failed']
      send: [slack-alert]
  template.slack-alert: |
    message: |
      App {{.app.metadata.name}} sync fehlgeschlagen!
      Status: {{.app.status.operationState.phase}}
      Revision: {{.app.status.sync.revision}}
  service.slack: |
    token: $slack-token
    channel: platform-alerts

Secrets-Management

ArgoCD selbst sollte keine Secrets im Klartext aus Git lesen. Gaengige Loesungen:

ToolAnsatzKomplexitaet
Sealed SecretsVerschluesselt im Git, Controller entschluesselt im ClusterNiedrig
External Secrets OperatorReferenz auf AWS SM / Azure KV / VaultMittel
SOPS + Age/KMSVerschluesselte YAML-Dateien direkt im RepoMittel
Vault mit ArgoCD Vault PluginInline-Referenzen in ManifestsHoch

Fuer die meisten Setups ist der External Secrets Operator der beste Kompromiss aus Sicherheit und Bedienbarkeit. Mehr dazu in unserem Artikel zu Kubernetes Secrets Management.

Monitoring der ArgoCD-Instanz

ArgoCD exponiert Prometheus-Metriken auf Port 8083. Wichtige Metriken:

# ServiceMonitor fuer ArgoCD
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: argocd-metrics
  namespace: argocd
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: argocd-server
  endpoints:
    - port: metrics
      interval: 30s

Kritische Alerts, die Sie einrichten sollten:

  • argocd_app_info{sync_status="OutOfSync"} -- Anwendung weicht vom Git-Zustand ab
  • argocd_app_info{health_status="Degraded"} -- Anwendung ist nicht gesund
  • argocd_app_sync_total{phase="Error"} -- Sync-Fehler zaehlen

Weiterfuehrend: Kubernetes Monitoring und Observability

Typische Fehler bei der Einfuehrung

  1. Zu frueh automated sync aktivieren -- Starten Sie mit manuellem Sync, bis das Team Vertrauen in den Prozess hat
  2. Kein AppProject-RBAC -- Ohne Projects kann jede Application auf jeden Namespace zugreifen
  3. Secrets im Git-Repo -- Auch in privaten Repos gehoeren Secrets nicht als Klartext hinein
  4. Zu grosse Applications -- Eine Application pro Microservice, nicht eine fuer den gesamten Stack
  5. Fehlende Health Checks -- ArgoCD kann nur korrekt synchronisieren, wenn Deployments Readiness-/Liveness-Probes haben

Rollout-Plan fuer die Einfuehrung

PhaseDauerZiel
PoC1-2 WochenArgoCD auf Dev-Cluster, ein Team, ein Service
Pilot2-4 Wochen2-3 Teams, Staging-Umgebung, SSO + RBAC
Rollout4-8 WochenAlle Teams, Produktion, Monitoring + Alerting
OptimierungLaufendApplicationSets, Image Updater, Multi-Cluster

Weiterführende Ressourcen


Sie planen die Einfuehrung von GitOps mit ArgoCD? Wir unterstuetzen Sie von der Architekturplanung ueber die Implementierung bis zum Betrieb. Sprechen Sie uns an -- als erfahrene Kubernetes-Berater kennen wir die typischen Stolpersteine und helfen Ihnen, sie zu vermeiden.

Kubernetes-Beratung gesucht?

Wir helfen deutschen Unternehmen bei der Kubernetes-Implementierung, Migration und Optimierung. DSGVO-konform und praxiserprobt.

📖 Verwandte Artikel

Weitere interessante Beiträge zu ähnlichen Themen