A hands-on project to learn distributed systems and Kubernetes by building a production-grade airgap environment on local VMs.
See docs/architecture.md for the full system overview.
| Layer | Components |
|---|---|
| API | Go 1.26, stdlib net/http, idempotency middleware |
| Cluster | K3s (arm64), Flannel, MetalLB, Traefik v3 |
| Databases | Redis 7 HA Sentinel + PostgreSQL 16 (CloudNativePG) |
| Observability | Prometheus + Grafana + Loki + Alloy + Tempo + OpenTelemetry |
| Security | OPA Gatekeeper + PSS + NetworkPolicies + Falco + Cosign |
| Secrets / TLS | Vault HA (Raft) + cert-manager + VSO + mTLS |
| GitOps / CI | ArgoCD + Gitea Actions + Argo Rollouts (canary) |
| Resilience | Chaos Mesh (PodChaos, NetworkChaos) |
| IaC | Terraform (Multipass VMs) + Ansible (bootstrap, unseal, start/stop) |
- Docker + Docker Compose
- kubectl + Helm
- Go 1.26+
- Terraform 1.5+ + Multipass
- Ansible 2.14+
Provision VMs (one-time)
multipass set local.bridged-network=en0
cd 05-terraform && terraform init && terraform applyBootstrap the cluster
ansible-playbook 04-ansible/site.yml --ask-become-passLocal API development
make build-connected
make test-api-localAfter a reboot
ansible-playbook 04-ansible/start.yml --ask-become-pass| URL | Credentials |
|---|---|
| https://argocd.airgap.local | admin / from secret |
| https://gitea.airgap.local | gitea-admin / gitea-admin |
| https://grafana.airgap.local | admin / admin |
| https://prometheus.airgap.local | — |
| https://vault.airgap.local | — |
| https://traefik.airgap.local/dashboard/ | admin / admin |
| https://lumen-api.airgap.local | — |
| https://chaos-mesh.airgap.local | — |
- Architecture — zones, components, IaC overview
- Concepts — how things work: K8s networking, TLS, eBPF, GitOps, Vault, Chaos...
- Databases — Redis HA Sentinel + CloudNativePG
- CI/CD — Gitea Actions + Argo Rollouts canary
- Security — 5-layer defense in depth
- Vault & cert-manager — Vault HA, PKI, VSO, mTLS
- Monitoring — kube-prometheus-stack, Loki, Tempo
make help # all available targets
make status # cluster status
make logs-api # API logs