Odoo für Kubernetes

Die einfachste Installation von Odoo in einem Kubernetes Cluster ist der Glasskube Operator.

Odoo ist ein Open-Source ERP ("Enterprise Resource Planning") System, das mithilfe von Apps zahlreiche Funktionen bietet. Zum Beispiel gibt es Erweiterungen für das Customer Relationship Management (CRM), Abrechnungssystem, Mitarbeiter Management, Zeiterfassungssystem und viele weitere Apps.

Odoo wurde in der Programmiersprache Python geschrieben und basiert auf folgenden Komponenten:

  1. Backend, CLI und App Komponenten geschrieben in Python: github.com/odoo/odoo
  2. JavaScript Frontend Framework für die Erstellung von Views: Frontend Dokumentation
  3. PostgreSQL als relationale Datenbank
  4. Optional kann ein LoadBalancer vor die Odoo Instanz geschaltet werden

Odoo Docker Images für Kubernetes

Odoo veröffentlicht regelmäßig neue Docker-Images (github.com/odoo/docker) und publiziert diese im Docker Hub. Mit diesen Images kann Odoo schnell installiert und ausprobiert werden. Für den produktiven Einsatz bedarf es jedoch einige Anpassungen und Konfigurationseinstellungen:

  • Konfiguration von Volumes für das Persistieren von Dateien
  • Immutable Image Tags um reproduzierbare Deployments sicherzustellen
  • Intelligente Neugenerierung der Asset-Bundles

Odoo Docker Persisted Volumes

Neben der Datenbank speichert Odoo auch Daten in dem Verzeichnis /var/lib/odoo/filestore des lokalen Dateisystems. Hauptsächlich handelt es sich dabei um Dateien, die von Usern hochgeladen wurden. Mithilfe von volumes kann die Beständigkeit der Dateien im Verzeichnis /var/lib/odoo erzielt werden.

Glasskube Odoo Docker Images mit Immutable Tags

Achtung In den offiziellen Docker Images wird bei jedem Release einer Minor Version der Major Version Tag (z.B. 16.0) überschrieben. Eine Änderung des Images kann man daher nur am SHA256 Hash erkennen.

Dies führt zu mehreren Problemen:

  1. Deployments sind nicht reproduzierbar, da sich das Image bei gleichbleibenden Tag ungeplant ändern kann.
  2. Notwendige Sicherheitsupdates können nicht erkannt und eingespielt werden.
  3. Die Odoo Asset-Bundles können nicht effizient erneuert werden

Um diese Probleme zu lösen, erweitert Glasskube das offizielle Odoo Docker Image und veröffentlicht dieses neue Image unter Verwendung von Immutable Tags.

Das Dockerfile der Glasskube Odoo Images kann hier gefunden werden: github.com/glasskube/images/odoo Die Docker Images werden auf Docher Hub veröffentlicht: hub.docker.com/r/glasskube/odoo

Odoo Caches - Assets neu generieren

Odoo generiert Asset-Bundles und Images auf der Grundlage der Odoo Version, die im Docker-Image mitgeliefert wird, speichert diese im Ordner /var/lib/odoo und referenziert diese Assets in der Datenbanktabelle ir_attachment. Diese Asset-Bundles (hauptsächlich Javascript-Bundles) unterscheiden sich je nach Odoo Version, für die sie gebaut wurden. Wenn sich nun die Odoo-Version ändert, aber die persistierten Asset-Bundles nicht neu generiert werden, entsteht eine Inkompatibilität zwischen den ausgelieferten Bundles und der Odoo Version.

Dies führt dazu, dass der Nutzer nach einem Odoo Upgrade oftmals nur eine weiße Seite sieht. Folgende Fehlermeldung kann über die Javascript Konsole des Browsers beobachtet werden:

UncaughtPromiseError > TypeError
Uncaught Promise > parent is undefined
TypeError: parent is undefined
removeLine@odo....

In einem Blogeintrag von Holden Rehg werden verschiedene Varianten beschrieben, um die Assets neu zu generieren.

Im Glasskube Docker Image werden die Assets direkt über das Löschen der Datenbankeinträge beim ersten Neuladen neu generiert, wenn sich die Odoo Version geändert hat. Unter anderem führt das Shell-Skript run.sh folgenden SQL Befehl aus:

DELETE
FROM ir_attachment
WHERE res_model = 'ir.ui.view'
  AND name LIKE '%assets_%';

Dadurch werden im Glasskube Odoo Docker Image die Assets intelligent neu generiert.

Odoo Kubernetes Operator

Nun stellt sich die Frage, wie die Glasskube Odoo Docker Images am einfachsten in einem Kubernetes Cluster bereitgestellt werden können. Der Glasskube Kubernetes Operator übernimmt diese Aufgabe. Dieser individualisiert nicht nur die initiale Installation an die Cloud-Infrastruktur des Kunden, sondern löst die oben beschriebenen Probleme der gecachten inkompatiblen Docker Images und übernimmt den Betrieb der Datenbank, deren Backups und das Update-Management. Odoo Updates werden automatisiert im Zuge eines Operator-Updates eingeleitet.

Odoo Kubernetes Installation

Wenn bereits ein Kubernetes Cluster vorhanden und kubectl installiert ist, muss für die Installation von Odoo das Git-Repository github.com/glasskube/operator geklont werden.

git clone git@github.com:glasskube/operator.git

Das Skript deploy.sh installiert die benötigten Dependencies und Custom-Ressource-Definitionen.

# Cluster-wide deployment of version X.Y.Z (or latest)
# of the Glasskube operator 
deploy/deploy.sh -v latest

Sobald die Installation des Operators abgeschlossen ist, kann Odoo installiert werden. Dazu muss lediglich die folgende Custom-Resource im Cluster erstellt werden:

Odoo.yaml

apiVersion: "glasskube.eu/v1alpha1"
kind: Odoo
metadata:
  name: odoo
  namespace: odoo
spec:
  host: odoo.hostname.tld # hostname
  demoEnabled: true # Ob Odoo initial mit Demo-Daten befüllt werden soll.
kubectl apply -f Odoo.yaml

Damit ist die Installation abgeschlossen. Updates des Kubernetes Operators werden automatisiert Odoo updaten.

Wichtig Es muss ein DNS Eintrag auf den LoadBalancer bzw. den Ingress Host gesetzt werden. SSL-Zertifikate werden automatisch vom LoadBalancer bzw. cert-manager generiert, wenn ein ClusterIssuer konfiguriert ist.

Odoo Demo Daten

In der Kubernetes Custom-Resource-Definition kann angeben werden, ob Odoo initial mit Demo-Daten befüllt werden soll. Für Demonstrationen und ein erstes Ausprobieren ist es sinnvoll diesen Parameter auf true zu setzen, für den produktiven Einsatz ist das allerdings nicht empfohlen.

Achtung Nach der initialen Installation hat eine Änderung dieses Parameters keinen Einfluss mehr. Bestehende Odoo Demo Daten werden nicht gelöscht.

Odoo Backups

Der Glasskube Kubernetes Operator für Odoo sichert automatisiert die PostgreSQL Datenbank in einem MinIO Bucket im glasskube-system namespace.

Odoo Runbot für Entwickler

Odoo hat ein Runbot entwickelt, der automatisiert Odoo Instanzen für Git Branches erstellt. Dieses Tool ist besonders nützlich, wenn Enterprise oder Custom-Addons verwendet werden, da hier der Gesamte Odoo Source Code mit den Add-Ons zusammengeführt wird. Ein OCA (Odoo Community Association) Member hat eine Runbot ähnliche Version für die automatisierte Provisionierung von Odoo Instanzen in einem Kubernetes Cluster erstellt: Runboat

Fazit

Das offizielle Odoo Docker Image eignet sich nicht direkt für den produktiven Einsatz, da dieses keine Immutable Tags hat und die Persistenz der Asset-Bundles zu Problemen beim Versionsupdate führt. Mithilfe des Glasskube Odoo Docker Images und dem Glasskube Kubernetes Operators kann Odoo in wenigen Schritten in einem Kubernetes Cluster installiert werden.

Glasskube Operator auf GitHub

Unsere Lösungen für zuverlässige und skalierbare Infrastruktur

Skalieren Sie Ihre IT-Infrastruktur mühelos und betreiben Sie Ihre Anwendungen schnell und sicher mit unseren cloudbasierten Technologielösungen.

Testen Sie Glasskube kostenlos

Ihre Cloud Native Experten für zuverlässe IT-Infrastrukturlösungen und den automatisieren Betrieb von Open Source tools.