Skip to content

mrpbennett/home-ops

Repository files navigation

Wife approved HomeOps driven by Kubernetes and GitOps using ArgoCD

Image used with permission from k8s-at-home

talos GitHub Last Commit Home Operations Discord

My Home Operations Repository :octocat:

... managed with ArgoCD, Renovate and GitHub Actions 🤖


📖 Overview

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.

The purpose here is to learn Kubernetes, while practising GitOps

⛵ Kubernetes

Installation

My Kubernetes enviroment is deployed with k3s. With KubeVIP providing a VIP and load balancing between my control planes while MetalLB provides LoadBalancer support.

System Requirements

Role Memory Cores System Disk
Control Plane 8 GiB 2 250 Gb
Worker Nodes 32 GiB 6 1 TB

GitOps

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.

Directories

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

Tech stack

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

🔧 Hardware

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

⭐ Stargazers

Star History Chart


🤝 Gratitude and Thanks

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.

Contributors 2

  •  
  •