Back openDesk Edu for a sovereign, open-source education â every vote counts.
Vote nowSave products you love by clicking the heart icon.
A practical guide to deploying SCS Cloud in a Box (CIAB) â a single-node OpenStack+Kubernetes cloud infrastructure built on European open-source standards for digital sovereignty.
Der Sovereign Cloud Stack (SCS) stellt das Open-Source-Cloud-Infrastruktur-Framework fĂŒr Europa bereit. Seine Deployment-Engine, OSISM, verwaltet alles vom Bare-Metal-Provisioning bis hin zur Orchestrierung von OpenStack, Ceph und Kubernetes. WĂ€hrend der Cloud in a Box Guide Single-Node-Deployments abdeckt, erfordern produktive SCS-Umgebungen mehrere Nodes mit einer ordnungsgemĂ€Ăen Netzwerksegmentierung, hochverfĂŒgbaren Virtual IPs (VIPs) und Software-Defined Networking.
Dieser Leitfaden konzentriert sich speziell auf die Netzwerkebene eines OSISM-verwalteten SCS-Deployments â die Netzwerkzonen, die VIP-Architektur, die Interface-Rollen und die Konfigurationsmuster, die eine Multi-Node-Cloud betriebsbereit machen.
Ein OSISM-Cloud-Pod besteht aus mehreren Node-Rollen, von denen jede mit spezifischen Netzwerkzonen verbunden ist:
OSISM definiert bis zu sechs logische Netzwerkzonen. In einem Produktions-Deployment wird jede Zone einem eigenen VLAN und einem physischen Interface oder LAG zugeordnet:
| Zone | Standard-Interface | Zweck | Typische Geschwindigkeit |
|---|---|---|---|
| Management | eth0 / network_interface | Node-Provisioning, SSH, OSISM Ansible, DNS | 1 Gbit |
| API | api_interface | OpenStack API-Endpunkte (Keystone, Nova, Neutron, etc.) | 10â25 Gbit |
| Tunnel | tunnel_interface | OVN/OVS-Overlay-Traffic (VXLAN/Geneve encap) | 25â100 Gbit |
| Storage | storage_interface | Ceph Public & Cluster-Replikationsnetzwerk | 25â100 Gbit |
| External | neutron_external_interface | Provider-/physisches Netzwerk fĂŒr Floating IPs, Router | 10â25 Gbit |
| Migration | migration_interface | Live-Migration laufender VMs | 10â25 Gbit |
In kleineren Deployments können einige Zonen zusammengefasst werden â API und Management können beispielsweise ein 10-Gbit-Interface teilen, oder Tunnel und Storage können einen High-Speed-Link mit QoS-Tagging gemeinsam nutzen. Die Empfehlung der OSISM Bill of Materials fĂŒr die Produktion lautet:
OSISM ordnet Traffic-Typen benannten Interface-Rollen in environments/kolla/configuration.yml zu. Jede Rolle löst sich entweder in ein physisches Interface, ein VLAN-Sub-Interface oder einen Bond auf.
| Parameter | Standard | Empfohlen fĂŒr Produktion |
|---|---|---|
network_interface | eth0 | bond0.10 (Management-VLAN) |
api_interface | {{ network_interface }} | bond0.20 (API-VLAN) |
kolla_external_vip_interface | {{ network_interface }} | bond0.20 (identisch mit API) |
tunnel_interface | {{ network_interface }} | bond1 (dedizierter Data-Plane-Bond) |
migration_interface | {{ api_interface }} | bond0.30 (Migration-VLAN) |
neutron_external_interface | {{ network_interface }} | bond2 (dedizierter External-Bond auf Netzwerk-Nodes) |
storage_interface | (variiert) | bond1.40 (Storage-VLAN auf demselben Bond) |
Ein Control Node in der Produktion mit drei physischen NICs könnte Folgendes verwenden:
network_interface: "bond0"
api_interface: "bond0"
tunnel_interface: "bond1"
migration_interface: "bond0"
neutron_external_interface: "bond2"
kolla_external_vip_interface: "bond0"
Mit Netplan unter Ubuntu 24.04:
# /etc/netplan/01-osism.yaml
network:
version: 2
renderer: networkd
bonds:
bond0:
interfaces: [enp1s0f0, enp1s0f1]
parameters:
mode: 802.3ad
mtu: 1500
bond1:
interfaces: [enp2s0f0, enp2s0f1]
parameters:
mode: 802.3ad
mtu: 9000 vlans: vlan10: id: 10 link: bond0 mtu: 1500 addresses: ["10.1.10.10/24"] vlan20: id: 20 link: bond0 mtu: 1500 addresses: ["10.1.20.10/24"] vlan30: id: 30 link: bond0 mtu: 1500 addresses: ["10.1.30.10/24"] ethernets: bond2: mtu: 1500 addresses: [] # Keine IP â gebridged zu OVS br-ex
This gives you 3 bonds on 6 physical ports: a management bond for MGMT/API/migration VLANs, a high-speed bond for tunnel/storage with jumbo frames, and a dedicated bond for external provider network bridging.
---
## Virtual IPs (VIPs) â The Core of HA
The single most important networking concept in a multi-node OSISM deployment is the **Virtual IP (VIP)**. Without it, every OpenStack API call would need to know which control node is currently alive. The VIP provides a single, floating endpoint that follows the active controller.
### The Primary VIP: `kolla_external_vip_address`
All OpenStack API services (Keystone, Nova API, Neutron API, Glance, Cinder, Heat, Designate, etc.) are fronted by a single VIP defined as:
```yaml
# environments/kolla/configuration.yml
kolla_external_vip_address: "203.0.113.100"
kolla_external_fqdn: "cloud.example.com"
This IP address is not assigned to any single host permanently. It floats between the three control nodes via Keepalived running inside Docker containers managed by Kolla-Ansible.
The flow is:
203.0.113.100) on the kolla_external_vip_interfaceYou do not configure Keepalived directly â Kolla-Ansible generates the configuration from variables. The relevant parameters for fine-tuning are:
# environments/kolla/configuration.yml
keepalived_virtual_router_id: 51 # Eindeutig pro VLAN (1-255)
kolla_keepalived_vrrp_priority: 100 # Höher = höhere Wahrscheinlichkeit als Master
kolla_external_vip_interface: "bond0.20" # Interface, auf dem die VIP liegt
kolla_external_vip_address: "203.0.113.100"
The generated Keepalived config on each control node looks like:
vrrp_instance kolla_internal {
interface bond0.20
virtual_router_id 51
priority 100 # (101 auf bevorzugtem Master, 100 auf Backups)
advert_int 1
authentication {
auth_type PASS
auth_pass kolla
}
virtual_ipaddress {
203.0.113.100/24 dev bond0.20
}
}
Alle diese OpenStack-Dienste werden ĂŒber dieselbe VIP erreicht. HAProxy routet diese ĂŒber den Port:
| Dienst | Port | Backend-Nodes |
|---|---|---|
| Keystone (public) | 5000 | Alle Control |
| Keystone (admin) | 35357 | Alle Control |
| Nova API | 8774 | Alle Control |
| Neutron API | 9696 | Alle Control |
| Glance API | 9292 | Alle Control |
| Cinder API | 8776 | Alle Control |
| Designate API | 9001 | Alle Control |
| Heat API | 8004 | Alle Control-Nodes |
| Horizon (Dashboard) | 80/443 | Alle Control-Nodes |
ZusĂ€tzlich zur von Kolla verwalteten VIP können OSISM-Deployments Anycast VIPs fĂŒr den OVN Network Agent verwenden. Der ovn-network-agent ĂŒberwacht OVN-Datenbanken und synchronisiert Floating-IP-Routen. Optional kann er diese Routen ĂŒber Anycast VIPs auf Compute- oder Network-Nodes ankĂŒndigen, was Folgendes ermöglicht:
Dies wird pro Node konfiguriert:
ovn_network_agent:
anycast_vip: "203.0.113.200/32"
anycast_interface: "lo"
Ein minimal lebensfÀhiger Produktions-OSISM-Cluster verwendet:
Alle Nodes verbinden sich mit:
| VLAN | Zweck | Subnetz-Beispiel | Nodes |
|---|---|---|---|
| 10 | Management | 10.1.10.0/24 | Alle |
| 20 | API | 10.1.20.0/24 | Control + Network |
| 30 | Migration | 10.1.30.0/24 | Alle (Hypervisoren) |
| 40 | Storage (public) | 10.1.40.0/24 | Storage + Compute |
| 41 | Storage (cluster) | 10.1.41.0/24 | Nur Storage |
| 50 | Tunnel (OVN) | 10.1.50.0/24 | Alle (Compute + Network) |
| 100 | Externer Provider | 203.0.113.0/24 | Nur Network-Nodes |
Das Netzwerk-Layout wird in den Group Variables des Inventars definiert:
# inventory/group_vars/generic/network.yml
network_type: netplan
network_ethernets:
bond0:
mtu: 1500
interfaces: [enp1s0f0, enp1s0f1]
parameters:
mode: 802.3ad
lacp-rate: fast
network_vlans:
management:
id: 10
link: bond0
addresses:
- "10.1.10.{{ node_suffix }}/24"
gateway4: "10.1.10.1"
api:
id: 20
link: bond0
addresses:
- "10.1.20.{{ node_suffix }}/24"
migration:
id: 30
link: bond0
addresses:
- "10.1.30.{{ node_suffix }}/24"
Das node_suffix wird aus dem letzten Oktett der BMC-IP-Adresse abgeleitet, wodurch jeder Host in jedem VLAN eine vorhersagbare IP erhÀlt, ohne dass eine manuelle Zuweisung erforderlich ist.
Das VerstÀndnis des Netzwerkpfads wÀhrend des initialen Deployments hilft bei der Fehlerbehebung von KonnektivitÀtsproblemen.
Der Seed-Node betreibt DHCP, TFTP, PXE/iPXE sowie eine lokale APT- und Container-Registry:
Der Zielknoten erhÀlt eine IP im Management-VLAN vom DHCP des Seeds.
Sobald der Manager-Knoten online ist, ĂŒbernimmt er die Orchestrierung. Der Seed wird nach dieser Phase nicht mehr benötigt.
Nachdem das Networking konfiguriert ist, werden die Services entsprechend ihrer Rolle bereitgestellt:
# On the Manager node:
osism apply openvswitch -l control1,control2,control3
osism apply ovn -l control1,control2,control3
osism apply neutron -l control1,control2,control3
osism apply nova -l compute1,compute2,compute3
osism apply ceph -l storage1,storage2,storage3
Nachdem alle Services laufen, installiert Kolla-Ansible Keepalived und HAProxy:
osism apply kolla -l control1,control2,control3
Die VIP erscheint auf dem gewĂ€hlten Master. ĂberprĂŒfen Sie dies mit:
# On the master controller
ip addr show bond0.20 | grep 203.0.113.100
# From any management host
curl -k https://203.0.113.100:5000/v3
OSISM verwendet OVN (Open Virtual Network) als SDN-Controller, mit Open vSwitch auf jedem Hypervisor.
| Komponente | Rolle | Ort |
|---|---|---|
ovn-northd | Ăbersetzt Neutron-API-Aufrufe in OVN-logische Flows | Control nodes |
ovn-sb-db | Southbound-Datenbank (Zustand der logischen Flows) | Control nodes (RAFT) |
ovn-nb-db | Northbound-Datenbank (gewĂŒnschter Zustand) | Control nodes (RAFT) |
ovn-controller | Lokale OpenFlow-Programmierung auf jedem Hypervisor | Alle Compute- und Network-Knoten |
ovs-vswitchd | Open vSwitch Datapath Forwarding | Alle Compute- und Network-Knoten |
Jeder Hypervisor (Compute- oder Network-Knoten) verfĂŒgt ĂŒber:
br-int: Integration Bridge â hier verbinden sich alle VM-Ports, Router-Ports und Tunnel-Endpunktebr-ex: External Bridge â wird fĂŒr Provider-Netzwerke auf neutron_external_interface gemapptbr-add: ZusĂ€tzliche External Bridge fĂŒr ein zweites physisches Provider-Netzwerk# environments/kolla/configuration.yml
neutron_plugin_type: "ovn"
ovn_ovs_bridge_mappings: "physnet1:br-ex,physnet2:br-add"
neutron_bridge_name: "br-ex,br-add"
network_workload_interface: "vlan101,"
Der Parameter network_workload_interface verbindet OVS-Bridges mit physischen Interfaces. Das kommagetrennte Format mappt die Bridge-Namen positionsabhÀngig: vlan101 mappt auf br-ex, ein leerer Wert mappt auf br-add.
Erstellen eines externen (Provider-)Netzwerks, das Mandanten fĂŒr Floating-IPs nutzen können:
# environments/openstack/configuration.yml
network_external_name: "public"
network_external_provider_network_type: "flat"
network_external_provider_physical_network: "physnet1"
network_external_cidr: "203.0.113.0/24"
network_external_gateway_ip: "203.0.113.1"
network_external_allocation_pool_start: "203.0.113.100"
network_external_allocation_pool_end: "203.0.113.200"
network_external_dns_nameservers:
- "8.8.8.8"
- "9.9.9.9"
Anwenden:
osism apply network-external
Dies erstellt ein Neutron-Netzwerk namens public mit einem Flat- (untagged) Provider-Segment auf physnet1, das fĂŒr alle Projekte verfĂŒgbar ist.
FĂŒr VLAN-basierte Provider-Netzwerke verwenden Sie provider_network_type: "vlan" und setzen provider_segmentation_id auf die gewĂŒnschte VLAN-ID. FĂŒr Geneve-Mandantennetzwerke (der Standard in OVN) ist keine explizite Erstellung erforderlich â Neutron erstellt diese bei Bedarf.
Keepalived VRRP benötigt mindestens zwei Knoten fĂŒr das Failover, aber drei Knoten gewĂ€hrleisten ein echtes Quorum. Bei zwei Knoten kann ein Split-Brain-Szenario (Netzwerkpartitionierung) dazu fĂŒhren, dass beide Knoten die VIP beanspruchen. Bei drei Knoten erfordert auch der RAFT-Konsens, der von OVN-Datenbanken und Galera verwendet wird, eine Mehrheit (2 von 3).
Ceph reagiert empfindlich auf Latenz und Paketverlust. Platzieren Sie die Ceph-Replikation immer in einem dedizierten VLAN mit:
Der gesamte Datenpfad muss dieselbe MTU unterstĂŒtzen. Wenn Sie Jumbo Frames (9000) im Storage-Netzwerk verwenden, stellen Sie sicher, dass alle Switches, Router und NICs in diesem Pfad fĂŒr MTU 9000 konfiguriert sind. Nicht ĂŒbereinstimmende MTUs verursachen Paketverluste, die extrem schwierig zu debuggen sind (stille Verluste bei fragmentierten Paketen).
Erstellen Sie vor dem Deployment DNS A/AAAA-Records, die auf jede VIP verweisen:
| Record | Wert | Zweck |
|---|---|---|
cloud.example.com | 203.0.113.100 | PrimÀrer OpenStack-Endpunkt |
registry.example.com | 203.0.113.101 | Internes Container-Registry |
netbox.example.com | 203.0.113.102 | NetBox DCIM |
OSISM und Kolla-Ansible generieren wĂ€hrend des Deployments selbstsignierte Zertifikate fĂŒr diese FQDNs.
Wenden Sie ACLs an den Leaf-Switches an, um den Inter-VLAN-Traffic einzuschrÀnken:
| Quelle | Ziel | Ports | Grund |
|---|---|---|---|
| Management | Alle | SSH (22), SNMP (161) | Knotenzugriff |
| API | Control | 5000, 8774, 9696, ... | OpenStack APIs |
| Storage | Storage | 6789, 3300, 6800-7300 | Ceph Daemons |
| Tunnel | Alle | 6081 (Geneve), 4789 (VXLAN) | Overlay-Traffic |
Keepalived bietet einen track_script-Mechanismus, mit dem der Zustand von HAProxy ĂŒberwacht werden kann. Wenn HAProxy auf dem Master ausfĂ€llt, sollte Keepalived das Failover auslösen:
vrrp_script chk_haproxy {
script "/usr/bin/pgrep haproxy"
interval 2
fall 2
}
Dies wird automatisch durch Kolla-Ansible konfiguriert. Sie können den HAProxy-Status auf jedem Control Node ĂŒberprĂŒfen:
docker exec -it haproxy haproxy -f /etc/haproxy/haproxy.cfg -c
docker exec -it keepalived keepalived --dump-conf
Der Cloud in a Box-Guide zeigt, wie man eine Single-Node-SCS-Umgebung in etwa zwei Stunden bereitstellt. Dieses Setup verwendet intern VLAN 101 und Masquerading fĂŒr den externen Zugriff â das Networking ist auf Null-Konfiguration vereinfacht.
Der Ăbergang zum Produktivbetrieb bedeutet:
Die hier beschriebene Netzwerkarchitektur ist das Fundament, das SCS zu einer produktionsreifen, souverĂ€nen Cloud-Plattform macht. Jeder API-Aufruf, jede virtuelle Maschine und jede Storage-Operation flieĂt durch diese Netzwerkzonen â sie korrekt zu konfigurieren, ist der Unterschied zwischen einer Cloud, die funktioniert, und einer Cloud, die zuverlĂ€ssig funktioniert.