Deployment: VM vs Kubernetes (HA)
Summary: Entscheidungshilfe für Enterprise-Kunden: OpenBao mit HA als klassisches VM-Cluster (Pakete + systemd + Raft) gegenüber OpenBao mit HA auf Kubernetes via Helm-Chart. Beide Varianten sind unterstützt; sie unterscheiden sich in Betriebsmodell, Sicherheitsannahmen und Abhängigkeitsgraph — nicht in den Vault-Kernfunktionen.
Sources: raw/docs/install.md, raw/docs/configuration/storage/raft.md, raw/docs/configuration/storage/postgresql.md, raw/docs/platform/k8s/index.md, raw/docs/platform/k8s/helm/examples/ha-with-raft.md, raw/docs/platform/k8s/helm/examples/ha-tls.md, raw/docs/platform/k8s/helm/examples/snapshot-cronjob.md, raw/docs/configuration/seal/, raw/docs/upgrading/.
Last updated: 2026-05-19
TL;DR — Empfehlung für Enterprise
Für eine zentrale, organisationsweite OpenBao-Instanz mit hohem Schutzbedarf lautet die übliche Empfehlung: HA-Cluster auf dedizierten VMs, idealerweise mit HSM- oder Cloud-KMS-basiertem Auto-Unseal, und K8s-Workloads konsumieren OpenBao über den External-Mode des Helm-Charts (Agent Injector / VSO / CSI; siehe kubernetes-platform).
Begründung in einem Satz: OpenBao ist üblicherweise die Wurzel des Vertrauens — sie sollte nicht von der Plattform abhängen, deren Secrets sie verwaltet.
Eine reine Helm-HA-Installation auf Kubernetes ist trotzdem die richtige Wahl, wenn (a) OpenBao ausschließlich K8s-Workloads bedient, (b) das Operations-Team K8s-first arbeitet, (c) Self-Service-Provisionierung und GitOps wichtiger sind als architektonische Entkopplung, und (d) ein verlässliches Auto-Unseal sowie ein gepflegter Storage-Class-Stack vorhanden sind.
Gemeinsame Basis
Beide Topologien nutzen typischerweise das gleiche Setup auf Vault-Ebene:
- 3 oder 5 Knoten mit Raft als Integrated Storage (source:
raw/docs/configuration/storage/raft.md). - Leader/Follower-Mechanik wie unter high-availability beschrieben — ein Knoten hält den Lock und ist active, die anderen sind standby und forwarden Schreibanfragen.
- Auto-Unseal empfohlen (Cloud-KMS, HSM via PKCS#11 oder
transit). - Mindestens zwei Audit-Devices mit unterschiedlichen Sinks.
- Periodische Raft-Snapshots als primäres Backup.
Die Unterschiede liegen darum herum — wie die Knoten provisioniert, gestartet, gepatcht, vernetzt und geschützt werden.
Variante A — HA auf VMs
Architektur
3 oder 5 dedizierte VMs (oder Bare-Metal), Paketinstallation via OS-Paketmanager (source: raw/docs/install.md), Lifecycle über systemd, integrierter Raft-Storage auf lokalem Block-Storage, ein externer L4-Load-Balancer (oder DNS-Round-Robin mit Health-Check) vor den API-Listenern.
Vorteile
- Geringer Abhängigkeitsgraph. Kein Kubernetes-Control-Plane, kein CNI, kein CSI im kritischen Pfad. Ein K8s-Vorfall kann OpenBao nicht mitreißen — wichtig, wenn OpenBao genau diesen Cluster mit Secrets versorgt (Bootstrap-Reihenfolge, Henne-Ei-Problem).
- Stärkere Isolation. VM-Grenze statt Pod-Grenze; passt zu klassischen Tiering-/Zonen-Konzepten (Bastion, Mgmt-VLAN, Hardened Zone) und zu Audit-Frameworks, die Co-Tenancy auf einem geteilten Kernel kritisch bewerten.
- HSM-Integration einfach. PKCS#11 gegen einen Netzwerk- oder lokal angebundenen HSM lässt sich über die
seal "pkcs11"-Stanza direkt einbinden (source:raw/docs/configuration/seal/). In Kubernetes ist Device-Passthrough in Pods zusätzlich aufwendig. - Vorhersagbare Performance. Keine Noisy-Neighbor-Effekte aus anderen Pods; CPU, RAM und Disk gehören OpenBao allein.
- Vertraute Betriebsmodelle. Patch-Management, Backup, Monitoring, IDS, Logging laufen über bestehende Enterprise-Werkzeuge (Konfigurationsmanagement wie Ansible, Image-Hardening per CIS-Baseline, journald + SIEM-Forwarder).
- Audit- und Compliance-Story einfacher. Eine Maschine = eine OpenBao-Rolle. Sehr klare Zuordnung von Identitäten, Netzwerkpfaden und Datenhaltung — etwas, das Auditoren in regulierten Branchen (Finanz, Gesundheit, Public Sector) bevorzugen.
- Zertifikatsmanagement geradlinig. TLS-CN entspricht typischerweise dem stabilen Hostname; keine Sonderlogik wie
leader_tls_servername, die im K8s-Fall nötig wird (source:raw/docs/platform/k8s/helm/examples/ha-tls.md). - HA-Upgrades planbar. Knoten-für-Knoten-Replacement mit klarer Leader-Handoff-Reihenfolge gemäß upgrading.
Nachteile
- Provisionierung ist manuelle Arbeit oder benötigt IaC.
bao operator init, Unseal-Verteilung,bao operator raft joinpro Knoten sind Schritte, die Sie über Ansible/Terraform/Cloud-Init scripten müssen. Helm tut das auf K8s implizit. - Kein eingebautes Self-Healing. Stirbt eine VM, muss ein Mechanismus (Hypervisor-HA, Cloud-AutoScalingGroup, externe Orchestrierung) sie neu erzeugen und der Cluster aufnehmen lassen. Auf K8s erledigt das der StatefulSet-Controller.
- OS-Lifecycle in eigener Verantwortung. Kernel-Patches, CVEs, Hardening, Compliance-Scans pro VM.
- Skalierung träger. Neue Knoten brauchen neue VMs — schneller als ein Pod-Restart geht das nicht.
- Netzwerk muss manuell modelliert werden. Load-Balancer, Firewall-Regeln, DNS, mTLS-PKI für Raft-Replikation — alles eigenständig.
- Mehr Infrastruktur insgesamt. VMs, Storage-Volumes, LB, Monitoring-Agents, Backup-Agents.
Wann diese Variante richtig ist
- OpenBao ist zentral und organisationsweit — auch für Nicht-K8s-Workloads (Legacy-Apps, Datenbanken, CI-Runner, Netzwerkgeräte, Cloud-IAM).
- Regulatorische Anforderungen (BaFin/PCI/HIPAA/BSI) verlangen klar getrennte Tiers oder HSM-basiertes Sealing.
- Es existiert ein eingespieltes klassisches Ops-Team mit IaC und Patch-Pipelines.
- OpenBao darf nicht vom selben Kubernetes-Cluster abhängen, den es absichert.
Variante B — HA auf Kubernetes via Helm
Architektur
StatefulSet mit drei Pods (openbao-0..2), persistente PVCs pro Pod, Headless-Service (openbao-internal) für die Raft-Peer-Kommunikation, regulärer Service als Client-Eintrittspunkt, ein optionaler Ingress/LB davor. Bring-up gemäß k8s-ha-setup:
helm install openbao openbao/openbao \
--set='server.ha.enabled=true' \
--set='server.ha.raft.enabled=true'
(source: raw/docs/platform/k8s/helm/examples/ha-with-raft.md)
Vorteile
- Deklarativer Bring-up. Eine Helm-Installation liefert ein 3-Knoten-Raft-Cluster; identische Reproduktion in Dev/Stage/Prod ist trivial.
- Self-Healing & Identitätsstabilität. Fällt ein Pod aus, startet der StatefulSet ihn mit gleicher Identität und gleichem PVC neu — der Raft-Cluster heilt sich von selbst, sofern Quorum erhalten bleibt.
- Nahtlose Workload-Integration. Der gleiche Chart liefert oder vernetzt sich mit Agent Injector, VSO und CSI (source:
raw/docs/platform/k8s/index.md) — Pods bekommen Secrets ohne Code-Änderungen. - Service-Registrierung. Über die
service_registration-Stanza erscheinen Active/Standby/Sealed als Pod-Labels — Kubernetes-Services können den aktiven Knoten direkt selektieren (source:raw/docs/platform/k8s/index.md). - GitOps-fähig. Helm-Values und CRDs lassen sich über ArgoCD/Flux verwalten; Drift-Detection und Pull-Requests inklusive.
- Snapshots als CronJob. Reguläre Raft-Snapshots laufen als Kubernetes-CronJob — kein eigener Scheduler nötig (source:
raw/docs/platform/k8s/helm/examples/snapshot-cronjob.md). - Schnelle Bereitstellung non-prod. Test- und Dev-Cluster sind in Minuten reproduzierbar.
Nachteile
- Harte Abhängigkeit von Kubernetes selbst. Control-Plane, etcd, CNI, CSI, Ingress — alle werden Teil des kritischen Pfads für die Wurzel des Vertrauens. Plattform-Vorfälle werden zu OpenBao-Vorfällen.
- Bootstrap-Zirkularität. Wenn der gleiche Cluster OpenBao für seine eigenen Workloads konsumiert: Wer entsperrt OpenBao, wenn nach einem kompletten Cluster-Restart erst OpenBao laufen muss, damit die Workloads starten? Lösbar (Cloud-KMS-Auto-Unseal), aber muss bewusst designt werden.
- Auto-Unseal faktisch verpflichtend. Shamir-Unseal nach jedem Pod-Restart manuell durchführen ist im K8s-Alltag nicht praktikabel (source:
raw/docs/platform/k8s/helm/examples/ha-with-raft.md, seal-unseal). Ohne Cloud-KMS oder HSM-Anbindung ist diese Variante nicht produktionstauglich. - TLS-Konfiguration fummelig. Per-Pod-DNS-Namen passen ohne Workaround nicht zum Zertifikats-CN; entweder
leader_tls_servernameje Pod oder ein Load-Balancer-Frontend (source:raw/docs/platform/k8s/helm/examples/ha-tls.md). - Geringere Isolation. Pods teilen den Kernel mit anderen Workloads; in Hochsicherheitsumgebungen reicht das oft nicht. Mitigation: dedizierte Node-Pools mit Taints, Pod-Security-Standards
restricted, eigene Namespaces, NetworkPolicies — alles zusätzliche Komplexität. - HSM/PKCS#11-Anbindung aufwändig. Device-Plugins oder externes HSM-Gateway nötig, um aus dem Pod auf Hardware zuzugreifen.
- PVC-Qualität entscheidet über Datensicherheit. Eine fehlerhaft konfigurierte StorageClass (z. B. RWX statt RWO, oder Block-Storage ohne fsync-Garantien) gefährdet Raft. Auf VMs ist die Disk-Semantik üblicherweise besser verstanden.
- Zwei Upgrade-Ebenen. Chart-Upgrade und Kubernetes-Upgrade müssen koordiniert werden; siehe upgrading zur HA-Upgrade-Reihenfolge.
- Operativer Skill-Mix breiter. Das Team braucht Vault- und Kubernetes-Expertise gleichzeitig — Troubleshooting durch CNI/Service/Endpoints/Pod hindurch ist anspruchsvoll.
Wann diese Variante richtig ist
- OpenBao bedient ausschließlich K8s-Workloads, idealerweise im selben Cluster.
- Die Plattform-Organisation ist K8s-nativ; klassisches VM-Management wäre der Sonderfall.
- Cloud-KMS oder zentrales
transit-Cluster für Auto-Unseal sind verfügbar. - Self-Service, GitOps und schnelle Reproduzierbarkeit überwiegen architektonische Entkopplung.
Direktvergleich
| Dimension | VM-HA | Kubernetes-HA (Helm) |
|---|---|---|
| Abhängigkeitsgraph | minimal (OS + LB) | breit (K8s-Control-Plane, CNI, CSI, Ingress) |
| Bring-up | manuell/IaC, mehrere Schritte | helm install + Init/Unseal/Join |
| Self-Healing | über Hypervisor/AutoScaling | nativ via StatefulSet |
| Auto-Unseal | optional (aber empfohlen) | faktisch verpflichtend |
| HSM/PKCS#11 | nativ einfach | nur über Device-Plugins / externes Gateway |
| Isolation | VM-Grenze | Pod-Grenze (Kernel geteilt) |
| TLS-Setup | geradlinig | erfordert leader_tls_servername oder LB-Vorbau |
| Backup | Snapshots via Cron/Skript | Snapshots via K8s-CronJob |
| Upgrade-Komplexität | eine Ebene (OpenBao) | zwei Ebenen (Chart + K8s) |
| Skill-Profil | klassisches Linux/Ops | K8s + Vault parallel |
| Compliance/Audit | bekanntes Tiering-Modell | erfordert zusätzliche Pod-/Namespace-Härtung |
| Reproduzierbarkeit non-prod | langsamer (VMs anlegen) | sehr schnell |
| Workload-Integration in K8s | über Agent/VSO/CSI im External-Mode | nativ inklusive |
| Bootstrap-Zirkularität | keine | möglich, muss designt werden |
Hybrides Muster (häufigste Enterprise-Lösung)
In der Praxis kombinieren viele Kunden beide Welten:
- Zentrales OpenBao-HA-Cluster auf VMs (3 oder 5 Knoten, HSM-Auto-Unseal, hinter LB, in eigener Sicherheitszone).
- Pro K8s-Cluster wird der Helm-Chart im External-Mode installiert (source:
raw/docs/platform/k8s/index.md): er bringt nur Agent Injector und/oder VSO/CSI mit und zeigt auf die externe OpenBao-Adresse. - Authentifizierung der K8s-Workloads gegen das zentrale OpenBao über die Kubernetes-Auth-Methode (TokenReview-API), pro Cluster eine Auth-Mount.
Dieses Muster liefert die operative Bequemlichkeit der K8s-Integration ohne die Wurzel des Vertrauens in den abhängigen Cluster zu legen.
Empfehlung für die Kundenpräsentation
- Default-Empfehlung: VM-HA + HSM-Auto-Unseal + K8s-Workloads über External-Mode.
- Alternative: Helm-HA auf K8s, wenn das Einsatzprofil rein K8s-zentriert ist und Cloud-KMS-Auto-Unseal verfügbar ist.
- Anti-Pattern: Helm-HA auf K8s, und dieser Cluster konsumiert OpenBao für seinen eigenen kritischen Pfad, ohne Cloud-KMS-Auto-Unseal und ohne dedizierten Node-Pool. Diese Konstellation explizit ausschließen.
Related pages
- high-availability — Leader/Standby-Mechanik unabhängig von Topologie
- k8s-ha-setup — Helm-Bring-up im Detail
- kubernetes-platform — Agent Injector, VSO, CSI; External-Mode
- storage — Raft als Default-Backend
- seal-unseal — Auto-Unseal-Optionen (KMS, HSM, transit)
- upgrading — HA-Upgrade-Reihenfolge
- audit — Audit-Devices, immer mindestens zwei
- configuration —
storage,seal,listener,service_registration