Walkthrough
Follow along in your own environment. Copy the commands and adapt them to match your setup. The walkthrough assumes you have completed the one-time environment setup and that docker, minikube, and kubectl all resolve on your PATH.
Complete the Hello Pico lab so the greeting value used here (Hello, Pico!) is meaningful. This lab reuses the same greeting, but delivered by a Pico that is hosted by a Manifold RuntimeEnvironment on Kubernetes instead of invoked directly from a shell on your laptop.
Step 1 — Create a working directory and copy the manifests
From the root of your local clone of the academy repository:
mkdir -p work/hello-pico-on-manifold && cd work/hello-pico-on-manifold
cp -r ../../labs/hello-pico-on-manifold/downloads/. .
ls -1Expected output (order-independent):
01-namespace.yaml
02-pico-engine.yaml
03-channel-service.yaml
04-topology-configmap.yaml
event.json
topology.yaml
verify.sh
topology.yaml is the Wrangler-declared InteractionTopology fragment authored for this lab. The four numbered YAMLs are what is applied to the cluster; event.json is the single event payload; verify.sh is the automatable check the walkthrough runs in Step 7.
Step 2 — Start a local minikube cluster
Start a dedicated minikube profile so this lab does not interfere with other clusters you may run (for example the crossplane-lab profile from the Hello Pico on Kubernetes lab):
minikube start --profile manifold-lab \
--driver=docker --cpus=2 --memory=4g \
--kubernetes-version=v1.31.0Confirm the cluster is Ready:
kubectl config current-context
kubectl get nodesExpected output:
manifold-lab
NAME STATUS ROLES AGE VERSION
manifold-lab Ready control-plane 1m v1.31.0
Step 3 — Read the Wrangler-declared topology
Before applying anything, read topology.yaml. This is the authoritative declaration of the runtime story for this lab: one Channel hello carrying one EventType hello.request, one Pico hello-world-pico subscribed to that Channel, producing one Observation.
cat topology.yamlThe rest of this walkthrough realizes this topology on Kubernetes. The Kubernetes objects you apply below are the concrete realization of what topology.yaml declares in Wrangler vocabulary; the topology itself is not applied to the cluster directly — Step 6 makes it reachable inside the cluster as a ConfigMap.
Step 4 — Create the Manifold RuntimeEnvironment Namespace
kubectl apply -f 01-namespace.yaml
kubectl get ns manifold --show-labelsThe manifold Namespace is the Manifold RuntimeEnvironment for this lab. Labels record its role: oe.academy/runtime-environment=manifold and oe.academy/runtime-substrate=kubernetes.
Step 5 — Deploy the hosted Pico engine
Apply the Pico engine Pod that plays the role of the in-process host for hello-world-pico, and wait for it to become Ready:
kubectl apply -f 02-pico-engine.yaml
kubectl -n manifold wait --for=condition=Ready --timeout=60s pod/pico-engineThe initial log line advertises the RuntimeEnvironment role:
kubectl -n manifold logs pod/pico-engineExpected output:
pico-engine: hosted by manifold on kubernetes; waiting for one event on channel 'hello'
The Pod is single-shot: it will accept exactly one event on channel hello (Step 7) and then Succeed.
Step 6 — Wire the Channel and publish the topology
Apply the Channel Service that realizes channels[0].name: hello from the topology, and the ConfigMap that publishes the topology fragment inside the cluster:
kubectl apply -f 03-channel-service.yaml
kubectl apply -f 04-topology-configmap.yaml
kubectl -n manifold get svc hello
kubectl -n manifold get cm hello-world-pico-on-manifold-topologyStep 7 — Send one event and verify one Observation
Run the shipped verification script. It plays the Control Surface role (a small Python-CLI-style shell command) by starting an in-cluster busybox client that opens one TCP connection to the Channel Service and writes event.json. The Pico engine consumes that one event, prints one Observation line, and exits.
bash verify.shExpected output ends with:
pico[hello-world-pico] observation: Hello, Pico!
verify: OK — one Observation 'pico[hello-world-pico] observation: Hello, Pico!' produced by hosted Pico
Step 8 — Capture the produced artifact
Capture the manifests you applied, the topology fragment, the event payload, and the observed log line into a single hello-world-pico-on-manifold/ directory — this is the lab’s produces: artifact:
mkdir -p build/hello-world-pico-on-manifold/manifests
cp 0*.yaml build/hello-world-pico-on-manifold/manifests/
cp topology.yaml build/hello-world-pico-on-manifold/
cp event.json build/hello-world-pico-on-manifold/
kubectl -n manifold logs pod/pico-engine \
| grep '^pico\[hello-world-pico\] observation:' \
> build/hello-world-pico-on-manifold/observation.txt
grep -Fqx 'pico[hello-world-pico] observation: Hello, Pico!' \
build/hello-world-pico-on-manifold/observation.txt \
&& echo "artifact OK"
ls -1 build/hello-world-pico-on-manifold \
build/hello-world-pico-on-manifold/manifestsobservation.txt is the runtime Observation the hosted Pico produced; it is the Phase 7 counterpart of the greeting.txt captured in the Hello Pico on Kubernetes lab.
Step 9 — Cleanup
kubectl delete -f 04-topology-configmap.yaml --ignore-not-found
kubectl delete -f 03-channel-service.yaml --ignore-not-found
kubectl delete -f 02-pico-engine.yaml --ignore-not-found
kubectl delete -f 01-namespace.yaml --ignore-not-found
minikube delete --profile manifold-lab
cd ../.. && rm -rf work/hello-pico-on-manifoldTroubleshooting
- If
kubectl wait ... pod/pico-enginetimes out on Ready, runkubectl -n manifold describe pod/pico-engineand check thebusybox:1.36image pull. Network access to Docker Hub is required the first time. - If the Pod is Ready but
verify.shreports the expected line was not found, re-runkubectl -n manifold logs pod/pico-enginemanually: some minikube drivers buffer the very first log line. The Pod’sSucceededphase is the authoritative signal that the single event was consumed. - The Pico engine Pod is deliberately single-shot. If you want to send another event, delete the Pod and reapply
02-pico-engine.yaml. Multi-event topologies are out of scope for this lab. - If the sender Pod created by
verify.shis left behind for any reason, remove it withkubectl -n manifold delete pod event-sender --ignore-not-found.
Next
Compare your work against the reference solution.