Make sure you’ve completed the Prerequisites before starting this guide.
Choose Your Bootstrap Mode
The platform offers three bootstrap modes depending on your needs:| Mode | Command | CNI | Nodes | Setup Time | Use Case |
|---|---|---|---|---|---|
| Dev-fast | bootstrap | kindnetd | 1 | ~120s | Daily development |
| Cilium | bootstrap --full | Cilium + Hubble | 2 | ~200s | CNI testing |
| Full | full-bootstrap | Cilium + Istio | 3 | ~250s | Full-stack validation |
Dev-Fast Setup (Recommended)
The dev-fast mode provides the fastest bootstrap experience with warm cluster support. After the initial setup, subsequent runs complete almost instantly if nothing has changed.Navigate to the project directory
Run the bootstrap command
- Create a Kind cluster with a single control-plane node
- Generate Kubernetes manifests using nixidy
- Pull and load required container images
- Deploy the full observability stack (Prometheus, Grafana, Loki, Tempo)
- Deploy Traefik ingress controller
- Deploy PostgreSQL database
- Deploy Garage object storage
Accessing Services
Once bootstrap is complete, you can access the platform services via NodePort on your localhost:Service Ports
| Port | Service | Credentials | Notes |
|---|---|---|---|
| 30081 | Traefik HTTP | - | Ingress controller |
| 30090 | Prometheus | - | Metrics database |
| 30093 | Alertmanager | - | Alert management |
| 30300 | Grafana | admin / admin | Dashboards & visualization |
Default Grafana credentials are
admin / admin. You’ll be prompted to change the password on first login.Verify Grafana
Open Grafana in your browser
Navigate to http://localhost:30300
Warm Cluster Support
One of the key features of dev-fast mode is warm cluster support. The bootstrap script uses hash-based detection to skip unnecessary work:- On subsequent runs, if the cluster and manifests haven’t changed, bootstrap completes instantly
- If only manifests changed, only the changed resources are reapplied (~10-15s)
- If the cluster configuration changed, a full rebuild occurs (~120s)
Alternative Bootstrap Modes
Cilium Mode
For testing with Cilium CNI and Hubble network observability:| Port | Service | Notes |
|---|---|---|
| 31235 | Hubble UI | Network flow visualization |
Full-Stack Mode
For testing the complete setup with Istio service mesh and ArgoCD:| Port | Service | Notes |
|---|---|---|
| 31235 | Hubble UI | Network flow visualization |
| 30080 | ArgoCD HTTP | GitOps controller |
| 30443 | ArgoCD HTTPS | GitOps controller (TLS) |
Full-stack mode also supports warm cluster. Use
full-bootstrap --clean to force a clean rebuild.Managing Your Cluster
Stop the Cluster (Preserve State)
To stop the cluster containers without deleting data:Restart a Stopped Cluster
To resume a stopped cluster:Delete the Cluster
To completely remove the cluster and all data:After
cluster-down, you’ll need to run bootstrap again to recreate the cluster.Working with Manifests
The platform uses nixidy to generate Kubernetes manifests from Nix expressions.Regenerate Manifests
If you modify any Nix files innixidy/:
manifests-result/ directory.
Apply Manifest Changes
After regenerating manifests, apply them to the cluster:Watch for Changes
To automatically regenerate and apply manifests when Nix files change:watchexec to monitor nixidy/ directory and automatically regenerate + apply manifests on any .nix file change.
Monitoring and Debugging
View Cluster Status
Quick Debug Command
Thedebug-k8s command shows a quick overview:
Check Logs
Cilium Network Observability (Cilium/Full mode only)
Next Steps
Now that your platform is running, you can:- Deploy applications: Use the companion microservice-app repository to deploy sample applications
- Explore dashboards: Check out the pre-configured Grafana dashboards at http://localhost:30300
- Monitor metrics: View Prometheus targets and metrics at http://localhost:30090
- Customize the stack: Modify the Nix configurations in
nixidy/to add or remove components
Troubleshooting
Bootstrap hangs or fails
If bootstrap gets stuck, check Docker is running and you have sufficient resources:Pods stuck in Pending state
Check cluster resources and events:Port conflicts
If you see port binding errors, make sure no other services are using the platform ports (30080-31235). You can check with:Images fail to pull
Check your internet connection and Docker daemon status:Warm cluster detection fails
If you want to force a specific behavior:For more detailed information about the different bootstrap modes and their internals, check the
docs/bootstrap-modes.md file in the repository.