Cicca Fleet — Multi-site k3s Cluster
- Outcome
- In production
About the project
Personal Kubernetes fleet spanning cloud VPS nodes and an ARM64 Orange Pi at home, meshed over Tailscale and managed fully by GitOps (ArgoCD app-of-apps). In-cluster container registry on MinIO, NFS storage from a Synology NAS, Grafana + Mimir + Loki + Alloy observability with alerting, public apps via Cloudflare Tunnel — this website is served from it.
The problem
I wanted one place to run my own services, this website included, that behaves like production rather than a pet server: declarative, observable and recoverable, across machines that are not in the same building or even the same CPU architecture.
What I built
Cicca Fleet is my personal multi-site Kubernetes cluster:
- k3s nodes on cloud VPS machines plus an ARM64 Orange Pi at home, so the cluster is multi-arch.
- A Tailscale mesh connecting the sites.
- GitOps with ArgoCD using the app-of-apps pattern: the cluster's state lives in Git.
- An in-cluster container registry on MinIO, and NFS storage from a Synology NAS.
- Observability with Grafana, Mimir, Loki and Alloy, with alerting.
- Public apps through Cloudflare Tunnel.
How it works
Every app is described in a Git repository; ArgoCD watches it and brings the cluster in line, so a change is a commit and a rollback is a revert. Images are pushed to the registry inside the cluster, and persistent data sits on the NAS over NFS. Nodes talk to each other over Tailscale whether they run in a data centre or on my desk. Metrics, logs and alerts flow into Grafana through Alloy, Mimir and Loki, so problems show up on a dashboard before a visitor notices them. Public traffic reaches services through Cloudflare Tunnel.
Outcome
The fleet runs my projects in production, and this website — letranminhdat.com — is served from it.
Stack
- k3s (Kubernetes), multi-arch (amd64 + ARM64)
- ArgoCD (app-of-apps GitOps)
- Tailscale, Cloudflare Tunnel
- MinIO registry, Synology NAS (NFS)
- Grafana, Mimir, Loki, Alloy