Skip to content

Commit ab9c4aa

Browse files
Strengthen Hybrid Mesh docs per VP editorial feedback
- Add Problem→Solution table at top of _index.md (Service Mesh + AI ops framing) - Clarify 3-cluster requirement explicitly (single-cluster not supported) - Expand prerequisites: OCP version, storage class, RHOAI/GPU, Lightspeed - Document values-secret.yaml.template secrets table with all 6 secret names - Add Verify the installation section with concrete oc/bash commands (ACM, Skupper, OLSConfig, RHOAI, Industrial Edge, console links) - Add ASCII topology diagram in architecture.md showing hub+spoke+Skupper VAN Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 9ba61ce commit ab9c4aa

3 files changed

Lines changed: 176 additions & 12 deletions

File tree

content/patterns/hybrid-mesh-platform/_index.md

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,19 @@ contributor:
4444

4545
**Maintainer:** Maximiliano Pizarro, Specialist Solution Architect at Red Hat
4646

47-
> **Your journey:** Install via the Validated Patterns framework (`./pattern.sh install`), connect three OpenShift clusters (hub + east + west) through ACM managedClusterGroups, and observe IoT sensor data across Grafana and Developer Hub. The pages below follow one continuous story — concept, install, operate, scaffold — so you can read straight through or jump to any chapter.
47+
## The problem this pattern solves
48+
49+
Operating a multi-cluster OpenShift fleet creates three compounding challenges that a Service Mesh alone cannot address:
50+
51+
| Challenge | Without this pattern | With Hybrid Mesh Platform |
52+
| --- | --- | --- |
53+
| **Cross-cluster connectivity** | Site-to-site VPNs, manual firewall rules per pair of clusters | Skupper Virtual Application Network — outbound-only mTLS, no inbound firewall changes |
54+
| **Fleet governance drift** | Each cluster managed independently; configurations diverge over time | Single `main` branch drives hub + east + west via ACM + dual GitOps (PUSH ApplicationSet + PULL clustergroup) |
55+
| **AI-assisted operations** | Operators react to incidents by parsing dashboards and YAML | OpenShift Lightspeed + MCP Gateway let operators act on platform state in natural language, reducing MTTA on infrastructure incidents |
56+
57+
**Goal:** This pattern combines Red Hat Service Mesh for secure inter-service connectivity with OpenShift AI (MaaS + vLLM) and OpenShift Lightspeed + MCP for natural-language platform operations — giving teams centralized GitOps governance, secure cross-cluster communication, and AI-assisted incident response in a single deployable reference architecture.
58+
59+
> **Your journey:** Install via the Validated Patterns framework (`./pattern.sh install`), connect three OpenShift clusters (hub + east + west) through ACM `managedClusterGroups`, and observe IoT sensor data across Grafana and Developer Hub. The pages below follow one continuous story — concept, install, operate, scaffold.
4860
4961
## What is Hybrid Mesh Platform?
5062

@@ -55,7 +67,9 @@ contributor:
5567
- **OpenShift Service Mesh 3** in **ambient mode** provides ztunnel-based L4 encryption and optional waypoint L7 policy across all clusters.
5668
- **Connectivity Link (Kuadrant)** layers API-aware ingress policies — rate limiting, auth, DNS/TLS automation — on top of Gateway API.
5769

58-
**Tested on:** Red Hat OpenShift Container Platform **4.17+** on **AWS** (hub + east spoke + west spoke). See [Cluster sizing](cluster-sizing) for recommended instance types.
70+
**Tested on:** Red Hat OpenShift Container Platform **4.17+** on **AWS** (hub + east spoke + west spoke, 3 workers each).
71+
72+
**Multi-cluster topology:** this is a **hub + two spokes** pattern (not single-cluster). All three clusters are required; standalone single-cluster deployment is not supported by default. See [Cluster sizing](cluster-sizing) for minimum instance types per role.
5973

6074
**Implementation repo:** [hybrid-mesh-platform](https://github.com/maximilianoPizarro/hybrid-mesh-platform) — Validated Patterns layout (`clustergroup`, Vault + External Secrets, ACM managedClusterGroups).
6175

content/patterns/hybrid-mesh-platform/architecture.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,37 @@ Spokes remain the execution venues for application namespaces, data-plane compon
2121
| **Observability** | Aggregated metrics, logging, and tracing strategies start at the hub and uniform dashboards span spokes. |
2222
| **GitOps consistency** | A single Git revision (`main`) with region paths drives spoke drift correction. |
2323

24+
## Multi-cluster topology: three required clusters
25+
26+
This pattern requires **three OpenShift clusters** — not a single-cluster deployment. The topology follows the Validated Patterns hub-spoke model:
27+
28+
```
29+
┌──────────────────────────────────────┐
30+
│ Hub cluster (OpenShift on AWS) │
31+
│ ACM · Argo CD · Developer Hub · RHOAI│
32+
│ ACS Central · Grafana · Skupper · │
33+
│ Kuadrant · OpenShift Lightspeed · MCP│
34+
└──────┬─────────────────┬──────────────┘
35+
ACM push │ │ ACM push
36+
GitOps │ │ GitOps
37+
┌──────▼───────┐ ┌──────▼───────┐
38+
│ East spoke │ │ West spoke │
39+
│ Industrial │ │ Industrial │
40+
│ Edge · Kafka │ │ Edge · Kafka │
41+
│ Camel K · ML │ │ MirrorMaker │
42+
│ DevSpaces │ │ Skupper │
43+
└──────────────┘ └──────────────┘
44+
◄────────── Skupper VAN (mTLS, outbound-only) ──────────►
45+
```
46+
47+
Hub and spokes communicate over a **Skupper Virtual Application Network** — outbound-only mTLS tunnels, no inbound firewall rule changes needed. The hub's `ApplicationSet` pushes spoke charts; each spoke's local Argo CD pulls its `clusterGroup` from Git autonomously.
48+
2449
## Platform architecture overview
2550

2651
![Hub-spoke platform — Git paths, ApplicationSet, Skupper VAN, and per-cluster components](/images/hybrid-mesh-platform/arch-hub-spoke-flow.png)
52+
2753
*Single `main` branch: hub at `charts/region/hub`, spokes at `charts/region/east` and `charts/region/west`, shared charts under `charts/all/`.*
54+
2855
## Follow the request — one temperature reading end to end
2956

3057
When a machine sensor on the **east** spoke publishes a temperature sample, the path is: **MQTT** (`messaging` broker) → **Camel K** (`mqtt-to-kafka` integration) → **Kafka** (`dev-cluster` topic) → optional **ML scoring** (KServe) → **line-dashboard** WebSocket consumer. In parallel, **Thanos Querier** on east scrapes Istio and Kafka metrics; a **Skupper Connector** (`prometheus-east`) tunnels HTTP to the hub, where **Grafana** datasource `prometheus-east` plots the series. The **Hub Gateway** can route browser traffic to the east line-dashboard via **spoke-gateway** and Skupper listener `ie-gateway-east`. Developer Hub **Topology** shows the same pods when the catalog entity carries `backstage.io/kubernetes-cluster: east` and spoke API tokens are synced.

content/patterns/hybrid-mesh-platform/getting-started.md

Lines changed: 133 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -77,17 +77,34 @@ Use cluster names **`hub`**, **`east`**, and **`west`**. Namespace **`stackrox`*
7777

7878
## Prerequisites
7979

80-
- Red Hat OpenShift Container Platform **4.20** (reference version; 4.14+ supported per cluster)
81-
- **Three clusters:** one hub, one east-region spoke, one west-region spoke (ACM labels drive placement)
82-
- **Helm 3** on your workstation or CI runner (`helm version`)
83-
- **Git** client and hosting account (GitHub in examples)
84-
- **`oc` CLI** logged into the hub as cluster-admin for ACM import (recommended)
85-
- Network access to GitHub (or your fork) and container registries from all clusters
80+
### OpenShift clusters
81+
82+
| Requirement | Value |
83+
| --- | --- |
84+
| **OpenShift version** | 4.17+ (tested on 4.20 on AWS) |
85+
| **Topology** | **3 clusters** — one hub, one east spoke, one west spoke (single-cluster deployment is not supported by default) |
86+
| **Storage class** | Dynamic provisioner required on all clusters (AWS gp3-csi or equivalent). Kafka, Gitea, Quay, and Vault all require `PersistentVolumeClaim`. |
87+
| **Network** | All clusters must reach your Git fork (GitHub by default) and public container registries, or mirrored equivalents. |
88+
89+
### Hub cluster — additional requirements
90+
91+
| Operator / feature | Requirement |
92+
| --- | --- |
93+
| **OpenShift AI (RHOAI)** | Required for MaaS / vLLM inference. Needs Node Feature Discovery and GPU operator **only** if you enable GPU-accelerated models. CPU-based inference (Qwen3 / Granite on CPU) works without GPU. |
94+
| **GPU (optional)** | NVIDIA or AMD GPU node for accelerated vLLM. Without GPU, enable `modelServing.cpuOnly: true` in `values-hub.yaml`. |
95+
| **OpenShift Lightspeed** | Requires `OLSConfig` CRD and an OpenAI-compatible endpoint (MaaS on hub or external). |
96+
| **Vault** | HashiCorp Vault is deployed by the pattern operator as the secrets backend. |
97+
98+
### Workstation
99+
100+
- **`oc` CLI** logged into the hub as `cluster-admin` for ACM import
101+
- **Helm 3** (`helm version`)
102+
- **Git** client and a GitHub (or Gitea) account
86103

87104
### Network requirements (connected environments)
88105

89-
1. Access to public container registries (or mirrored equivalents)
90-
2. Access to your Git repository (fork of `hybrid-mesh-platform`)
106+
1. Access to public container registries (or mirrored equivalents) from all clusters
107+
2. Access to your Git fork from all clusters
91108

92109
### Cluster sizing (AWS — OpenShift 4.20)
93110

@@ -129,13 +146,37 @@ Update `main.gitops.repoURL` in `values-global.yaml` and cluster domains in `ove
129146

130147
## Step 2: Configure secrets and cluster domains
131148

132-
Copy and edit secrets:
149+
Copy the secrets template and edit before installation. **Do not commit `values-secret.yaml` to Git.**
133150

134151
```bash
135152
cp values-secret.yaml.template values-secret.yaml
136153
```
137154

138-
Set hub and spoke cluster domains in override files before install. See [MIGRATION.md](https://github.com/maximilianoPizarro/hybrid-mesh-platform/blob/main/MIGRATION.md) for the mapping from legacy RHDP-injected secrets.
155+
### Required secrets (values-secret.yaml)
156+
157+
The Validated Patterns secrets framework (Vault + External Secrets Operator) reads `values-secret.yaml` at install time and populates Vault. The following secrets are defined in the template:
158+
159+
| Secret name | Fields | When required |
160+
| --- | --- | --- |
161+
| `config-demo` | `secret` | Always (auto-generated if left as `onMissingValue: generate`) |
162+
| `kairos-ai-credentials` | `api-key` | When Kairos SmartScaling AI features are enabled on spokes |
163+
| `openshift-ai-maas-credentials` | `OPENAI_API_KEY`, `OPENAI_API_BASE` | When OpenShift AI / MaaS inference is enabled on the hub |
164+
| `mcp-gateway-argocd` | `token` | When MCP Gateway is enabled (OpenShift Lightspeed integration) |
165+
| `workshop-users` | `defaultPassword` | Workshop Showroom (demo only; use OAuth in production) |
166+
| AWS credentials | `aws_access_key_id`, `aws_secret_access_key` | Only if using ACM ClusterPools to provision new clusters |
167+
168+
Fields marked `onMissingValue: generate` are auto-generated by Vault for demo environments. For production, set them to `onMissingValue: error` and provide values explicitly.
169+
170+
Set hub and spoke cluster domains in override files before install:
171+
172+
```bash
173+
# Edit your cloud provider override (AWS example):
174+
vi overrides/values-aws-hub.yaml
175+
vi overrides/values-aws-east.yaml
176+
vi overrides/values-aws-west.yaml
177+
```
178+
179+
See [MIGRATION.md](https://github.com/maximilianoPizarro/hybrid-mesh-platform/blob/main/MIGRATION.md) for the mapping from legacy RHDP-injected secrets.
139180

140181
## Step 3: Install with Validated Patterns
141182

@@ -325,9 +366,91 @@ oc get job -n developer-hub -l job-name=developer-hub-spoke-token-sync-hook
325366

326367
Never commit registry passwords to Git. Generate dockerconfig and pass via Helm at upgrade time if you enable Quay push from pipelines.
327368

369+
## Verify the installation
370+
371+
Run these checks after all sync waves complete to confirm the pattern is healthy. Run each command from the hub cluster unless noted.
372+
373+
### Fleet and GitOps
374+
375+
```bash
376+
# ACM: east and west must be Available
377+
oc get managedcluster
378+
379+
# Hub clustergroup: all Applications Synced
380+
oc get applications -n openshift-gitops
381+
382+
# ApplicationSet: spoke apps generated
383+
oc get applicationset fleet-spoke-push -n openshift-gitops
384+
oc get applications -n openshift-gitops | grep spoke-components
385+
```
386+
387+
### Service Interconnect (Skupper)
388+
389+
```bash
390+
# Hub VAN: sitesInNetwork must equal 3 (hub + east + west)
391+
oc get site hub -n service-interconnect \
392+
-o jsonpath='sitesInNetwork={.status.sitesInNetwork}{"\n"}'
393+
394+
# Skupper listeners ready on hub
395+
oc get listeners -n service-interconnect
396+
```
397+
398+
### OpenShift Lightspeed (MCP Gateway)
399+
400+
```bash
401+
# OLSConfig must be Available
402+
oc get olsconfig cluster -o jsonpath='{.status.conditions[?(@.type=="Ready")].status}{"\n"}'
403+
404+
# OpenShift Lightspeed pods running on hub
405+
oc get pods -n openshift-lightspeed
406+
407+
# MCP Gateway pods running on hub
408+
oc get pods -n mcp-gateway
409+
```
410+
411+
### OpenShift AI / RHOAI
412+
413+
```bash
414+
# DataScienceCluster components: all Managed / Ready
415+
oc get datasciencecluster default-dsc \
416+
-o jsonpath='{range .status.installedComponents[*]}{.name}: {.managementState}{"\n"}{end}'
417+
418+
# Model serving pods (if enabled)
419+
oc get pods -n rhods-model-mesh-serving 2>/dev/null || \
420+
oc get pods -n modelmesh-serving 2>/dev/null
421+
```
422+
423+
### Industrial Edge (run on each spoke)
424+
425+
```bash
426+
# Switch to east or west context
427+
oc config use-context east # adjust to your kubeconfig context name
428+
429+
# Sensors, Kafka, and Camel K running
430+
oc get pods -n industrial-edge-tst
431+
oc get kafka dev-cluster -n industrial-edge-tst -o jsonpath='{.status.conditions[0].type}{"\n"}'
432+
433+
# Line dashboard accessible
434+
oc get route line-dashboard -n industrial-edge-tst
435+
```
436+
437+
### Console links (hub — 19 expected)
438+
439+
```bash
440+
# Log in first so OAuth-protected links get a bearer token
441+
oc login --token=<hub-token> --server=<hub-api-url>
442+
443+
# Expect 19 OK (HTTP 200) on a full hub install
444+
MIN_OK_CODE=200 bash scripts/verify-console-links.sh
445+
```
446+
447+
If any check fails, see the [extended troubleshooting guide](https://maximilianopizarro.github.io/hybrid-mesh-platform/validatedpatterns-docs/troubleshooting.html) and the [Validation Guide](https://maximilianopizarro.github.io/hybrid-mesh-platform/validation-guide.html).
448+
328449
## References
329450

330451
- [ACM documentation](https://docs.redhat.com/en/documentation/red_hat_advanced_cluster_management_for_kubernetes/2.16/html/about/welcome-to-red-hat-advanced-cluster-management-for-kubernetes)
452+
- [OpenShift AI documentation](https://docs.redhat.com/en/documentation/red_hat_openshift_ai_self-managed)
453+
- [OpenShift Lightspeed documentation](https://docs.redhat.com/en/documentation/openshift_lightspeed)
331454
- [Multicloud GitOps Validated Pattern](/patterns/multicloud-gitops)
332455
- [RHDP install playbook and extended docs](https://maximilianopizarro.github.io/hybrid-mesh-platform/validatedpatterns-docs/)
333456
- [ApplicationSet Generators](https://argo-cd.readthedocs.io/en/stable/operator-manual/applicationset/Generators/)

0 commit comments

Comments
 (0)