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 cluster. I try to adhere to Infrastructure as Code (IaC) and GitOps practices using tools like Ansible, Terraform, Kubernetes, ArgoCD, Renovate and GitHub Actions.
My Kubernetes cluster is deployed with Talos and MetalLB. This is a high availability cluster, running inside Proxmox.
Role | Memory | Cores | System Disk |
---|---|---|---|
Control Plane | 4 GiB | 2 | 100 GiB |
Node | 12 Gib | 4 | 400 GiB |
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
└── 📁 staging # directory for staging apps
└── 📁 app
├── deployment.yaml
├── ingress.yaml
└── service.yaml
My argo-root.yaml
argocd application checks for changes in ./kubernetes/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 |
---|---|---|
Ansible | Automate provisioning and configuration | |
ArgoCD | GitOps tool built to deploy applications to Kubernetes | |
cert-manager | Cloud native certificate management - TBA | |
Cloudflare | Domain and network tunnel | |
Docker Registry | Private container registry | |
Grafana | Observability platform | |
Helm | The package manager for Kubernetes | |
Kubernetes | Container-orchestration system, the backbone of this project | |
Longhorn | Distributed block storage for Kubernetes | |
NGINX | Kubernetes Ingress Controller | |
MetalLB | Kubernetes load balancer | |
Postgres | Cloudnative PG | |
Prometheus | Systems monitoring and alerting toolkit | |
Proxmox | Bare Metal hypervisor OS | |
TailScale | Zero config VPN | |
Terraform | Infrastructure as code | |
Trino | Fast distributed SQL query engine | |
Ubuntu Server | Base OS minimized for all Non K8 VMs |
In my cluster there are two ExternalDNS instances deployed. One is deployed with the ExternalDNS webhook provider for Adguard Home which syncs DNS records to my Adgaurd instance.
Device | Count | OS Disk Size | Data Disk Size | Ram | Operating System | Purpose |
---|---|---|---|---|---|---|
Lenovo ThinkCentre M720q tiny | 3 | 120GB SSD | 1TB NVMe | 32GB | Proxmox VE | Hypervisor |
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.