You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit bdfcd32
Browse filesBrowse the repository at this point in the historyBrowse files
fix(capstone): published loopback NodePorts; minikube on Docker Engine + containerd (#10)
* chore(plans): plan published loopback NodePorts replacing tunnels
* chore(plans): keep host ports; map 127.0.0.1:host:nodePort
* chore(plans): no Docker Desktop assumption; isolation rule
* ci: add forbidden-syntax gate for tunnels and non-loopback ports
* feat(capstone): endpoints lib and show-endpoints for published NodePorts
* demo(capstone): group A demos use published NodePorts
* demo(capstone): group B demos and walkthrough use published NodePorts
* feat(capstone): publish NodePorts on 127.0.0.1 at profile creation
* chore(capstone): setup scripts and config text describe published NodePorts
* chore(capstone): remove stale nested 17-capstone copy
* chore(capstone): delete SSH tunnel machinery
* docs: describe published NodePorts; add DRA-017; fix deck trace notes
* chore(plans): archive executed nodeports plan
* docs(deck): correct stale KEDA HTTP add-on status in speaker notes
* chore: untrack bytecode and ignore __pycache__
* fix(capstone): address validation findings for published NodePorts
* fix(capstone): second round of NodePort validation fixes
* fix(capstone): CRI-O + crun runtime; reset node FORWARD DROP; registry addon at start
* docs: CRI-O + crun runtime (DRA-018); lessons on node FORWARD DROP
* fix(capstone): local-path default StorageClass so non-root pods can write volumes
* docs: record local-path StorageClass in DRA-018 and lessons
* chore(plans): plan Docker Engine + containerd migration for the capstone
* feat(capstone): docker-backed endpoint helpers and image pipeline lib
* feat(capstone): capstone/<svc>:v1 images with pullPolicy Never
* feat(capstone): build-image uses docker build + minikube image load
* chore(scripts): Docker Engine prereq audit; podman only as optional CRC tooling
* demo(capstone): demos check capstone/<svc> images; build + load
* feat(capstone): profile on Docker Engine + containerd; cluster scripts use image load
* docs: Docker Engine setup; podman only for the optional CRC appendix
* docs: DRA-019 Docker Engine + containerd; example README and diagram
* docs: onboarding and chapters on Docker Engine; rootless lessons kept as history
* ci: scan 5 keeps podman/rootless/CRI-O scoped to the CRC appendix
* fix(capstone): set SERVICES after images.sh is sourced
* docs(lessons): summarize why minikube moved off rootless podman
* fix(capstone): accept LoadBalancer Services (they allocate nodePorts) in endpoint checks
* fix(capstone): build-image waits for the Deployments it restarts
* fix(services): gRPC clients use the native DNS resolver (c-ares took ~3 s)
* fix(capstone): build-image waits for replaced pods to finish terminating
* docs: record the live verification on Docker Engine + containerd
* fix(capstone): validation round — Fedora/RHEL hosts, gate coverage, build-image robustness, lesson tense
* fix(capstone): clearer VM-engine note
* chore(plans): archive executed docker migration plan
| Packaging | Helm (umbrella chart + per-service subcharts), podman | One chart tree for the whole system; images built on the host, pushed to the in-cluster registry|
85
-
| Substrate | Kubernetes v1.32 on minikube (rootless podman driver, containerd) | The whole system on one 24 GB profile |
84
+
| Packaging | Helm (umbrella chart + per-service subcharts), Docker Engine | One chart tree for the whole system; images built on the host and loaded into the minikube node|
85
+
| Substrate | Kubernetes v1.32 on minikube (Docker driver, containerd + runc) | The whole system on one 24 GB profile |
Copy file name to clipboardExpand all lines: _docs/02-kubernetes-substrate.md
+11-1Lines changed: 11 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -100,7 +100,17 @@ a laptop but also concentrates failure modes that a real multi-node cluster woul
100
100
spread out. Where those single-node realities bite — resource ceilings, node-level
101
101
decay, the operational care a long-lived single-node cluster needs — they're collected
102
102
as operational gotchas rather than mixed into the conceptual material here, because
103
-
they're particular to this deployment choice rather than to data mesh as a pattern.
103
+
they're particular to this deployment choice rather than to data mesh as a pattern. The
104
+
profile is a Docker container (the docker driver) running containerd with the runc
105
+
runtime, sized by `MINIKUBE_MEMORY`, `MINIKUBE_CPUS` and `MINIKUBE_DISK`.
106
+
107
+
Host access follows the same single-node logic. The capstone's UIs and service
108
+
endpoints are NodePorts published on `127.0.0.1` when the minikube profile is created
109
+
(`--ports=127.0.0.1:<hostPort>:<nodePort>`), never SSH tunnels or port-forwarding. <!-- forbidden-ok -->
110
+
The ports are fixed at creation, so changing the set means recreating the profile with
111
+
`./scripts/setup-capstone-profile.sh --replace`. `--replace` deletes and recreates the cluster, so run `./scripts/bootstrap-capstone.sh` again afterwards. Run the workshop in isolation: shut down
112
+
CRC, other minikube profiles, and other workloads first, so the host ports are free.
113
+
`./scripts/show-endpoints.sh` prints what is published and reachable.
104
114
105
115
Next, the services themselves: what a data product looks like in this build, the
106
116
order-service template the others follow, and how each one is packaged and shipped.
Copy file name to clipboardExpand all lines: _docs/11-running-on-openshift-crc.md
+8-5Lines changed: 8 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -7,7 +7,7 @@ duration: 40 min
7
7
8
8
[Chapter 3]({{ '/docs/02-kubernetes-substrate/' | relative_url }}) built the case for
9
9
Kubernetes as the mesh's substrate and brought the capstone up on minikube via Helm —
10
-
NodePorts, a stable SSH tunnel, a local image registry. That's a real deployment, and
10
+
NodePorts published to loopback, a local image registry. That's a real deployment, and
11
11
everything in the reading set up to the [summary]({{ '/docs/10-summary/' | relative_url }})
12
12
assumes it. But "deploy it to Kubernetes" and "deploy it to OpenShift" are not the same
13
13
sentence. OpenShift adds opinions on top of plain Kubernetes — Security Context
@@ -45,6 +45,8 @@ documenting the OpenShift-native counterpart.
45
45
You don't need a paid subscription or a cloud account. **OpenShift Local** (CRC —
46
46
"CodeReady Containers") runs a real, single-node OpenShift cluster in a local VM.
47
47
48
+
This appendix uses podman (and `oc`) on the host to build and push to the integrated registry; the minikube path uses Docker Engine. Podman is needed only here. <!-- forbidden-ok -->
49
+
48
50
1.**Create a free Red Hat Developer account.** Go to
49
51
[developers.redhat.com](https://developers.redhat.com), register or log in. It's free
50
52
and gives you access to OpenShift Local and the pull secret.
@@ -168,12 +170,13 @@ datamesh-infra`, which is worth knowing when debugging a pod stuck in
168
170
`CreateContainerConfigError`with an SCC-related event — it's the same RoleBinding under
169
171
the hood.
170
172
171
-
### 2. Routes, not port-forward/NodePort
173
+
### 2. Routes, not published NodePorts
172
174
173
175
The minikube path this capstone uses elsewhere in the reading set exposes services via
174
-
NodePort, reached over a stable SSH tunnel because minikube has no cluster-native router.
175
-
OpenShift has one built in: a `Route` object hands a Service a real external hostname,
176
-
served by the cluster's router, with no tunnel to keep alive. The chart defines two —
176
+
NodePorts published to `127.0.0.1` when the profile is created, because minikube has no
177
+
cluster-native router. OpenShift has one built in: a `Route` object hands a Service a
178
+
real external hostname, served by the cluster's router, with nothing to publish on the
179
+
host. The chart defines two —
177
180
`templates/route.yaml`ranges over the same `services:` map and emits a Route for any
178
181
service with `route: true` set (currently just `graphql-gateway`), and `apicurio.yaml`
179
182
wires its own Route directly since Apicurio isn't part of that map:
0 commit comments