A single-command local Kubernetes platform with GitOps, monitoring, and ingress β ready in minutes.
Clone β
make upβ Full platform running. That's it.
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Your Laptop β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Docker Desktop β β
β β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β k3d Cluster (k3s-in-Docker) β β β
β β β β β β
β β β βββββββββββ βββββββββββ βββββββββββ β β β
β β β β Server β β Agent 1 β β Agent 2 β β β β
β β β ββββββ¬βββββ ββββββ¬βββββ ββββββ¬βββββ β β β
β β β β β β β β β
β β β ββββββ΄βββββββββββββ΄βββββββββββββ΄βββββ β β β
β β β β NGINX Ingress Controller β β β β
β β β β (*.localhost β services) β β β β
β β β ββββββββββββββββ¬βββββββββββββββββββ-β β β β
β β β β β β β
β β β ββββββββββββββΌβββββββββββββββββββββ β β β
β β β β β β β β β
β β β βΌ βΌ βΌ β β β
β β β ββββββββ βββββββββββ ββββββββββββββββββ β β β
β β β βArgoCDβ βGrafana β β Your Apps β β β β
β β β β (UI) β βProm/AM β β podinfo, echo β β β β
β β β ββββ¬ββββ βββββββββββ ββββββββββββββββββ β β β
β β β β β β β
β β β βΌ GitOps (app-of-apps) β β β
β β β ββββββββββββββββββββββββββββ β β β
β β β β apps/ directory β β β β
β β β β (drop manifests here) β β β β
β β β ββββββββββββββββββββββββββββ β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β β ββββββββββββββββ β β
β β β k3d Registry β (local image cache) β β
β β ββββββββββββββββ β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Ports: 80 (HTTP) ββββββΊ Ingress Controller β
β 443 (HTTPS) ββββΊ Ingress Controller β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
| Tool | Version | Purpose |
|---|---|---|
| Docker | 20.10+ | Container runtime |
| k3d | 5.x | Lightweight K8s clusters |
| kubectl | 1.27+ | Kubernetes CLI |
| Helm | 3.12+ | Package manager |
Don't have these? Run
make prerequisitesβ it'll check and offer to install what's missing.
git clone https://github.com/Karthik-Chowdary/local-k8s-platform.git
cd local-k8s-platform
make upOr with the ArgoCD Marketplace UI (browse, configure & deploy Helm charts from a web UI):
make up-marketplaceThat's it. In ~5 minutes you'll have a full platform running.
| Service | URL | Credentials |
|---|---|---|
| ArgoCD | http://argocd.localhost | admin / make argocd-password |
| Grafana | http://grafana.localhost | admin / admin |
| Prometheus | http://prometheus.localhost | β |
| Alertmanager | http://alertmanager.localhost | β |
| Podinfo | http://podinfo.localhost | β |
| Echoserver | http://echoserver.localhost | β |
| Marketplace (opt-in) | http://marketplace.localhost | β |
π‘
*.localhostresolves to127.0.0.1on most systems β no/etc/hostsedits needed.
- π ArgoCD β GitOps continuous delivery with app-of-apps pattern
- π Prometheus + Grafana β Full monitoring stack with pre-built K8s dashboards
- πͺ NGINX Ingress β Production-grade ingress controller
- π― Example Apps β podinfo and echoserver to demonstrate the pattern
- π Extensible β Drop a YAML in
apps/to add new applications
make up # Full platform setup (cluster + all apps)
make up-marketplace # Full platform + ArgoCD Marketplace UI
make down # Tear everything down
make status # Show URLs, pods, ArgoCD sync status
make prerequisites # Check/install prerequisites
make argocd-password # Get ArgoCD admin password
make argocd-ui # Port-forward ArgoCD (fallback if ingress fails)
make grafana-ui # Port-forward Grafana
make add-app # Instructions for adding a new app
make logs # Tail important pod logs
make help # Show all available targetsAdding a new app is as simple as creating one YAML file:
# apps/my-app.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-app
namespace: argocd
finalizers:
- resources-finalizer.argocd.argoproj.io
spec:
project: default
source:
repoURL: https://my-chart-repo.example.com
targetRevision: "1.0.0"
chart: my-app
helm:
valueFiles:
- ../../helm-values/my-app.yaml
destination:
server: https://kubernetes.default.svc
namespace: my-app
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=trueCommit + push β ArgoCD picks it up automatically.
π Full guide: docs/ADDING_APPS.md
local-k8s-platform/
βββ README.md # You are here
βββ Makefile # All automation targets
βββ scripts/
β βββ setup.sh # Full setup orchestration
β βββ teardown.sh # Clean teardown
β βββ prerequisites.sh # Prerequisite checker/installer
βββ cluster/
β βββ k3d-config.yaml # k3d cluster configuration
βββ bootstrap/
β βββ argocd/
β β βββ namespace.yaml # ArgoCD namespace
β β βββ values.yaml # ArgoCD Helm values
β βββ app-of-apps.yaml # Root Application (watches apps/)
βββ apps/ # β Drop new ArgoCD apps here
β βββ ingress-nginx.yaml # NGINX Ingress Controller
β βββ kube-prometheus-stack.yaml # Monitoring stack
β βββ podinfo.yaml # Example: podinfo
β βββ echoserver.yaml # Example: echoserver
βββ helm-values/ # Helm value overrides
β βββ ingress-nginx.yaml
β βββ kube-prometheus-stack.yaml
β βββ podinfo.yaml
β βββ echoserver.yaml
βββ docs/
β βββ ADDING_APPS.md # How to add apps
β βββ ARCHITECTURE.md # Architecture deep-dive
β βββ TROUBLESHOOTING.md # Common issues & fixes
βββ .gitignore
βββ LICENSE
Coming soon β PRs welcome!
| Issue | Fix |
|---|---|
| Port 80/443 in use | Stop other services or change ports in cluster/k3d-config.yaml |
*.localhost not resolving |
Add entries to /etc/hosts or use make argocd-ui for port-forward |
ArgoCD apps stuck Progressing |
Check make logs β usually waiting for images to pull |
| Docker out of disk | Run docker system prune -a |
π Full guide: docs/TROUBLESHOOTING.md
Contributions are welcome! Here's how:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
- Add more example apps (Redis, PostgreSQL, etc.)
- CI pipeline for validation
- Automated screenshots
- Loki for log aggregation
- Cert-manager for TLS
- Crossplane for cloud resources
- Tekton/Argo Workflows for CI
This project is licensed under the MIT License β see the LICENSE file for details.
Built with β€οΈ for the Kubernetes community
If this helped you, give it a β!