Interactive Kubernetes demo

Cloud-Native Voting App on Kubernetes

A microservices app — React frontend → Go API → MongoDB replica set — deployed to Kubernetes with Helm, Kustomize, HPA, NetworkPolicies and a 3-node StatefulSet. Cast a vote below, then drive the live cluster: scale pods, kill them to watch Kubernetes self-heal, roll out a new version, and ramp traffic to trigger autoscaling.

19
K8s resources
3
Microservices
3-node
Mongo replica set
2→8
HPA autoscaling
100%
kubeconform valid
The App + The Cluster
Vote — and watch it flow through Kubernetes
Each vote animates a request through the tiers: Ingress → Frontend → API → MongoDB. The controls below the cluster let you operate it like a real operator would.
🗳️ Vote for a language
0 votes
INGRESS
Frontend2
API2
MongoDB3
Frontend
API
Traffic 15%
Engineering
What I improved over the original manifests
The starting point was a basic tutorial. These are the production-readiness gaps I closed — including a real bug I caught by actually deploying it on a cluster.
Problem in the originalFix
Services selected app: api but pods were labelled role: api — the Services matched zero pods and routed no traffic.Standardized on app.kubernetes.io/* labels with matching selectors.
Replica set needed a manual rs.initiate().Added an idempotent Job that initializes rs0 automatically.
No resource requests/limits → no autoscaling possible.Requests/limits everywhere + HorizontalPodAutoscalers.
Two paid cloud LoadBalancer Services.One Ingress (/→frontend, /api→api).
Flat networking — anything could reach Mongo.NetworkPolicies: default-deny + least-privilege flows. (Caught a real bug: the init-Job was blocked — found it on a live kind cluster.)
No availability guarantees on node drains.PodDisruptionBudgets keep Mongo quorum + web ≥1.
Single hard-coded environment.Kustomize dev/prod overlays + a parameterized Helm chart.
No automated checks.GitHub Actions CI: helm lint + kubeconform on every push.
Proof
Real manifests, validated on a real cluster
The actual YAML from the repo — and the result of deploying it to a live kind cluster (Kubernetes 1.32).