GitOps-based Kubernetes deployment for portfolio projects using ArgoCD. Deploys applications to a local Kind cluster using the App of Apps pattern with ApplicationSets.
A production-style GitOps setup that you can run entirely on your laptop. It demonstrates how to manage multiple Kubernetes applications declaratively using ArgoCD -- the same patterns used at companies running hundreds of microservices.
This repo serves as:
- A learning resource -- understand how ArgoCD, Helm, ApplicationSets, and the App of Apps pattern work together in practice, not just theory
- A starter template -- fork it, swap in your own apps, and you have a working GitOps pipeline
- A portfolio piece -- shows real-world Kubernetes/DevOps skills with a running local demo
| Pattern | What it does | Why it matters |
|---|---|---|
| App of Apps | A single root Application bootstraps everything else | One kubectl apply sets up your entire platform |
| ApplicationSets | Git generator auto-discovers apps from apps/**/deploy.yaml |
Add a new app by dropping a file -- no ArgoCD config changes needed |
| Self-managing ArgoCD | ArgoCD manages its own installation via a Kustomize overlay | ArgoCD upgrades are just a git commit |
| Helm charts per app | Each app has its own chart with Deployment + Service | Standard packaging that works anywhere |
| App | What it is | Stack | Port |
|---|---|---|---|
| ds-agents | Multi-agent data science system with RL training | Python, Streamlit, LangGraph, Azure OpenAI | 8501 |
| portfolio | Personal portfolio website | Next.js 16, React 19, TypeScript | 3000 |
| Component | Purpose |
|---|---|
| Kind | Local Kubernetes cluster (runs in Docker) |
| ArgoCD v2.13 | GitOps continuous delivery |
| Kustomize | ArgoCD installation management |
| Helm | Application packaging and templating |
| Docker | Container images for each app |
Kind Cluster (argocd-demo)
|
v
ArgoCD (argocd namespace)
|
+--- root Application (projects/local/)
|
+--- AppProject "apps"
|
+--- ApplicationSet "portfolio-apps"
|
+--- scans apps/**/deploy.yaml
|
+--- ds-agents (charts/ds-agents) -> port 8501
+--- portfolio (charts/portfolio) -> port 3000
- Bootstrap:
bootstrap.shcreates a Kind cluster and installs ArgoCD - Root Application watches
projects/local/and auto-syncs - ApplicationSet uses a Git generator to scan
apps/**/deploy.yaml - Each
deploy.yamlspecifies a Helm chart path and value overrides - ArgoCD renders the Helm chart and deploys to the cluster
- Push to main -- ArgoCD detects the change and auto-syncs
./scripts/bootstrap.shThis creates a Kind cluster, installs ArgoCD, and applies the root application.
./scripts/build-images.shBuilds Docker images for both apps and loads them into Kind.
kubectl port-forward -n argocd svc/argocd-server 9292:443| Username | admin |
| Password | (printed by bootstrap.sh) |
Portfolio: http://localhost:3000
DS-Agents: http://localhost:8501
- Create a Helm chart in
charts/<app-name>/ - Add
apps/<app-name>/deploy.yamlwithhelmChartPathand value overrides - Add a Dockerfile in
dockerfiles/<app-name>/ - Push to main -- ArgoCD auto-discovers and deploys it
No ArgoCD configuration changes needed. The ApplicationSet picks it up automatically.
argocd-gitops/
├── apps/ # App deploy configs (scanned by ApplicationSet)
│ ├── ds-agents/deploy.yaml
│ └── portfolio/deploy.yaml
│
├── charts/ # Helm charts
│ ├── ds-agents/ # Streamlit app chart
│ └── portfolio/ # Next.js app chart
│
├── dockerfiles/ # Dockerfiles for each app
│ ├── ds-agents/Dockerfile
│ └── portfolio/Dockerfile
│
├── bootstrap/clusters/local/ # ArgoCD bootstrap
│ ├── argo-cd/ # Kustomize: ArgoCD install
│ ├── argo-cd.yaml # ArgoCD self-manage
│ └── root.yaml # Root app-of-apps
│
├── projects/local/ # ArgoCD projects + ApplicationSets
│ ├── project.yaml # AppProject
│ └── appset.yaml # ApplicationSet (git generator)
│
└── scripts/
├── bootstrap.sh # Cluster + ArgoCD setup
├── build-images.sh # Build + load Docker images
└── kind-config.yaml # Kind cluster config
kind delete cluster --name argocd-demoMIT
