morten/nordbye.it

homelab · case study

Kubernetes Home Lab - Era One

First-generation home Kubernetes platform built on self-hosted GitLab, ArgoCD, Traefik, MetalLB and cert-manager. The platform that hosted the previous version of this site.

Role
Architect and operator
Client
Personal project
Period
2022 - 2024

Stack

  • Kubernetes
  • GitLab
  • ArgoCD
  • Helm
  • Traefik
  • cert-manager
  • MetalLB

results

What shipped.

  • /01

    Migration from Docker Compose to a real Kubernetes platform, with manageable scale.

  • /02

    Self-hosted GitLab driving CI/CD pipelines and acting as the source of truth for cluster state.

  • /03

    ArgoCD reconciling deployments, with Helm packaging the apps.

  • /04

    MetalLB providing internal load-balancing in the absence of a public LB.

  • /05

    cert-manager automating TLS for all internal and public services.

architecture

How it fits together.

Hover a node to highlight its connections. Click one to read what it does and why it is there.

K3s cluster — Era OnesyncsexternalLAN clientsingressMetalLB (L2)ingressTraefiksecuritycert-managercomputeK3s control plane + workersgitopsGitLab CE (self-hosted)gitopsArgoCDgitopsHelmcomputeApps (incl. previous site)

The brief

I wanted to stop running things on raw Docker. My own infrastructure should get the same care as customer infrastructure, and the homelab is where I figure things out before they reach clients.

What I built

A Kubernetes cluster sized for my rack, with the platform pieces you would expect in production.

  • GitLab CE self-hosted, handling both source control and CI/CD.
  • ArgoCD as the GitOps controller. The cluster ends up being whatever the repo says it should be.
  • Helm for application packaging.
  • Traefik as the ingress controller, with cert-manager issuing certificates automatically.
  • MetalLB for L2 load balancing on the LAN, since there is no managed load balancer in a homelab.

The previous version of this portfolio and its staging environment ran on this cluster. The stack was both a learning exercise and the thing keeping the lights on.

Why it mattered

This was the first-generation cluster. It started small and grew into a full GitOps platform. The lessons from running it (etcd quorum behaviour under restarts, ArgoCD sync loops when manifests are inconsistent, Traefik config edge cases) showed up in real form at customers later. The platform was eventually retired and replaced by a six-node Talos Kubernetes cluster running Cilium, Gateway API and ArgoCD. The upgrade was a deliberate architectural step. Talos removes the mutable OS layer entirely, and the new cluster is provisioned from Terraform with no SSH access to nodes. I am keeping this case study as a record of the first-generation era.