Containerbasierte Installation – Orchestrierte Umgebung
Informationen
Die einzelnen Komponenten von PLANTA Project Manager, Worker, Customizing (Datenbank), Web-Client und optional Pulse werden als Container-Images im Docker-Container-Format bereitgestellt und über Helm in einer Kubernetes-Umgebung installiert.
Manager ist verantwortlich für die Zugriffe auf die Datenbank sowie für Geschäftslogik, Datenverarbeitung und API-Dienste.
Worker stellt Client- bzw. Web-Client-Verbindungen her und führt Hintergrundprozesse aus.
Customizing ist ein Initialisierungsjob und enthält Standard-Customizing und kundenspezifische Anpassungen. Er bereitet die Datenbank vor und wird anschließend beendet.
Web-Client stellt die Benutzeroberfläche von PLANTA Project im Webbrowser bereit.
Pulse (optional) ist die Komponente für Echtzeit‑Zusammenarbeit und Kommunikation.
Für Produktions-Workloads empfehlen wir, die Secure-Komponente als Reverse Proxy vorzuschalten (TLS‑Terminierung, Single Sign-On mit OIDC usw.).
Die Container-Images können überall dort bereitgestellt werden, wo eine OCI‑kompatible Container Runtime bzw. Plattform vorhanden ist. In einer orchestrierten Umgebung erfolgt der Betrieb auf einem Kubernetes‑Cluster.
Die Komponenten werden als Deployments bzw. Jobs mit den notwendigen Services, PersistentVolumeClaims, Ingress‑Ressourcen usw. angelegt. Zusammengenommen stellen sie eine vollständige PLANTA‑Projektmanagement‑Umgebung bereit.
Was ist Helm?
Helm ist ein Paketmanager für Kubernetes, mit dem Anwendungen paketiert, verteilt und mit einem Kommando installiert oder aktualisiert werden können. Anstatt mehrere Kubernetes‑Ressourcendefinitionen manuell zu erstellen, wird die Anwendung als sogenanntes Chart bereitgestellt.
Wichtige Begriffe:
Chart: Paket, das alle benötigten Kubernetes‑Ressourcen für eine Anwendung beschreibt.
Release: Eine installierte Instanz eines Charts in einem Kubernetes‑Cluster.
Values: Konfigurationswerte, mit denen ein Release angepasst wird (z. B. Datenbank‑Zugriffe, Lizenzinformationen, Ressourcenlimits).
Weitere Informationen zu Helm siehe offizielle Dokumentation unter https://helm.sh/docs/.
Voraussetzungen
Vor der Installation in einer orchestrierten Umgebung müssen folgende Voraussetzungen erfüllt sein:
Kubernetes‑Cluster (Version 1.21 oder höher)
Geeignet sind z. B. AKS, EKS, GKE, OpenShift oder On‑Premises‑Kubernetes.Helm (Version 3.x oder höher)
Installationsanleitung Helmkubectl mit Zugriff auf den Cluster
Prüfung mit:kubectl cluster-infoZugriff auf die PLANTA OCI‑Registry
Registry‑URL:
registry.planta.servicesAnleitung zur Anmeldung: https://help.planta.de/en/tec/Container-ab-39.5.24/anmeldung-planta-oci-registry
Unterstützte Datenbankinstanz
Details siehe Systemvoraussetzungen und Plattformen → Abschnitt Database Requirements:PLANTA‑Lizenz
Entweder als Lizenznummer oder als Lizenzdatei.Persistente Speicherung im Cluster
Für gemeinsam genutzte Daten: Unterstützung des Modus ReadWriteMany (RWX).
Ingress‑Controller für produktive Umgebungen
z. B. NGINX, Traefik oder OpenShift Routes.
Helm‑Chart der PLANTA‑Registry herunterladen
Alle Container-Images und das Helm‑Chart sind in der PLANTA‑Registry unter https://registry.planta.services verfügbar. Die Zugangsdaten erhalten Sie von PLANTA. Details zur Anmeldung: https://help.planta.de/en/tec/Container-ab-39.5.24/anmeldung-planta-oci-registry
Option 1: Helm‑Chart direkt installieren
Beispiel:
helm install my-planta oci://registry.planta.services/planta/helm \
--version 1.0.0 \
--namespace planta \
--create-namespace \
--values my-values.yaml
Option 2: Helm‑Chart zuerst lokal ziehen
# Chart lokal herunterladen und entpacken
helm pull oci://registry.planta.services/planta/helm \
--version 1.0.0 --untar
# Installation aus lokalem Chart
helm install my-planta ./helm \
--namespace planta \
--create-namespace \
--values my-values.yaml
Bereitstellung im Kubernetes‑Cluster
Namespace anlegen (falls nicht über Helm erstellt):
CODEkubectl create namespace plantaKonfigurationsdatei erstellen
my-values.yamlmit allen benötigten Parametern anlegen bzw. anpassen (Datenbank, Lizenz, Ressourcen, Ingress usw.), siehe den Abschnitt “Konfiguration des helm-Charts”.Helm‑Chart installieren:
CODEhelm install my-planta oci://registry.planta.services/planta/helm \ --namespace planta \ --values my-values.yaml \ --timeout 10mInstallation überwachen:
CODE# Pods beobachten kubectl get pods -n planta -w # Release-Status prüfen helm status my-planta -n planta
Konfiguration des Helm‑Charts
Die Konfiguration der Container in der orchestrierten Umgebung erfolgt – analog zur Einzelumgebung mit Docker Compose – über Umgebungsvariablen. In Kubernetes/Helm werden diese entweder direkt über values.yaml oder über Kubernetes‑Secrets gesetzt.
Eine Übersicht über alle verfügbaren Parameter finden Sie im Topic Server- und Client‑Konfiguration.
Minimale erforderliche Konfiguration
Erstellen Sie eine Kopie der Datei values.yaml mit dem Namen my-values.yaml und setzen Sie folgende Parameter:
Manager
planta__server__hibernate__connection__urlplanta__server__hibernate__connection__usernameplanta__server__hibernate__connection__passwordplanta__server__ppms_license
Pulse (falls verwendet)
MONGO_URLMONGO_OPLOG_URL
Diese Parameter entsprechen inhaltlich den Parametern aus den Docker‑Compose‑Templates und werden im Chart als Umgebungsvariablen an die jeweiligen Container übergeben.
Datenbank‑Konfiguration
Konfiguration über Umgebungsvariablen (z. B. Test‑/Entwicklungssysteme)
manager:
env:
# Beispiel Oracle
planta__server__hibernate__connection__url: "jdbc:oracle:thin:@hostname:1521/servicename"
planta__server__hibernate__connection__username: "planta_user"
planta__server__hibernate__connection__password: "ihr-passwort"
Konfiguration über Kubernetes‑Secrets (empfohlen für produktive Systeme)
Für Datenbank‑Zugangsdaten und andere sensible Konfigurationen sollten Kubernetes‑Secrets verwendet werden. Ein vollständiges Beispiel finden Sie unter: Secret example
Beispielreferenz in den Values:
manager:
secrets:
userSecretName: "planta-db-secret"
Weitere Details zu verfügbaren Parametern siehe Server- und Client‑Konfiguration.
Lizenz‑Konfiguration
Die Lizenz kann – analog zur Einzelumgebung – entweder als Lizenznummer oder als Datei bereitgestellt werden.
Option 1: Lizenznummer als Umgebungsvariable
manager:
env:
planta__server__ppms_license: "ihre-lizenznummer"
Option 2: Lizenzdatei über Secret
Variante mit eigenem Secret:
manager:
license:
enabled: true
configMapName: ""
secretName: "ihr-license-secret"
path: ""
Variante, bei der das Chart das Secret automatisch aus einer lokalen Lizenzdatei erzeugt:
manager:
license:
enabled: true
configMapName: ""
secretName: ""
path: "license.conf"
Image‑Konfiguration und Registry‑Zugriff
Standardmäßig werden die Images aus der PLANTA‑Registry gezogen. Dafür wird ein ImagePullSecret verwendet:
imagePullSecrets:
- name: registry-credentials
Secret anlegen:
kubectl create secret docker-registry registry-credentials \
--docker-server=registry.planta.services \
--docker-username=IHR-BENUTZERNAME \
--docker-password=IHR-PASSWORT \
--namespace planta
Detaillierte Anleitung zur Authentifizierung siehe Registry‑Dokumentation Anmeldung PLANTA OCI Registry .
Bereitstellung im Kubernetes‑Cluster
Vorgehensweise:
Namespace anlegen (falls nicht über Helm erstellt):
CODEkubectl create namespace plantaKonfigurationsdatei erstellen
my-values.yamlmit allen benötigten Parametern anlegen bzw. anpassen (Datenbank, Lizenz, Ressourcen, Ingress usw.).Helm‑Chart installieren:
CODEhelm install my-planta oci://registry.planta.services/planta/helm \ --namespace planta \ --values my-values.yaml \ --timeout 10mInstallation überwachen:
CODE# Pods beobachten kubectl get pods -n planta -w # Release-Status prüfen helm status my-planta -n planta
Zugriff auf PLANTA
Nach erfolgreicher Installation den Status der Pods überprüfen:
kubectl get pods -n planta
Alle relevanten Pods sollten im Status Running sein. Der Zugriff auf den Web‑Client erfolgt in produktiven Umgebungen über den konfigurierten Ingress bzw. die Route.
Für Testzwecke ohne Ingress kann Port‑Forwarding verwendet werden:
# Zugriff auf den Web-Client
kubectl port-forward svc/my-planta-webclient 5000:5000 -n planta
# Aufruf im Browser:
# http://localhost:5000
Aktualisierung (Upgrade) einer bestehenden Installation
Vorgehensweise:
Konfigurationsdatei
my-values.yamlan neue Anforderungen oder Chart‑Version anpassen.Release aktualisieren:
CODEhelm upgrade my-planta oci://registry.planta.services/planta/helm \ --namespace planta \ --values my-values.yaml \ --version 1.1.0Upgrade überwachen:
CODEkubectl rollout status deployment/my-planta-manager -n planta kubectl get pods -n planta
Deinstallation
Um eine PLANTA‑Installation aus dem Cluster zu entfernen:
# Uninstall the Helm release
helm uninstall my-planta -n planta
# Optionally, delete the namespace and all resources
kubectl delete namespace planta
Erweiterte Konfiguration
Ressourcenlimits (CPU/RAM)
Beispielkonfiguration:
manager:
resources:
requests:
memory: "2Gi"
cpu: "1000m"
limits:
memory: "4Gi"
cpu: "2000m"
webclient:
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "1Gi"
cpu: "500m"
Empfehlungen zur Dimensionierung siehe Systemvoraussetzungen und Plattformen.
Speicherklassen und Persistenz
Speicherklassen für für persistente Volumes definieren:
storageClassName: "fast-ssd" # Global storage class
# Per-component storage configuration
transfer:
persistence:
size: 1Gi
accessMode: ReadWriteMany
# Optionally override storage class for shared volume
storageClassName: ""
webclient:
persistence:
size: 5Gi
accessMode: ReadWriteOnce
pulse:
persistence:
size: 10Gi
accessMode: ReadWriteOnce
Selbstverwaltete PVCs
Standardmäßig erstellt das Chart automatisch PersistentVolumeClaims und bindet diese in jede Bereitstellung/jeden Job für jede Komponente ein, die persistenten Speicher benötigt. Wenn Sie die volle Kontrolle wünschen – beispielsweise um benutzerdefinierte Labels, Anmerkungen oder Volume-Bindungsmodi festzulegen oder vorab bereitgestellte Volumes wiederzuverwenden –, können Sie die automatische PVC-Erstellung pro Komponente deaktivieren.
Wenn persistence.create: false:
Die PVC-Ressource wird nicht vom Diagramm erstellt.
Sie stellen das Volume selbst über
additionalVolumes/additionalVolumeMountsbereit, die auf das von Ihnen erstellte PVC verweisen.
Eigene PVCs verwenden
Falls PVCs nicht automatisch durch das Chart erzeugt werden sollen:
transfer:
persistence:
create: false
manager:
additionalVolumes:
- name: my-transfer
persistentVolumeClaim:
claimName: my-company-transfer-pvc
additionalVolumeMounts:
- name: my-transfer
mountPath: /mnt/transfer
readOnly: true
worker:
additionalVolumes:
- name: my-transfer
persistentVolumeClaim:
claimName: my-company-transfer-pvc
additionalVolumeMounts:
- name: my-transfer
mountPath: /mnt/transfer
readOnly: true
customizing:
additionalVolumes:
- name: my-transfer
persistentVolumeClaim:
claimName: my-company-transfer-pvc
additionalVolumeMounts:
- name: my-transfer
mountPath: /mnt/transfer
readOnly: false
Analog für Web‑Client und Pulse:
webclient:
persistence:
create: false
additionalVolumes:
- name: my-webclient-data
persistentVolumeClaim:
claimName: my-company-webclient-pvc
additionalVolumeMounts:
- name: my-webclient-data
mountPath: /var/planta
pulse:
persistence:
create: false
additionalVolumes:
- name: my-pulse-data
persistentVolumeClaim:
claimName: my-company-pulse-pvc
additionalVolumeMounts:
- name: my-pulse-data
mountPath: /app/data
Hinweis: Wenn
create: falsegesetzt ist, werden PVCs bei der Deinstallation nicht automatisch gelöscht.
Platzierung der Pods (Node Affinity, Tolerations)
manager:
nodeSelector:
disktype: ssd
tolerations:
- key: "dedicated"
operator: "Equal"
value: "planta"
effect: "NoSchedule"
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/zone
operator: In
values:
- zone-1
- zone-2
Zusätzliche Volumes
manager:
additionalVolumes:
- name: custom-config
configMap:
name: my-custom-config
additionalVolumeMounts:
- name: custom-config
mountPath: /etc/custom
readOnly: true
Sitzungsaffinität (Sticky Sessions)
Für skalierte Web‑Client‑Deployments kann Sitzungsaffinität konfiguriert werden.
Service‑seitige ClientIP‑Affinität
webclient:
service:
sessionAffinity:
enabled: true
timeoutSeconds: 3600
Ingress‑seitige Cookie‑basierte Affinität (z. B. NGINX)
Für den Browser-Verkehr sind Cookie-basierte Sticky-Sessions zuverlässiger. Diese werden über globale ingress.annotations konfiguriert und gelten für alle Ingress-Ressourcen.
ingress:
enabled: true
annotations:
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/affinity-mode: "balanced"
nginx.ingress.kubernetes.io/session-cookie-name: "PLANTASESSIONID"
nginx.ingress.kubernetes.io/session-cookie-expires: "3600"
nginx.ingress.kubernetes.io/session-cookie-max-age: "3600"
nginx.ingress.kubernetes.io/session-cookie-path: "/"
nginx.ingress.kubernetes.io/session-cookie-samesite: "Lax"
nginx.ingress.kubernetes.io/session-cookie-secure: "true"
nginx.ingress.kubernetes.io/session-cookie-change-on-failure: "true"
Für andere Ingress-Controller (Traefik, HAProxy usw.) passen Sie die Anmerkungen entsprechend an. Die richtigen Anmerkungsschlüssel finden Sie in der Dokumentation Ihres Ingress-Controllers.
Hinweis: Die Cookie-basierte Affinität wird vom Ingress-Controller verarbeitet und hat Vorrang vor der ClientIP-Affinität für externen Datenverkehr. Beide Mechanismen können sicher nebeneinander existieren – die Cookie-Affinität verarbeitet den externen/Browser-Datenverkehr, während ClientIP den internen oder direkten Servicezugriff abdeckt.
Sticky Sessions auf Ingress-Ebene wirken sich nur auf das Routing von Browser → Webclient aus, nicht auf die interne Verbindung von Webclient → Worker (die ClientIP-Affinität auf dem Worker-Service verwendet).
Eigene Ingress-/Route‑Definitionen
Falls Ingress‑Ressourcen extern verwaltet werden sollen (z. B. über GitOps), kann die im Chart eingebaute Ingress‑Erzeugung deaktiviert und eigene Ingress‑Definitionen erstellt werden. Die vom Chart angelegten Services dienen dann als Ziele für diese Ingress‑ oder Route‑Ressourcen.
Komponenten deaktivieren
pulse:
enabled: false
webclient:
enabled: false
Customizing‑Deployments (Export/Import)
PLANTA unterstützt das Customizing‑Deployments (Änderungen, die zwischen Umgebungen durch den Export und Import übertragen werden können (z. B. von einem Entwicklungssystem in die Produktion) über einen separaten Kubernetes‑Job auf Basis des Manager‑Images. Ein Beispiel für eine Jobdefinition finden Sie in der cu-deployment-example.yaml. Kopieren Sie diese Datei als Ausgangspunkt und passen Sie sie an Ihre Umgebung an.
Ausführliche Beschreibung zu Kundecustomizing-Deployment finden Sie hier.
Voraussetzungen
Laufende PLANTA‑Installation mit erreichbarer Datenbank
PLANTA-Registry‑Zugriff für das Manager‑Image
Gemeinsames Volume für
.par‑ und.zip‑DateienDatenbank‑Zugangsdaten (möglichst über Secret; siehe
secret-example.yaml)
Wichtig: Der Customizing Deployment Job stellt eine direkte Verbindung zur Datenbank her. Stellen Sie sicher, dass während des Exports oder Imports keine konkurrierenden Vorgänge auf derselben Datenbank ausgeführt werden.
So funktioniert es
Vorgehensweise:
Der Job führt den PLANTA Manager-Container mit einem speziellen Export- oder Importargument aus. Der Container:
Stellt mithilfe der bereitgestellten Anmeldedaten eine Verbindung zur Datenbank her.
Liest die
.par-Datei, in der festgelegt ist, welche Anpassungsobjekte exportiert oder importiert werden sollen.
Schreibt eine exportierte.zip-Datei auf das gemountete Volume (Exportmodus) oder liest eine.zip-Datei und wendet sie auf die Datenbank an (Importmodus).Beendet den Vorgang nach Abschluss – Kubernetes markiert den Job als erfolgreich oder fehlgeschlagen.
Job anwenden:
kubectl apply -f cu-deployment.yaml -n IHR_NAMESPACE
Job überwachen:
# Check job status
kubectl get jobs -n YOUR_NAMESPACE
# Follow the job logs
kubectl logs job/cu-deployment -n YOUR_NAMESPACE -f
Der Job ist wie folgt konfiguriert:
30-minütige Zeitüberschreitung (
activeDeadlineSeconds: 1800) – der Job wird beendet, wenn diese Dauer überschritten wirdKeine Wiederholungsversuche (
backoffLimit: 0) – ein fehlgeschlagener Lauf wird nicht automatisch wiederholtAutomatische Bereinigung nach 1 Stunde (
ttlSecondsAfterFinished: 3600) – die abgeschlossene/fehlgeschlagene Job-Ressource wird automatisch entfernt
Um den Job erneut auszuführen, löschen Sie zunächst den vorherigen Job:
kubectl delete job cu-deployment -n YOUR_NAMESPACE
kubectl apply -f cu-deployment.yaml -n YOUR_NAMESPACE
Verwenden Sie Secrets für Anmeldedaten in der Produktion. Vermeiden Sie es, Datenbankpasswörter direkt in die Job-YAML einzufügen. Erstellen Sie stattdessen ein Secret (siehe secret-example.yaml) und verweisen Sie darauf über envFrom.secretRef.
Sichern Sie Ihre Datenbank vor dem Ausführen eines Imports, insbesondere in Produktionsumgebungen.
Die
.par-Datei muss innerhalb des Containers unter dem inargsangegebenen Pfad zugänglich sein. Sie muss in dem Verzeichnis abgelegt werden, das unter /var/planta/export/ gemountet ist.Volume-Typ: Das Beispiel verwendet hostPath, das für Single-Node-Cluster und lokale Entwicklung geeignet ist. Verwenden Sie für Produktions- oder Multi-Node-Cluster einen geeigneten Volume-Typ (z. B. NFS, PersistentVolumeClaim oder cloudspezifischer Speicher).
Image-Tag: Aktualisieren Sie das Image-Feld entsprechend der PLANTA-Version Ihrer Installation.
Fehlerbehebung
Pods starten nicht
kubectl get pods -n planta
kubectl describe pod <pod-name> -n planta
kubectl logs <pod-name> -n planta
Typische Ursachen:
ImagePullBackOff: ImagePullSecret oder Registry‑Zugang prüfen.CrashLoopBackOff: Anwendungslogs auf Fehler prüfen.Pending: Ressourcenmangel oder Probleme bei PVC‑Binding prüfen.
Datenbankverbindung schlägt fehl
Überprüfen Sie die Datenbankverbindung:
kubectl logs -n planta deployment/my-planta-manager
kubectl run -it --rm debug --image=busybox \
--restart=Never -n planta -- sh
# innerh. Container:
# telnet datenbank-host 1521
Probleme mit Persistent Volumes
PVC-Status überprüfen:
kubectl get pvc -n planta
kubectl describe pvc <pvc-name> -n planta
kubectl get storageclass
Wenn PVCs ausstehen, stellen Sie Folgendes sicher:
Speicherklasse existiert: kubectl get storageclass
Ausreichend Speicherplatz verfügbar
Zugriffsmodus wird unterstützt (insbesondere ReadWriteMany)
Ingress funktioniert nicht
kubectl get ingress -n planta
kubectl describe ingress <ingress-name> -n planta
Prüfen Sie, ob
ein Ingress‑Controller läuft
DNS korrekt gesetzt ist und
ggf. TLS‑Zertifikate gültig sind
Aktuelle Helm‑Werte anzeigen
helm get values my-planta -n planta
oder
helm get values my-planta -n planta --all