Einleitung
Die vorliegende Konzeption beschreibt das Backup- und Restore-Verfahren für die openDesk-Plattform, die auf Kubernetes basiert. openDesk wird als Software-as-a-Service (SaaS) bereitgestellt und bietet Organisationen eine moderne, cloudbasierte Arbeitsumgebung. Die Plattform umfasst zentrale Komponenten wie Collabora Online für Dokumentenbearbeitung, Nextcloud für Dateiverwaltung und Collaboration, Open-Xchange für E-Mail und Groupware sowie weitere integrierte Dienste. Für maximale Isolation und Datensicherheit erhält jeder Mandant in der Produktivumgebung einen dedizierten Kubernetes-Cluster. Die Software ist jedoch so konzipiert, dass sie auch den Betrieb mehrerer Mandanten in separaten Namespaces innerhalb eines Clusters unterstützt, was in Entwicklungs- und Testumgebungen zur Anwendung kommt.
Ziel der Backup-Strategie
Ziel dieses Dokuments ist es, eine strukturierte und zuverlässige Lösung für die Sicherung und Wiederherstellung von Daten und Konfigurationen zu etablieren. Angesichts der SaaS-Natur der Plattform und der damit verbundenen Verantwortung gegenüber den Mandanten ist ein robustes Backup- und Restore-Konzept unerlässlich, um Datenverlust zu verhindern, Service-Kontinuität zu gewährleisten und regulatorische Anforderungen zu erfüllen.
Zur Umsetzung dieses Konzepts wird K8up als Backup-Lösung eingesetzt. K8up ist ein Kubernetes-nativer Operator für Backup und Restore, der auf Restic basiert und speziell für containerisierte Umgebungen entwickelt wurde. Die Lösung ermöglicht automatisierte Backups von Persistent Volumes, Anwendungsdaten und Kubernetes-Ressourcen und bietet gleichzeitig flexible Aufbewahrungsrichtlinien und eine einfache Integration in bestehende S3-kompatible Storage-Backends. Weitere Details zu K8up finden sich in der offiziellen Dokumentation unter https://k8up.io.
Dieses Konzept dient als zentrale Dokumentation für alle relevanten Stakeholder und definiert die technischen Anforderungen, Backup-Strategien, Restore-Prozesse sowie die operativen Verantwortlichkeiten. Es bildet die Grundlage für den sicheren Betrieb der openDesk-SaaS-Plattform und gewährleistet die Verfügbarkeit der Daten und die Integrität der Backup-Repositories. Hinweis: Die logische Integrität der Anwendungsdaten (Application Consistency) wird durch die Backup-Mechanismen nicht validiert, sondern setzt konsistente Datenexporte voraus.
Überblick über die Infrastruktur
openDesk betreibt aktuell ein dediziertes Kubernetes-Cluster pro Mandant (Kunde) basierend auf dem STACKIT Kubernetes Engine (SKE), einem vollständig verwalteten Managed-Kubernetes-Service. Bei Onboarding eines neuen Mandanten wird ein neuer Cluster provisioniert und über ein standardisiertes Deployment-Template mittels ArgoCD initialisiert (Bootstrapping). Diese mandanten-isolierte Architektur gewährleistet maximale Datentrennung. Der Bootstrapping-Prozess kombiniert Terraform für die Infrastruktur-Provisionierung mit ArgoCD für die automatisierte Anwendungs-Deployment und bildet damit die Grundlage für die Disaster-Recovery-Strategie.
Die für die Backup- und Restore-Strategie relevanten Infrastrukturkomponenten werden nachfolgend dargestellt und beschrieben
graph TB
%% Styles - Unverändert
classDef git fill:#e3f2fd,stroke:#2196f3,stroke-width:2px,color:#000
classDef gitops fill:#f1f8e9,stroke:#66bb6a,stroke-width:2px,color:#000
classDef apps fill:#fff3e0,stroke:#fb8c00,stroke-width:2px,color:#000
classDef storage fill:#fce4ec,stroke:#ec407a,stroke-width:2px,color:#000
classDef db fill:#e1bee7,stroke:#9c27b0,stroke-width:2px,color:#000
classDef managed fill:#b2dfdb,stroke:#009688,stroke-width:2px,color:#000
classDef cloud fill:#f0f8ff,stroke:#00897b,stroke-width:3px,color:#000
classDef monitor fill:#ffccbc,stroke:#ff5722,stroke-width:2px,color:#000
%% Ebene 1: Source & GitOps
subgraph Deployment Flow
Git[Git Repositories<br/>K8s Manifests + Terraform Modules<br/>GitOps Prinzip]:::git
ArgoCD[ArgoCD Controller<br/>Namespace: argocd<br/>Auto-Sync aus Git]:::gitops
end
%% Ebene 2: Applikation
Apps[Anwendungen<br/>Namespace: kunde-opndsk-de<br/>Keycloak, OpenLDAP, Nextcloud,<br/>OX, OpenProject, Element,<br/>XWiki, Collabora, Jitsi]:::apps
%% Ebene 3: Daten & Storage (Logisch nebeneinander angeordnet)
%% Gruppe 1: K8s Native Storage
PV[Persistent Volumes<br/>App-Daten, Configs + Cache<br/>z.B. OpenLDAP Directory Database]:::storage
%% Gruppe 2: Self-Managed DBs
subgraph Self-Managed Databases
Cassandra[(Self-Managed Cassandra<br/>StatefulSet <br/>Namespace: kunde-opndsk-de<br/>NoSQL distributed DB)]:::db
PVCassandra[PVCs]:::storage
MariaDB[(Self-Managed MariaDB<br/>StatefulSet <br/>Namespace: kunde-opndsk-de-infra<br/>Operator: mariadb-operator)]:::db
PVMariaDB[PVCs]:::storage
end
%% Gruppe 3: Managed Cloud Services (KORRIGIERT)
subgraph StackitCloud[STACKIT Cloud Services]
Postgres[(Managed PostgreSQL<br/>Außerhalb K8s Cluster<br/>Managed Service)]:::db
S3[Managed S3<br/>Primärer Datenspeicher<br/>Object Versioning<br/>S3-API Access]:::managed
end
%% Ebene 4: Offsite Backup
S3Offsite[Offsite S3 Backup<br/>Sekundärer Storage<br/>Geografische Redundanz]:::managed
%% Monitoring (Seitlich platziert)
Prom[Prometheus Monitoring<br/>Namespace: monitoring<br/>Metriken-Sammlung<br/>Begrenzte Aufbewahrung]:::monitor
%% Hauptfluss-Beziehungen
Git -->|GitOps Sync| ArgoCD
ArgoCD -->|Deploys| Apps
Apps -->|App-Daten + Config| PV
Apps -->|NoSQL Data| Cassandra
Apps -->|Relational Data| MariaDB
Apps -->|Relational Data| Postgres
Apps -->|Primary Data Storage| S3
%% Storage Persistenz Beziehungen
Cassandra -->|Persistiert auf| PVCassandra
MariaDB -->|Persistiert auf| PVMariaDB
%% Backup Beziehung
S3 ==>|Repliziert zu| S3Offsite
%% Monitoring & Secrets Beziehungen (Gestrichelt)
Prom -.->|Überwacht| Apps
Prom -.->|Überwacht| Cassandra
Prom -.->|Überwacht| MariaDB
Apps -.->|Nutzt Secrets für| Postgres
Apps -.->|Nutzt Secrets für| S3
%% Explizite Stilzuweisung für den Subgraph (KORREKTUR)
class StackitCloud cloud
-
Git Repositories enthalten sowohl die Kubernetes-Manifests für alle Anwendungen als auch Terraform-Module für die Infrastruktur-Provisionierung. Da die gesamte Konfiguration gemäß dem GitOps-Prinzip verwaltet wird, genügt zur Wiederherstellung der Logik das erneute Ausrollen des Git-Repositories. Beim GitOps-Prinzip wird der gewünschte Systemzustand deklarativ in einem Git-Repository definiert und durch einen Controller (ArgoCD) automatisch mit dem Cluster synchronisiert.
-
ArgoCD läuft als Controller in einem dedizierten Namespace im Cluster und synchronisiert automatisch die Manifests aus Git in den Cluster. Im Backup-Kontext ist relevant, dass alle ArgoCD-verwalteten Anwendungen nach einem Cluster-Rebuild automatisch aus Git wiederhergestellt werden können.
Hinweis: Die "Self-Heal"-Funktion ist standardmäßig deaktiviert, da einige Applikationen (z.B. Nubus) diese Funktion nicht unterstützen und es sonst zu Konflikten kommen kann.
-
Die Anwendungen (Keycloak, OpenLDAP, Nextcloud, OX, OpenProject, Element, XWiki, Collabora, Jitsi) laufen im mandantenspezifischen Customer-Namespace
<kunde>-<stage>und erzeugen verschiedene Arten von persistenten Daten. Die meisten Anwendungen speichern ihre eigentlichen Nutzdaten direkt im STACKIT Managed S3 (z.B. Nextcloud-Dateien, Mediendateien) oder in den Datenbanken (PostgreSQL, MariaDB, Cassandra), während die Persistent Volumes primär für Konfigurationsdateien, Anwendungs-Logs und temporäre Daten genutzt werden. Eine wichtige Ausnahme bilden hierbei Cassandra und MariaDB, welche ihre kritischen Anwendungsdaten direkt auf den Persistent Volumes speichern. Diese Architektur bedeutet, dass zwar Teile der Daten außerhalb der PVs liegen (Managed Services), jedoch für die auf PVs liegenden Datenbanken zwingend Mechanismen zur Sicherung der Application Data erforderlich sind. -
Persistent Volumes basieren auf STACKIT Managed Block Storage und speichern sowohl Anwendungskonfigurationen und temporäre Cache-Daten als auch primäre Anwendungsdaten für bestimmte Anwendungen wie OpenLDAP. Während die meisten Anwendungen ihre Daten primär in S3 schreiben, nutzen einige Anwendungen PVs zum Zwischenspeichern geschäftskritischer Daten oder als primären Datenspeicher (z.B. OpenLDAP Directory Database).
-
Self-Managed Cassandra DB (Namespace:
<kunde>-<stage>). Dient ausschließlich als Speicher für spezifische Komponenten wie Dovecot-Metadaten (ACL-Listen, Mail-Metadaten). Diese Komponente ist nur relevant, wenn der Mail-Stack (Dovecot) direkt im Cluster betrieben wird. -
Self-Managed MariaDB wird als StatefulSet in einem separaten Infrastructure-Namespace
<kunde>-<stage>-infrabetrieben, während der MariaDB-Operator in einem separaten Namespace mariadb-operator läuft. Die relationale Datenbank persistiert ihre Daten auf PersistentVolumeClaims. Der Operator automatisiert Lifecycle-Management-Aufgaben wie Provisionierung, Konfiguration und Verwaltung der MariaDB-Instanzen -
STACKIT Managed Postgres ist ein vollständig verwalteter Datenbankdienst, der von ☁️STACKIT Cloud außerhalb des Kubernetes-Clusters betrieben wird. openDesk-Anwendungen nutzen diese zentrale PostgreSQL-Instanz für ihre relationalen Daten. Der Managed Service übernimmt automatisch Wartung, Patches und Hochverfügbarkeit. Die Verbindungs-Credentials werden als Kubernetes Secrets im Cluster hinterlegt.
-
STACKIT Managed S3 dient als primärer Datenspeicher für die meisten openDesk-Anwendungen. Die Anwendungen greifen über S3-APIs auf diesen Storage zu, wobei die Access Keys als Kubernetes Secrets im Cluster hinterlegt sind. S3 bietet Object Versioning, wodurch frühere Versionen von Objekten erhalten bleiben und bei Bedarf wiederhergestellt werden können.
Abgrenzung (S3-Storage): openDesk bietet optional die Möglichkeit, einen S3-compatible Object Storage via MinIO direkt im Cluster zu betreiben. Dieses Feature ist nicht Bestandteil des aktuellen Backup-Konzepts, da für die Speicherung von Objekten ausschließlich der externe Managed S3 Service von STACKIT genutzt wird.
-
Offsite S3 Backup fungiert als sekundärer Object Storage für geografische Redundanz. Die Daten aus dem STACKIT Managed S3 werden in diesen Offsite-Storage repliziert, um Disaster Recovery über Rechenzentren hinweg zu gewährleisten. Der konkrete Provider für diesen Offsite-S3-Speicher ist noch nicht final festgelegt; aktuell befinden sich Regio Cloud und Hetzner als S3-kompatible Optionen in der Evaluierung.
-
Prometheus Monitoring läuft im Cluster im Namespace
monitoringund sammelt Metriken von allen Anwendungen und Kubernetes-Komponenten. Die Monitoring-Daten werden typischerweise nur für einen begrenzten Zeitraum aufbewahrt und dienen der Überwachung der Cluster-Gesundheit und Performance-Analyse
Die folgende Übersicht zeigt die Namespace-Struktur in einer Kundeninstanz (dediziertes Cluster) am Beispiel des Kunden "schulung":
NAME STATUS AGE
argocd Active 50d
cert-manager Active 50d
cluster-infra Active 50d
default Active 50d
fluentbit Active 50d
ingress-nginx Active 50d
k8up Active 50d
kruise-daemon-config Active 50d
kruise-system Active 50d
kube-node-lease Active 50d
kube-public Active 50d
kube-system Active 50d
mariadb-operator Active 50d
monitoring Active 50d
oauth2-proxy Active 50d
openkruise Active 50d
schulung-opndsk-de Active 48d
schulung-opndsk-de-infra Active 48d
Die Namespace-Struktur gliedert sich in System-Namespaces (z.B. kube-system, kube-public), Operator- und Tool-Namespaces (z.B. argocd, k8up, mariadb-operator, monitoring) sowie kundenspezifische Namespaces (kunde-opndsk-de für Anwendungen und kunde-opndsk-de-infra für Infrastruktur-Komponenten)
Abweichende Architektur für Großumgebungen
Während Standard-Installationen vollständig innerhalb des Kubernetes-Clusters betrieben werden, nutzen große Produktivinstanzen eine ausgelagerte Infrastruktur für Dovecot und Rspamd, die auf dedizierten virtuellen Maschinen (VMs) verteilt ist. Diese Architektur umfasst zusätzlich eine separate Redis-Instanz zur Speicherung von Spam-Learning-Listen.
Wichtiger Hinweis: Für diese ausgelagerten VM-Komponenten (insbesondere die Redis-Daten des Rspamd) existiert zum aktuellen Zeitpunkt noch kein integriertes Backup-Konzept. Dies stellt eine Abweichung vom Standard-Vorgehen dar und muss gesondert betrachtet werden.
Anforderungen an Backup und Restore
Recovery Point Objective (RPO)
Das RPO definiert den maximal akzeptablen Datenverlust im Falle eines Ausfalls.
- Zielwert: 24 Stunden.
- Begründung: Die automatisierte Sicherung aller persistenten Daten erfolgt standardmäßig einmal täglich (nächtlicher Batch-Lauf). Im schlimmsten Fall (Ausfall kurz vor dem nächsten geplanten Backup) entspricht der Datenstand dem des vorangegangenen Abends.
Recovery Time Objective (RTO)
Das RTO definiert die maximal zulässige Zeitdauer vom Zeitpunkt der Schadensmeldung bis zur Wiederherstellung der Betriebsbereitschaft der kritischen Dienste.
- Zielwert: 4 bis 8 Stunden (innerhalb der vereinbarten Servicezeiten).
- Begründung: Die Wiederherstellung umfasst die Bereitstellung der Infrastruktur, den Download der Restic-Snapshots vom S3-Speicher und das Einspielen der Dumps in die Datenbanken. Die tatsächliche Dauer ist abhängig von der Datenmenge und der verfügbaren Bandbreite zum Offsite-Storage. Die Datenmenge wächst dabei mit der Anzahl der Benutzer einer Kundeninstanz, der Intensität der Nutzung (z.B. Datei-Uploads in Nextcloud, E-Mail-Volumen, Chat-Verkehr) sowie der Änderungs- bzw. Wachstumsrate der Daten über die Zeit.
Aufbewahrungsrichtlinien (Retention Policy)
Um eine historische Datenwiederherstellung zu ermöglichen und gleichzeitig Speicherplatz effizient zu nutzen, wird eine rollierende Aufbewahrungsstrategie (Grandfather-Father-Son Prinzip) angewendet. Die Standard-Konfiguration in K8up (siehe Kapitel 2.1.3) sieht vor:
- Letzte Backups: Die letzten 5 Snapshots werden unabhängig vom Alter vorgehalten.
- Tägliche Backups: Vorhaltung der letzten 14 Tage.
- Wöchentliche Backups: Vorhaltung der letzten 4 Wochen.
- Monatliche Backups: Vorhaltung der letzten 12 Monate.
- Jährliche Backups: Vorhaltung der letzten 2 Jahre.
Wichtiger Hinweis: Die oben definierten Aufbewahrungsfristen basieren auf technischen Standard-Policies. Sie müssen im Rahmen des noch zu erstellenden Löschkonzepts zwingend überprüft und ggf. angepasst werden, um sicherzustellen, dass kundenspezifische Datenlöschfristen und datenschutzrechtliche Vorgaben (z.B. "Recht auf Vergessenwerden") auch in den Backups korrekt abgebildet werden.
Weitere Anforderungen
- Vollautomatisierte Sicherung: Der gesamte Backup-Prozess (Auslösen, Snapshot-Erstellung, Übertragung, Pruning) muss ohne manuellen Eingriff zeitgesteuert erfolgen.
- Standardisierter Restore-Workflow: Wiederherstellungsprozesse müssen soweit wie möglich skriptbasiert oder durch Tools unterstützt sein, um die Abhängigkeit von individuellem Expertenwissen im Disaster-Fall zu reduzieren.
- Infrastructure-as-Code (IaC) Integration: Die Backup-Konfiguration selbst (Zeitpläne, Retention-Policies) muss deklarativ definiert und versioniert sein (GitOps), um eine automatische Wiederherstellung der Backup-Funktionalität bei einem Cluster-Neuaufbau zu garantieren.
- Testbarkeit: Die Automatisierung muss regelmäßige, automatisierte Integritätstests (z.B. Repository-Checks) ermöglichen, um die Wiederherstellbarkeit proaktiv zu überwachen.
- Geografische Redundanz: Alle Backups müssen zwingend an einen sekundären, physisch getrennten Standort (Offsite S3) repliziert werden.
- Kosteneffizienz: Die Auswahl des Offsite-Speichers muss unter Berücksichtigung der Total Cost of Ownership (TCO) erfolgen. Insbesondere für die Langzeitarchivierung (Retention > 30 Tage) sind Speicherklassen zu wählen, die geringe Speicherkosten bieten (z.B. Cold Storage), da schnelle Zugriffszeiten für historische Daten eine untergeordnete Rolle spielen.