Betrieb in Kubernetes¶
Für einen einzelnen Server ist Docker Compose der einfachere Weg. Kubernetes lohnt sich, wenn Sie ohnehin einen Cluster betreiben, mehrere Instanzen der Anwendung brauchen oder Datenbank und Cache als verwaltete Dienste nutzen wollen.
Voraussetzungen¶
- Kubernetes 1.27 oder neuer,
kubectlmit Zugriff auf den Cluster - Eine Speicherklasse (
kubectl get storageclass) - Ein Ingress-Controller und cert-manager für HTTPS. Fehlen sie, bietet der Installer an, ingress-nginx und cert-manager mitzuinstallieren.
- Helm 3 – wird bei Bedarf nachinstalliert
Bedarf: etwa 4 GB Arbeitsspeicher mit Volltextsuche, rund 2 GB ohne.
Installation¶
Der Installer fragt Domain, Namespace, Speicherklasse und Administrationskonto ab, prüft die Cluster-Bausteine und wartet, bis die Anwendung läuft.
Weitere Schalter des Installers: --minimal (ohne Elasticsearch), --with-website, --dry-run (zeigt nur die Manifeste), --storage-class, --uninstall.
Nach der Installation¶
Die Domain muss auf den Ingress-Controller zeigen:
Zugangsdaten sichern. Beim ersten Installieren erzeugt das Chart Schlüssel und Passwörter; bei Upgrades bleiben sie erhalten.
Verschlüsselungsschlüssel
Der Eintrag encryption-key verschlüsselt Fachdaten wie Protokolle, Anträge und personenbezogene Felder. Geht er verloren, sind diese Daten unwiederbringlich unlesbar. Die Sicherung gehört in einen Passwortspeicher, nicht in die Versionsverwaltung.
Wichtige Werte¶
| Wert | Vorgabe | Bedeutung |
|---|---|---|
domain | – | Adresse der Installation, Pflichtangabe |
image.tag | latest | Version aller Images; im Betrieb fest setzen |
app.replicas | 1 | Mehr als eine Instanz braucht persistence.accessMode: ReadWriteMany |
postgres.enabled | true | Auf false bei verwalteter Datenbank, dann externalDatabase.url setzen |
redis.enabled | true | Analog mit externalRedis.url |
elasticsearch.enabled | true | Aus: Suche läuft über die Datenbank, spart etwa 2 GB Arbeitsspeicher |
website.enabled | false | Marketing-Website mitinstallieren |
ingestor.syncInterval | 15 | Minuten zwischen zwei OParl-Synchronisationen |
persistence.files.size | 50Gi | Heruntergeladene Dokumente; wächst mit der Zahl der Kommunen |
logging.format | json | Siehe Logging und Tracing |
networkPolicy.enabled | false | Schränkt den Zugriff auf Datenbank, Cache und Suchindex ein |
Vollständige Liste im Chart unter deploy/kubernetes/helm/mandari/values.yaml. Vorlagen für kleine und große Installationen liegen als values-minimal.yaml und values-production.yaml daneben.
Aktualisieren¶
Migrationen laufen automatisch als Job, bevor die neuen Pods starten:
helm upgrade mandari deploy/kubernetes/helm/mandari -n mandari \
--reuse-values --set image.tag=v1.2.3 --wait
Sichern¶
# Datenbank
kubectl -n mandari exec statefulset/mandari-postgres -- \
pg_dump -U mandari mandari | gzip > mandari-$(date +%F).sql.gz
# Dateien: die Volumes mandari-media und mandari-files in die Sicherung des
# Clusters aufnehmen (z. B. Velero) oder aus einem Pod kopieren
kubectl -n mandari cp mandari-<pod>:/app/media ./media-backup
Siehe auch Updates und Backups.
Fehlersuche¶
| Beobachtung | Ursache und Abhilfe |
|---|---|
Pods bleiben Pending | Keine passende Speicherklasse oder zu wenig Ressourcen: kubectl -n mandari describe pod <name> |
| Migrations-Job schlägt fehl | Datenbank nicht erreichbar: kubectl -n mandari logs job/mandari-migrate |
| Anwendung startet nicht | Meist die Datenbankverbindung: kubectl -n mandari logs deploy/mandari |
| Kein Zertifikat | cert-manager oder ClusterIssuer fehlt: kubectl describe certificate -n mandari |
| Elasticsearch startet nicht | Zu wenig Arbeitsspeicher: elasticsearch.javaOpts senken oder abschalten |
Ohne Ingress erreichen Sie die Installation direkt:
Deinstallieren¶
Daten und Zugangsdaten bleiben absichtlich erhalten. Vollständig entfernen – nicht umkehrbar: