A real-time multiplayer Pacman game powered by Flask + Socket.IO, Redis, and a static JavaScript frontend. The entire stack is containerized and deployed on Kubernetes using Minikube, complete with observability via Prometheus, Loki, and Grafana.
- Frontend: Vanilla JavaScript, HTML, CSS
- Backend: Flask + Flask-SocketIO
- Real-Time Sync: Redis Pub/Sub
- Deployment: Kubernetes (Minikube)
- Monitoring: Prometheus, Loki, Grafana
- Dev Tools: Docker, kubectl, Helm
Ensure you have the following installed:
- Docker
- Minikube
- kubectl
- Node.js (for frontend build)
- Python (for local backend testing)
- Helm (for monitoring setup)
minikube start --driver=docker
minikube addons enable ingresseval $(minikube docker-env)
# Frontend
docker build -t pacman-frontend ./pacman-js
# Backend
docker build -t pacman-backend ./multiplayerkubectl apply -f k8s/Ensure
k8s/includes:
backend-deployment.yamlfrontend-deployment.yamlredis.yamlingress.yaml
Edit /etc/hosts:
sudo vim /etc/hostsAdd:
127.0.0.1 pacman.local grafana.local
kubectl patch svc ingress-nginx-controller \
-n ingress-nginx \
-p '{"spec": {"type": "LoadBalancer"}}'If still inaccessible, run:
sudo minikube tunnel
β οΈ Keep this terminal open.
Open your browser:
http://pacman.local
This project comes with a full observability stack using Prometheus, Loki, and Grafana.
-
Ensure
minikubeis running with ingress enabled. -
Add the following to
/etc/hosts(if not already):127.0.0.1 grafana.local -
Navigate to the monitoring setup directory:
cd k8s/monitoring ./setup-monitoring.sh kubectl apply -f grafana-ingress.yaml
http://grafana.local
Default credentials:
- Username:
admin - Password:
kubectl get secret loki-grafana -n monitoring \ -o jsonpath="{.data.admin-password}" | base64 --decode
- Prometheus: Collects metrics
- Kubernetes cluster
- Node & app performance
- Loki: Aggregates logs
- Frontend + Backend logs
- System logs
- Grafana: Visualization dashboards
- Cluster overview
- Application metrics
- Logs
# Check all ingresses
kubectl get ingress -A
# Verify Grafana pod status
kubectl get pods -n monitoring
# Ensure correct Grafana service name
kubectl get svc -n monitoring
# Check Grafana logs
kubectl logs -n monitoring -l app.kubernetes.io/name=grafana
# Run minikube tunnel if access still fails
minikube tunnelpacman-distributed/
βββ docker-compose.yml # Local dev option (non-K8s)
βββ pacman-js/ # Frontend game code
β βββ Dockerfile
β βββ *.js, *.css, *.html
β βββ sounds/
βββ multiplayer/ # Flask backend
β βββ Dockerfile
β βββ main.py
βββ k8s/ # Kubernetes manifests
β βββ backend-deployment.yaml
β βββ frontend-deployment.yaml
β βββ redis.yaml
β βββ ingress.yaml
β βββ monitoring/ # Monitoring setup
β βββ grafana-ingress.yaml
β βββ loki-stack-values.yaml
β βββ prometheus-values.yaml
β βββ setup-monitoring.sh
# Logs
kubectl logs -l app=pacman-backend
kubectl logs -l app=pacman-frontend
# Resources
kubectl get pods
kubectl get svc
kubectl get ingress