Maintenance und Upgrades

Maintenance und Upgrades

Die regelmäßige Wartung der ayedo Software Delivery Plattform ist essentiell für Sicherheit, Stabilität und Compliance. Dieses Dokument beschreibt die operativen Verfahren für Patching, Updates und Upgrades.

Überblick

Die ayedo SDP und darauf laufende Software unterscheiden fünf Wartungszüge. Die Züge nicht in einem Schritt mischen.

  1. OS-Patching: Sicherheits-Updates der Node-Betriebssysteme
  2. Platform-Primitives: CNI, Ingress, Cert-Manager, Policy — nur mit Cluster-Owner
  3. Platform Stack / Dependencies: Harbor, Datenbanken, Observability, Velero
  4. Kubernetes-Upgrades: Kubernetes-Version-Updates
  5. Anwendungsrelease: die Fachanwendung (eigener Tag, eigener Rollback)

Wer Software auf einem bereitgestellten Cluster ausliefert, besitzt Zug 5 und oft Zug 3 — nicht automatisch Zug 1 und 4. Air-Gap: Air-Gap-Auslieferung.

Compliance-Anforderungen

Viele Regulierungen erfordern regelmäßige Security-Patches und System-Updates:

Norm Control Anforderung
ISO 27001 Annex A 12.6.1 Management of Technical Vulnerabilities
ISO 27001 Annex A 8.19 Change Management
BSI IT-Grundschutz APP.4.4.A21 Regelmäßige Updates von K8s und Workloads
GDPR Art. 32 Availability and Resilience
NIS2 Requirement (d) Business Continuity Management

Voraussetzungen

Bevor Sie Wartungsarbeiten durchführen:

Wartungsebenen

1. OS-Patching der Nodes

Häufigkeit: Wöchentlich (automatisch) oder monatlich (manuell)

Beschreibung: Security-Patches für Ubuntu/CentOS/RHEL auf Kubernetes-Nodes

Automatisches Patching

Empfohlene Methode via Unattended Upgrades (Ubuntu):

# Auf allen Nodes
sudo apt install unattended-upgrades
sudo dpkg-reconfigure --priority=low unattended-upgrades

Konfiguration in /etc/apt/apt.conf.d/50unattended-upgrades:

Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}-security";
};
Unattended-Upgrade::Automatic-Reboot "false";
- **Foundation / On-Prem (`k8s-1.27`)**: Manuelle Reboots im Wartungsfenster oder `polycrate run k8s restart-k3s`
- **Worker an k3s-server**: wie Foundation — Drain/Reboot der Agent-Hosts; die Controlplane ist ein Pod (Recreate)

Node-Reboots On-Premises

Für On-Premises-Deployments werden Node-Reboots manuell während Wartungsfenstern durchgeführt:

# Node cordon (keine neuen Pods schedulen)
kubectl cordon <node-name>

# Pods evakuieren
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data

# Node rebooten
ssh <node> sudo reboot

# Warten bis Node ready
kubectl wait --for=condition=ready node/<node-name> --timeout=300s

# Node uncordon
kubectl uncordon <node-name>

# Warten bis Pods neu gescheduled sind
kubectl get pods -A --field-selector spec.nodeName=<node-name>

Node-Reboots (Worker / Foundation)

OS-Updates auf Linux-Hosts (Foundation oder Worker, die an eine k3s-server-CP gejoint sind) koordiniert ihr: Cordon → Drain → Reboot → Uncordon, oder polycrate run k8s restart-k3s auf dem k8s-1.27-Block.

Die Controlplane selbst (k3s-server) ist ein Deployment mit Recreate — kein Node-Reboot, sondern Pod-Rollout (polycrate run k3s-server install / Status).

Monitoring:

# Node-Status überwachen
kubectl get nodes -o wide

# Node-Events prüfen
kubectl get events --field-selector involvedObject.kind=Node

2. Platform Stack Upgrades

Häufigkeit: Quartalsweise oder bei kritischen Security-Fixes

Beschreibung: Updates der ayedo-Komponenten (Grafana, VictoriaMetrics, Harbor, etc.)

Pre-Upgrade Checklist

  • [ ] Benutzer benachrichtigen (z.B. via Slack, E-Mail)
  • [ ] Changelog prüfen: Neue Features, Breaking Changes, Migration-Guides
  • [ ] Staging-Upgrade durchführen (falls Staging-Environment vorhanden)
  • [ ] Backup erstellen:
    # Velero-Backup
    velero backup create pre-upgrade-$(date +%Y%m%d) --wait
    
    # Backup-Status prüfen
    velero backup describe pre-upgrade-$(date +%Y%m%d)
    
  • [ ] System-Status prüfen:
    # Alle Pods healthy?
    kubectl get pods -A | grep -vE "Running|Completed"
    
    # Nodes ready?
    kubectl get nodes
    
    # Persistent Volumes bound?
    kubectl get pv,pvc -A
    
    # Recent alerts?
    kubectl get prometheusrules -A
    
  • [ ] Alerting pausieren (Grafana Alerting Silences):
    # Via Grafana Alerting UI oder API
    curl -X POST https://alertmanager.example.com/api/v2/silences \
      -d '{"matchers":[{"name":"alertname","value":".*","isRegex":true}],"startsAt":"2025-01-15T10:00:00Z","endsAt":"2025-01-15T12:00:00Z","createdBy":"admin","comment":"Platform Upgrade"}'
    

Upgrade-Prozedur

Schritt-für-Schritt:

  1. Block-Versionen aktualisieren

Bearbeiten Sie die workspace.poly und aktualisieren Sie die gewünschten Block-Versionen:

# workspace.poly
blocks:
  # Beispiel: Grafana upgraden von 11.3.0 auf 11.4.0
  - name: grafana
    from: cargo.ayedo.cloud/ayedo/k8s/grafana:11.4.0  # <- Version aktualisiert
    kubeconfig:
      from: my-cluster

  # Beispiel: VictoriaMetrics upgraden
  - name: victoria-metrics
    from: cargo.ayedo.cloud/ayedo/k8s/victoriametrics:1.106.0  # <- Version aktualisiert
    kubeconfig:
      from: my-cluster

  # Source Control & CI/CD
  - name: gitlab
    from: cargo.ayedo.cloud/ayedo/k8s/gitlab:17.7.0  # <- Version aktualisiert
    kubeconfig:
      from: my-cluster

  # Application Delivery
  - name: argocd
    from: cargo.ayedo.cloud/ayedo/k8s/argocd:2.13.0  # <- Version aktualisiert
    kubeconfig:
      from: my-cluster

  # Secrets Management
  - name: vault
    from: cargo.ayedo.cloud/ayedo/k8s/openbao:1.18.0  # <- Version aktualisiert
    kubeconfig:
      from: my-cluster

  # Andere Blöcke bleiben auf aktueller Version
  - name: harbor
    from: cargo.ayedo.cloud/ayedo/k8s/harbor:2.11.0  # <- Keine Änderung
    kubeconfig:
      from: my-cluster

!!! tip "Modulare Upgrades" Sie müssen nicht alle Komponenten gleichzeitig upgraden. Die SDP ist so konzipiert, dass Komponenten in unterschiedlichen Versionen miteinander funktionieren können. Dies ermöglicht schrittweise, kontrollierte Upgrade-Pfade.

!!! warning "Kritische Komponenten" Bei Upgrades von GitLab, Argo CD und OpenBao sollten Sie besonders vorsichtig sein, da diese Komponenten zentral für die Entwickler-Workflows sind. Führen Sie Upgrades dieser Komponenten vorzugsweise außerhalb der Geschäftszeiten durch.

  1. Block-Versionen pullen

    cd ayedo-platform-workspace
    
    # Neue Block-Versionen herunterladen
    polycrate blocks pull
    

  2. Migration-Guides prüfen

Prüfen Sie die Block-spezifischen Changelogs und Breaking Changes:

# Beispiel: Grafana Changelog prüfen
cat ~/.polycrate/blocks/cargo.ayedo.cloud/ayedo/k8s/grafana/11.4.0/CHANGELOG.md
  1. Upgrade durchführen

    # Dry-run (zeigt geplante Änderungen)
    polycrate workflows run upgrade --dry-run
    
    # Upgrade ausführen
    polycrate workflows run upgrade
    

  2. Upgrade-Validierung

    # Alle Pods healthy?
    kubectl get pods -A | grep -vE "Running|Completed"
    
    # Neue Versionen deployed?
    kubectl get deployments -A -o custom-columns=NAME:.metadata.name,IMAGE:.spec.template.spec.containers[0].image
    
    # Services erreichbar?
    curl -I https://grafana.example.com
    curl -I https://harbor.example.com
    curl -I https://gitlab.example.com
    curl -I https://argocd.example.com
    curl -I https://vault.example.com
    
    # GitLab-Spezifische Validierung
    kubectl exec -n gitlab gitlab-toolbox-<pod> -- gitlab-rake gitlab:check SANITIZE=true
    
    # ArgoCD-Spezifische Validierung
    kubectl get applications -n argocd
    argocd app list
    
    # OpenBao-spezifische Validierung
    kubectl exec -n vault vault-0 -- vault status
    

Post-Upgrade Checklist

  • [ ] System-Status prüfen:
    kubectl get pods,nodes,pvc -A
    
  • [ ] Logins testen:
  • Grafana: https://grafana.example.com
  • Harbor: https://harbor.example.com
  • [ ] Monitoring prüfen:
  • Metriken werden gesammelt
  • Logs werden aggregiert
  • Alerts funktionieren
  • [ ] Alerting reaktivieren (Silences löschen)
  • [ ] Benutzer benachrichtigen (Upgrade abgeschlossen)
  • [ ] Incident dokumentieren (falls Issues auftraten)

3. Kubernetes-Upgrades

Häufigkeit: Halbjährlich oder bei kritischen Kubernetes-CVEs

Beschreibung: Kubernetes Control-Plane und Worker-Nodes upgraden

Kubernetes-Upgrade-Strategie

Kubernetes-Support-Window:

Kubernetes unterstützt die letzten 3 Minor-Versionen:

Version Release End-of-Life
1.29 Dez 2023 Feb 2025
1.28 Aug 2023 Okt 2024
1.27 Apr 2023 Jun 2024

Pre-Upgrade Checklist

  • [ ] Deprecated APIs identifizieren:
    # Kubernetes API-Versionen prüfen
    kubectl api-resources --verbs=list -o wide
    
    # Deprecated APIs in Cluster finden
    kubectl get all -A -o json | jq -r '.items[] | select(.apiVersion | contains("v1beta")) | "\(.kind)/\(.metadata.name) in \(.metadata.namespace) uses \(.apiVersion)"'
    
  • [ ] Anwendungsentwickler benachrichtigen (4 Wochen Vorlauf)
  • [ ] Staging-Cluster upgraden (falls vorhanden)
  • [ ] Backup erstellen:
    velero backup create pre-k8s-upgrade-$(date +%Y%m%d) --wait
    

Upgrade-Prozedur

Methode 1: Managed Kubernetes (EKS, AKS, GKE)

# AWS EKS
aws eks update-cluster-version --name ayedo-cluster --kubernetes-version 1.29

# Azure AKS
az aks upgrade --resource-group ayedo-rg --name ayedo-cluster --kubernetes-version 1.29.0

# Google GKE
gcloud container clusters upgrade ayedo-cluster --cluster-version=1.29

Methode 2: Self-Managed (kubeadm, Polycrate)

# Control-Plane upgraden
sudo kubeadm upgrade plan
sudo kubeadm upgrade apply v1.29.0

# Kubelet/kubectl upgraden
sudo apt-mark unhold kubelet kubectl
sudo apt-get update && sudo apt-get install -y kubelet=1.29.0-* kubectl=1.29.0-*
sudo apt-mark hold kubelet kubectl
sudo systemctl daemon-reload
sudo systemctl restart kubelet

# Worker-Nodes upgraden (einer nach dem anderen)
kubectl drain <node> --ignore-daemonsets --delete-emptydir-data
# ... upgrade kubelet auf Node ...
kubectl uncordon <node>

Post-Upgrade Validierung

# Kubernetes-Version prüfen
kubectl version

# Nodes ready?
kubectl get nodes -o wide

# Control-Plane healthy?
kubectl get componentstatuses

# Deprecated APIs noch in Nutzung?
kubectl get all -A -o json | jq -r '.items[] | select(.apiVersion | contains("v1beta")) | "\(.kind)/\(.metadata.name) in \(.metadata.namespace) uses \(.apiVersion)"'

Rollback-Strategie

- **Staged Rollouts**: Staging → Production
- **Rollforward**: Bei Issues in Production den Fix deployen, nicht zurückrollen
- **Snapshots nutzen**: Nur als letztes Mittel

Warum keine Rollbacks?

  • Stateful Applications (Datenbanken) können inkonsistent werden
  • Schema-Migrationen sind oft nicht rückgängig machbar
  • Risiko von Datenverlust und Korruption

Maintenance Windows

Empfohlene Wartungsfenster

Wartungstyp Häufigkeit Dauer Downtime
OS-Patching Wöchentlich 1-2h Keine (rolling)
Platform-Upgrade Quartalsweise 2-4h < 5 Min
K8s-Upgrade Halbjährlich 4-8h < 15 Min

Kommunikation

4 Wochen vorher: - Ankündigung per E-Mail/Slack - Deprecated APIs kommunizieren - Breaking Changes erläutern

1 Woche vorher: - Erinnerung per E-Mail/Slack - Maintenance-Window bestätigen

24 Stunden vorher: - Letzte Erinnerung - Status-Page aktualisieren

Während Wartung: - Live-Updates via Slack - Status-Page: "Maintenance in Progress"

Nach Wartung: - Abschluss-Benachrichtigung - Issue-Report (falls notwendig)

Automatisierung

Empfohlene Tools

Tool Zweck Einsatz
k8s-1.27 / Worker-Hosts Node-Lifecycle (Cordon/Drain/Reboot) OS-Patching, restart-k3s
Polycrate Deklarative Infra-Deployments Platform-Upgrades, SDP-Deployments
Velero Backup/Restore Disaster Recovery

Monitoring und Alerting

Pre-Upgrade Checks

# Prometheus-Alerts prüfen
kubectl get prometheusrules -A

# Alert-Status abrufen
curl https://alertmanager.example.com/api/v2/alerts

# Grafana-Dashboards überprüfen
curl -H "Authorization: Bearer $GRAFANA_TOKEN" \
  https://grafana.example.com/api/health

Post-Upgrade Monitoring

Key-Metriken überwachen:

  • Pod Restart Rate: Keine abnormalen Restarts
  • API-Server Latency: < 100ms
  • etcd Latency: < 10ms
  • Node CPU/Memory: Keine Spikes
  • Persistent Volume Claims: Alle Bound

Troubleshooting

Problem: Upgrade schlägt fehl

Symptom: Pods crashen nach Upgrade.

Lösung:

  1. Rollback zum letzten Backup:

    velero restore create --from-backup pre-upgrade-20250115
    

  2. Logs analysieren:

    kubectl logs -n <namespace> <pod> --previous
    

  3. Events prüfen:

    kubectl get events -A --sort-by='.lastTimestamp'
    

Problem: Node bleibt nach Reboot NotReady

Symptom: Node kommt nach Reboot nicht zurück.

Lösung:

  1. SSH auf Node und Logs prüfen:

    ssh <node>
    sudo journalctl -u kubelet -f
    

  2. Kubelet neu starten:

    sudo systemctl restart kubelet
    

  3. Node-Status prüfen:

    kubectl describe node <node>
    

Problem: Deprecated APIs nach Kubernetes-Upgrade

Symptom: Workloads funktionieren nicht mehr.

Lösung:

  1. Deprecated APIs finden:

    # Deprecated APIs in Cluster identifizieren
    kubectl get all -A -o json | jq -r '.items[] | select(.apiVersion | contains("v1beta")) | "\(.kind)/\(.metadata.name) in \(.metadata.namespace) uses \(.apiVersion)"'
    

  2. Manifests aktualisieren (z.B. networking.k8s.io/v1beta1networking.k8s.io/v1)

  3. Polycrate-Blöcke aktualisieren und neu deployen:

    # Block-Versionen in workspace.poly aktualisieren
    # Dann Upgrade durchführen
    polycrate workflows run upgrade
    

4. Dependencies (Datenbanken, Registry, Observability)

Häufigkeit: nach Hersteller- und CVE-Lage, entkoppelt vom App-Tag

Beschreibung: Versionierte Blöcke für PostgreSQL/CNPG, MongoDB, Redis/Valkey, Message-Broker, Harbor, Velero, VictoriaMetrics/VictoriaLogs. Tag pinnen, Backup-Probe, dann polycrate run <block> upgrade. Bei Fehler denselben Block auf den vorherigen Tag zurücksetzen — nicht die Fachanwendung mitziehen.

5. Anwendungsrelease

Häufigkeit: nach dem Release-Prozess der Anwendung

Beschreibung: Nur Image-/Block-Tag der Fachanwendung ändern. Primitives und Dependencies bleiben. Rollback = vorherigen Tag pinnen und dieselbe Upgrade-Action. Vorlagen: bereitgestellter Cluster, Air-Gap.

Weiterführende Dokumentation

Support

Bei Fragen zu Maintenance und Upgrades: