Wife approved HomeOps driven by Kubernetes and GitOps using ArgoCD
... managed with ArgoCD, Renovate and GitHub Actions 🤖
This is a mono repository for my home infrastructure and Kubernetes node. I try to adhere to Infrastructure as Code (IaC) and GitOps practices using tools like Kubernetes, ArgoCD, Renovate and GitHub Actions.
I have a HA setup running 3 Raspberry Pi5 8GB as control planes with a further 2x Lenovo M720q as worker nodes running K3s.
My Kubernetes enviroment is deployed with k3s. With KubeVIP providing a VIP and load balancing between my control planes while MetalLB provides LoadBalancer
support.
Role | Memory | Cores | System Disk |
---|---|---|---|
Control Plane | 8 GiB | 2 | 250 Gb |
Worker Nodes | 32 GiB | 6 | 1 TB |
ArgoCD watches the cluster in my kubernetes directory (see structure below) and makes the changes to my cluster based on the state of my Git repository. The way ArgoCD works for me here is it will search through kubernetes/registry...
. Then deploy apps using the apps of apps pattern.
This Git repository contains the following directories under kubernetes. I have the apps
directory that stores all the application manifests for deployed apps. The registry directory is where I store all my Application
type manifests for deployed apps. I also have a cluster
directory for all cluster wide manifests.
All Helm deployment values.yaml
are contained within the Application under the helm.valuesObject
📁 kubernetes
├── 📁 apps # application directory
│ └── 📁 app
│ ├── config-map.yaml
│ ├── ingress.yaml
│ └── stateful-set.yaml
├── argo-root.yaml
├── 📁 cluster # cluster wide manifests
│ ├── 📁 cluster-role-bindings
│ ├── 📁 cron-workflows
│ ├── 📁 cronjobs
│ ├── 📁 ingress
│ ├── 📁 namespaces
│ ├── 📁 secrets
│ ├── 📁 users
│ └── 📁 workflows
├── 📁 registry # registry for application deployments
│ ├── argo-workflows.yaml
│ ├── 📁 helm # helm deployments
│ │ └── trino-helm.yaml
My argo-root.yaml
argocd application checks for changes in ./kubernetes/<cluster>/registry
for new Application
manifests. That manifest then checks in the apps
directory, then deploys the app like the below:
source:
repoURL: 'https://github.com/mrpbennett/home-ops.git'
path: kubernetes/apps/nginx
Logo | Name | Description |
---|---|---|
![]() |
Apache Airflow | Workflow Orchestration |
ArgoCD | GitOps tool built to deploy applications to Kubernetes | |
Argo Workflows | Workflow management to help with CronWorkflows | |
![]() |
cert-manager | Cloud native certificate management - TBA |
![]() |
Harbor | Private container registry |
Grafana | Observability platform | |
Helm | The package manager for Kubernetes | |
Kubernetes | Container-orchestration system, the backbone of this project | |
![]() |
Loki | Log aggregation system |
NGINX | Kubernetes Ingress Controller | |
MetalLB | Kubernetes load balancer | |
Portainer | Docker container management | |
Prometheus | Systems monitoring and alerting toolkit | |
Trino | Fast distributed SQL query engine | |
Ubuntu Server | Base OS minimized for all Non K8 VMs |
Device | Count | Disk Sizes | Ram | Operating System | Purpose |
---|---|---|---|---|---|
Raspberry Pi5 | 3 | 250GB NVMe | 8GB | Ubuntu Svr ARM64 | K8s Control Plane |
Lenovo ThinkCentre M720q tiny | 3 | 1TB NVMe | 32GB | Ubuntu Svr x86_64 | K8s Worker |
Hypervisor / NAS | 1 | 250GB NVMe + 4TB storage | 16GB | Proxmox | Hypervisor / NAS |
Thanks to all the people who donate their time to the Home Operations Discord community. Be sure to check out kubesearch.dev for ideas on how to deploy applications or get ideas on what you may deploy.