1
About this architecture #
This document presents the SymphonyGrid lab in Red Hat's three-level Portfolio Architecture form — a logical view of what the system is, a schematic view of how it deploys across sites, and a detail view that animates one scenario: an elastic burst driven by KEDA, from task backlog to scale-out to drain and scale-in.
In scope
- IBM Spectrum Symphony 7.3.2 (eval) grid: RHEL management VMs, Windows Server 2019 compute VMs, all on OpenShift Virtualization.
- Self-hosted OpenShift 4.20 IPI on AWS (sym-aws), a second burst cluster (sym-burst), GitOps via Argo CD.
- KEDA-driven VM autoscaling from a live Symphony pending-task signal; RHSI/Skupper metric plane; per-VM WireGuard data plane.
Out of scope / status notes
- IBM Cloud ROKS remains the reference burst target but is parked pending an API key and VNI allowlist; current burst work targets sym-burst on AWS (decision D13).
- Production-grade scale-in (Host Factory KubeVirt provider) is designed, not built — KEDA scale-in is a hard kill, an accepted demo gap (D4).
- Not an official Red Hat or IBM publication; see footer.
2
Logical view #
Four tiers, no networking detail — the level at which the solution is argued, not wired.
3
Schematic view #
Deployment topology across sites. Connector color follows the Red Hat convention of encoding flow type; solid boxes are live, dashed are planned or currently torn down. Use the legend buttons to isolate one plane.
4
Detail view — a KEDA burst, step by step #
One scenario, animated slide by slide: how a Symphony task backlog becomes new Windows VMs — first inside sym-aws (Track A, live-proven 2026-07-11/12), then across clusters to sym-burst (Track B). Step through with the buttons, dots, or ← → keys.
5
Network detail #
The invariants below are the hard-won constraints of this grid — breaking any of them has a documented cost in days of debugging.
EGO host registration is hostname/IP-anchored: every host must use base port 7869 (7 consecutive ports from it), and there must be no NAT between grid hosts. Both flat layer-2 UDNs (10.10.0.0/20, 10.12.0.0/20) and the WireGuard hub (routes, never masquerades) exist to preserve this.
Proven outage on this deployment (2026-07-10): the UDN inherited the AWS jumbo pod-network MTU (8901) while Windows guests silently ignored DHCP option 26 and stayed at 1500 — masters sent ~3.8 KB LIM UDP payloads as jumbo frames Windows dropped, so compute hosts registered but sat unavail (matches IBM KB ibm16164145). Fix: pin the masters down to 1500 (Windows already defaults there), since the live UDN's MTU field is immutable.
EGO_DYNAMIC_HOST_WAIT_TIME must be set (this grid: 120s) or dynamic hosts silently never join; EGO_DYNAMIC_HOST_TIMEOUT (15M here) must be set or dead burst VMs linger forever as ghost hosts. WAN paths additionally need EGO_ENABLE_CHAN_KEEPALIVE=y with keepalives ≥180s and below the tunnel idle timeout.
OVN-Kubernetes primary-UDN port security means a UDN VM or pod can never relay traffic for another host, and nothing outside can dial in (no ClusterIP/NodePort path in). Every cross-boundary flow in this architecture therefore dials out: the shim pushes via the K8s API, Skupper links dial out from sym-burst, WireGuard peers dial out to the hub.
| Port(s) | Purpose | Notes |
|---|---|---|
| 7869 TCP+UDP | EGO base port — LIM | Identical on every host; 7 consecutive ports allocated from here |
| 7870 | vemkd (EGO_KD_PORT) | First client connection point |
| 7871 / 7872 / 7873 | PEM / egosc / repository service | Process manager, service controller, package distribution |
| 7874 / 7875 | SD admin / SD SDK | Session director |
| 31000–31019 | SSM ← clients (SSM_SDK_ADDR) | Pinned in sd.xml — OS-random by default, reassigned every restart |
| 31020–31039 | SSM ↔ SIM (SSM_SIM_ADDR) | Pinned; PLATCOMMDRV_TCP_KEEPALIVE_TIME=180 |
| 8050–8060 | symrest (this eval build) | Doc default is 8180 — discovered live, not assumed; HTTPS + Basic auth |
| 8080 / 8081 | symphony-metrics-server | /api/v1/pending for KEDA · /metrics for UWM |
| 51820 UDP | WireGuard | All peers dial out to wg-hub; inner net 10.20.0.0/24 |
| 8443 / 8080 | Symphony web GUI | TLS / non-TLS |
| 9443 / 9080 | Host Factory REST | Phase 5 |
| 1527 · 4046 · 9200–9202 / 9300–9302 | Derby DB · plc · Elasticsearch | Management-host internals |
6
Design decisions #
Locked decisions D1–D13; D14–D16 are proposed and awaiting a call.
/scale; scale-in is not grid-aware (accepted demo gap, Host Factory is the production path).7
Adapting this architecture #
If your inputs differ, re-derive these levers first (the Red Hat convention of naming what a reader must recompute):
- Scale trigger & threshold —
targetValue 8pending tasks and cooldown 300s are demo-sized; derive from your task duration × slot count. - SSM port ranges — two 20-port pinned ranges sized for a ~50-listener NLB budget; widen for more concurrent sessions.
- Burst compute shape —
d1instance type with dedicated CPU placement; re-derive from workload profile and metal node capacity.
- Interconnect — WireGuard hub is the lab answer for AWS↔AWS; IPsec/Direct Link apply for IBM Cloud; anything that NATs or proxies the grid plane is disqualified.
- Scale-in policy — KEDA hard-kills VMs; adopt the Host Factory provider before running workloads that cannot tolerate lost in-flight tasks.
- Image lifecycle — one golden DataSource per cluster today; D16's registry + DataImportCron model once multi-cluster.