Skip to main content

Running the workshop on your own laptop

The main workshop runs on a shared cluster where each pair gets an isolated sandbox. If you want to walk through Connect-to-your-cluster and the Crossplane 101 track on your own — outside the live workshop, with no shared infrastructure — this page is the full recipe. Everything runs in a single k3d cluster on your machine.

You do not need to clone this repo. Every manifest is fetched from public URLs; every image is pulled from public registries.

Prerequisites

ToolInstall hint
Dockerbrew install --cask docker on macOS (or better, Docker Desktop)
kubectlbrew install kubernetes-cli
helmbrew install helm
k3dbrew install k3d

You can use any local kubernetes installation (minikube/kind/...). Just beware of load balancer conflicts.

That's it. Crossplane is not a prerequisite — installing it is the first module of Crossplane 101.

1. Create the cluster

k3d cluster create crossplane-workshop-solo \
-p "8080:80@loadbalancer" \
--k3s-arg "--disable=traefik@server:0"

Two flags worth explaining. -p "8080:80@loadbalancer" forwards your host's port 8080 to the cluster's ServiceLB, which is where Envoy Gateway terminates traffic. --k3s-arg "--disable=traefik@server:0" turns off k3s's bundled traefik ingress controller — the workshop routes through Envoy Gateway (Gateway API), and two controllers fighting over port 80 ends with curl getting traefik's 404 page instead of the docs. When the cluster is up, kubectl cluster-info should show a k3d-crossplane-workshop-solo context.

2. Install Envoy Gateway

The workshop's routing is Gateway API-native and does not use Ingress:

helm install eg oci://docker.io/envoyproxy/gateway-helm \
--version v1.4.0 \
--namespace envoy-gateway-system --create-namespace \
--wait

3. Install the docs + wall + validator

One kubectl apply installs:

  1. the Docusaurus site (this one)
  2. the validator sidecar
  3. a Gateway listener on port 80
  4. an HTTPRoutes that expose / → docs, /team/local/ → the frontend you'll create in the Define-an-Application module, and /team/local/api/ → its backend
kubectl apply -f https://raw.githubusercontent.com/ricCap/crossplane-workshop/v0.2.0/gitops/solo/all.yaml

Wait for the docs pod to come up:

kubectl wait --for=condition=Available deploy/docs -n docs --timeout=180s

4. Open the workshop

Visit http://localhost:8080/. You should land on the same page you're reading now, served from your k3d cluster.

5. Do the modules

Follow Connect-to-your-cluster, then the Crossplane 101 modules, in order. Two differences from the workshop-day flow:

  • No kubeconfig download. You're already on the cluster where the modules run — kubectl config current-context is k3d-crossplane-workshop-solo.
  • Your pair ID is local. The validator reports a single synthetic pair called local, and the wall's tile at /team/local/ is wired to the frontend + backend Services that the Define-an-Application module's Application XR creates in the default namespace.

Each module's validation button will evaluate against your k3d cluster and flip green as you progress.

6. Clean up

k3d cluster delete crossplane-workshop-solo

What's intentionally missing

  • Sandbox isolation. You are both operator and participant; if you kubectl delete ns crossplane-system, you break your own setup. In the live workshop, each pair's sandbox means a mistake is isolated.
  • GitOps. The solo path applies raw YAML. No sync loop, no self-heal — if you want changes to stick, re-apply the manifests.
  • TLS. Traffic is plain HTTP on localhost:8080.

Troubleshooting

k3d cluster create fails with "port 8080 already allocated" : Another process is bound to 8080 on your host. Stop it, or pick a different host port (e.g. -p "18080:80@loadbalancer" and visit http://localhost:18080/). Use the same port in your browser.

helm install eg … fails with "cannot pull OCI chart" : Docker Hub rate-limits anonymous OCI pulls. Authenticate with docker login (any free Docker Hub account works) and retry.

Wall shows no tiles / /api/pairs returns an empty array : The VALIDATOR_SOLO env var isn't set. If you applied the manifest above, this should not happen; re-check with kubectl get deploy docs -n docs -o yaml | grep -A1 VALIDATOR_SOLO.

/team/local/ returns 404 before you've finished the Define-an-Application module : Expected. The frontend and backend Services don't exist yet — the Application XR in that module creates them. Once the XR goes Ready, the route starts working with no further action on your part.