Skip to content

maksimkurb/home-ops

Repository files navigation

My home operations repository 🎛🔨

... managed by Flux Renovate, and GitHub Actions 🤖


Discord talos kubernetes pre-commit GitHub Workflow Status Lines of code


📖 Overview

This is a mono repository for my home infrastructure and Kubernetes cluster implementing Infrastructure as Code (IaC) and GitOps practices using tools like Kubernetes, Flux, Renovate and GitHub Actions.

Feel free to open a Github issue or join the k8s@home Discord if you have any questions.


⛵ Kubernetes

This repo generally attempts to follow the structure and practices of the excellent k8s-at-home/template-cluster-k3, check it out if you're uncomfortable starting out with an immutable operating system.

Installation

The cluster is running on Talos Linux, an immutable and ephemeral Linux distribution built around Kubernetes, deployed on bare-metal. Rook Ceph running hyper-converged with workloads provides persistent block and object storage, while a seperate server provides bulk (NFS) file storage.

Core components

GitOps

Flux watches my cluster folder (see Directories below) and makes the changes to my cluster based on the YAML manifests.

Renovate watches my entire repository looking for dependency updates, when they are found a PR is automatically created. When PRs are merged, Flux applies the changes to my cluster.

Directories

This Git repository contains the following directories (kustomizatons) under cluster.

📁 cluster      # k8s cluster defined as code
├─📁 bootstrap  # contains the initial kustomization used to install flux
├─📁 flux       # flux, gitops operator, loaded before everything
├─📁 crds       # custom resources, loaded before 📁 core and 📁 apps
├─📁 charts     # helm repos, loaded before 📁 core and 📁 apps
├─📁 config     # cluster config, loaded before 📁 core and 📁 apps
├─📁 core       # crucial apps, namespaced dir tree, loaded before 📁 apps
└─📁 apps       # regular apps, namespaced dir tree, loaded last

Networking

Name CIDR
Kubernetes Nodes 192.168.42.0/24
Kubernetes external services (Cilium w/ BGP) 10.75.45.0/24
Kubernetes pods 172.22.0.0/16
Kubernetes services 172.24.0.0/16

🌐 DNS

Ingress Controller

Over WAN, I have port forwarded ports 80 and 443 to the load balancer IP of my ingress controller that's running in my Kubernetes cluster.

Cloudflare works as a proxy to hide my homes WAN IP and also as a firewall. When not on my home network, all the traffic coming into my ingress controller on port 80 and 443 comes from Cloudflare. In VyOS I block all IPs not originating from Cloudflares list of IP ranges.

🔸 Cloudflare is also configured to GeoIP block all countries except a few I have whitelisted

Internal DNS

k8s_gateway is deployed on my router running VyOS. With this setup, k8s_gateway has direct access to my clusters ingress records and serves DNS for them in my internal network.

Without much engineering of DNS @home, these options have made my VyOS router a single point of failure for DNS. I believe this is ok though because my router should have the most uptime of all my systems.

External DNS

external-dns is deployed in my cluster and configured to sync DNS records to Cloudflare. The only ingresses external-dns looks at to gather DNS records to put in Cloudflare are ones where I explicitly set an annotation of external-dns.alpha.kubernetes.io/target: ipv4.${SECRET_PUBLIC_DOMAIN}


🔧 Hardware

Device Count OS Disk Size Data Disk Size Ram Operating System Purpose
Dell R220 1 120GB SSD N/A 16GB VyOS 1.4 Router
HP S01-pf1000 3 120GB SSD N/A 8GB Talos Linux Kubernetes Control Nodes
HP S01-pf1000 3 120GB SSD 1TB NVMe (rook-ceph) 32GB Talos Linux Kubernetes Workers
SuperMicro SC836 1 120GB SSD 16x8TB + 16x3TB ZFS RAIDZ2 192GB Ubuntu 20.04 NFS
Brocade ICX 6610 1 N/A N/A N/A N/A Core Switch
Raspberry Pi 4B 1 32GB SD Card N/A 4GB PiKVM Network KVM
TESmart 8 Port KVM Switch 1 N/A N/A N/A N/A Network KVM switch for PiKVM
APC SUA3000RMXL3U w/ NIC 1 N/A N/A N/A N/A UPS
APC AP7930 1 N/A N/A N/A N/A PDU

🤝 Thanks

Thanks to all folks who donate their time to the Kubernetes @Home community. A lot of inspiration for my cluster came from those that have shared their clusters over at awesome-home-kubernetes.


📜 Changelog

See commit history


🔏 License

See LICENSE