Post

Got Really Lucky Today Kubernetes Cluster

Got Really Lucky Today Kubernetes Cluster

Got Really Lucky Today Kubernetes Cluster

Introduction

Imagine waking up to a notification that your homelab has just transformed from a collection of isolated Docker containers into a fully orchestrated, self‑hosted Kubernetes cluster. The sheer relief of seeing all your services — monitoring, CI/CD pipelines, personal dashboards, and even a retro gaming server — running seamlessly together is the kind of “luck” that many DevOps enthusiasts chase but rarely stumble upon.

For anyone managing a home‑lab or a small‑scale production environment, the allure of a Kubernetes cluster lies in its ability to abstract away the underlying hardware, provide declarative deployment, and scale resources on demand — all while keeping the footprint lightweight enough for a garage‑sized server rack. This article is the definitive, SEO‑friendly guide for sysadmins and DevOps engineers who want to understand, install, and operate a Kubernetes cluster in a homelab context, using open‑source tools and proven best practices.

You will learn:

  • What Kubernetes really is and why it matters for self‑hosted environments.
  • The historical evolution that led to today’s stable, production‑grade clusters.
  • Core features, pros, cons, and the scenarios where Kubernetes shines.
  • Prerequisites, step‑by‑step installation, and configuration tips that avoid common pitfalls.
  • Security hardening, performance tuning, and operational workflows for day‑to‑day management.
  • Troubleshooting strategies and where to find reliable external resources.

By the end of this guide, you’ll have a clear roadmap to turn a lucky break into a repeatable, maintainable infrastructure that can support everything from a personal blog to a full‑blown CI/CD pipeline — all without the need for a massive data center.


Understanding the Topic

What is Kubernetes?

Kubernetes (often abbreviated as K8s) is an open‑source container orchestration platform that automates the deployment, scaling, and management of containerized applications. It originated from Google’s internal system, Borg, and was donated to the Cloud Native Computing Foundation (CNCF) in 2014. Since then, it has matured into a de‑facto standard for managing workloads in both cloud and on‑premises environments.

At its core, Kubernetes treats a cluster of machines — physical or virtual — as a single logical unit. Pods, the smallest deployable entities, run one or more containers, while the control plane (API server, scheduler, controller manager, and etcd) makes high‑level decisions about where and when those pods should run.

Historical Development

  • 2014–2016: Early adopters experimented with “kube‑adm” and “kube‑let” to bootstrap clusters on bare metal.
  • 2017–2019: The ecosystem exploded with add‑ons like Helm, CoreDNS, and CNI plugins, making multi‑node setups more reproducible.
  • 2020–2022: Kubernetes 1.20+ introduced stable APIs, enabling production‑grade deployments on modest hardware.
  • 2023–Present: Projects like k3s, MicroK8s, and Kind have lowered the barrier to entry, allowing homelab enthusiasts to run a full‑featured cluster on a single Raspberry Pi or a low‑power NUC.

Key Features

  • Declarative Configuration: Manifests (YAML or JSON) describe the desired state; the control plane reconciles the actual state to match.
  • Self‑Healing: Failed containers are automatically restarted, replaced, or rescheduled.
  • Horizontal Scaling: The Horizontal Pod Autoscaler (HPA) adjusts replica counts based on custom metrics.
  • Service Discovery & Load Balancing: Built‑in DNS and kube‑proxy provide stable networking without external load balancers.
  • Rolling Updates & Rollbacks: Deployments can be updated with zero downtime and instantly rolled back if health checks fail.

Pros and Cons

ProsCons
Strong ecosystem (Helm, Prometheus, Grafana, etc.)Higher initial learning curve compared to Docker‑Compose
Vendor‑agnostic, works on any Linux distributionRequires at least three control‑plane nodes for high availability (though single‑node clusters exist)
Rich API for automation and GitOpsResource‑intensive control plane (etcd, kube‑apiserver)
Mature production‑grade security model (RBAC, NetworkPolicies)Debugging can be complex without proper observability tools

Use Cases & Scenarios

  • DevOps Automation: CI/CD pipelines that deploy to multiple environments automatically.
  • Self‑Hosted Services: Private registries, monitoring stacks, and internal APIs.
  • Edge Computing: Small clusters running at the edge of a home network for IoT gateways.
  • Gaming LAN Parties: Deploying a dedicated game server cluster that can scale with player count.

Kubernetes continues to evolve with features like Cluster API for infrastructure‑agnostic provisioning, Cilium for eBPF‑based networking, and Service Mesh integrations (e.g., Istio). The community is also pushing toward Kubernetes‑as‑a‑Service on edge devices, making it possible to run a fully managed cluster on a $100 home server.

Comparison to Alternatives

  • Docker‑Compose: Great for single‑host development but lacks orchestration across nodes.
  • Nomad: Simpler scheduler, but lacks the extensive ecosystem and built‑in service discovery of Kubernetes.
  • OpenShift / Rancher: Enterprise‑focused distributions that add management layers; they are heavier and often overkill for a homelab.

Real‑World Success Stories

  • A DevOps engineer at a startup reduced deployment time from 30 minutes to under 2 minutes by moving from manual scripts to a Git‑Ops‑driven Kubernetes pipeline.
  • A hobbyist built a 4‑node Kubernetes cluster on refurbished Intel NUCs to host a personal GitLab instance, Prometheus monitoring, and a private Minecraft server, all under a single dashboard.

Prerequisites

Hardware Requirements

  • Control Plane Nodes: Minimum one, but three is recommended for HA.
  • Worker Nodes: Depends on workload; a typical homelab starts with two 8 GB RAM, 4‑core machines.
  • Storage: At least 100 GB SSD for etcd and container images; additional HDD for backups.

Software Dependencies

ComponentMinimum VersionNotes
OSUbuntu 22.04 LTS / Debian 12Long‑term support, kernel ≥ 5.10
Docker Engine24.0Required for container runtime
kubeadm1.28Part of the Kubernetes binaries
kubelet1.28Node agent
kubectl1.28CLI tool
Helm3.12Package manager for Kubernetes manifests
CNI Plugin (e.g., Calico)3.27Networking overlay
etcd3.5Distributed key‑value store (bundled with kubeadm)

Network & Security

  • Static IP addresses for all nodes to simplify DNS resolution.
  • Open ports: 6443 (API server), 2379‑2380 (etcd), 10250 (kubelet), 10255 (read‑only kubelet), 30000‑32767 (NodePort range).
  • Firewall rules: Allow inbound traffic only on required ports; restrict SSH to trusted IPs.
  • TLS certificates: Generate self‑signed certs or use tools like cert-manager for automated issuance.

User Permissions

  • Create a dedicated k8s group and add your user to it.
  • Set appropriate sudo privileges for kubeadm and systemctl commands.
  • Use Role‑Based Access Control (RBAC) manifests to limit cluster‑admin rights to only the necessary accounts.

Pre‑Installation Checklist

  1. Verify hardware specs (CPU, RAM, storage).
  2. Confirm OS version and apply latest security patches.
  3. Disable swap (swapoff -a).
  4. Set net.bridge.bridge-nf-call-iptables=1 in /etc/sysctl.conf.
  5. Reserve static IPs and update /etc/hosts.
  6. Install Docker Engine and start the service.
  7. Pull the required Kubernetes binaries (kubeadm, kubelet, kubectl).

Installation & Setup

Step‑by‑Step Cluster Bootstrapping

Below is a concise, version‑specific workflow that can be reproduced on any Ubuntu‑based homelab node. All commands are written without prohibited Liquid syntax; replace placeholders with actual values as indicated.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 1. Update the package index and install prerequisites
sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl

# 2. Add the Kubernetes apt repository
curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

# 3. Install the required binaries
sudo apt-get update
sudo apt-get install -y kubelet=$CONTAINER_VERSION-00 kubeadm=$CONTAINER_VERSION-00 kubectl=$CONTAINER_VERSION-00
sudo apt-get install -y helm

# 4. Hold the packages to prevent accidental upgrades
sudo apt-mark hold kubelet kubeadm kubectl

# 5. Enable and start the Docker service (required runtime)
sudo systemctl enable docker && sudo systemctl start docker

# 6. Initialize the control plane (replace $CONTROL_PLANE_IP with your static IP)
sudo kubeadm init --control-plane-endpoint $CONTROL_PLANE_IP:6443 \
  --apiserver-advertise-address=$CONTROL_PLANE_IP \
  --pod-network-cidr=192.168.0.0/16 \
  --cri-socket=/var/run/docker.sock

# 7. Set up kubeconfig for the current user
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 8. Install a CNI plugin (Calico example)
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.27/manifests/calico.yaml

# 9. Join worker nodes (repeat on each worker)
kubeadm join $CONTROL_PLANE_IP:6443 --token $JOIN_TOKEN \
  --discovery-token-ca-cert-hash sha256:$CA_HASH

Explanation of Key Steps

  • Step 1–3: Pull the official Kubernetes apt repository and install the exact versions ($CONTAINER_VERSION should be replaced with the desired Kubernetes version, e.g., 1.28.0).
  • Step 5: Docker remains the default container runtime for most homelab setups; the --cri-socket flag tells kubelet where to find it.
  • Step 6: The kubeadm init command creates the control‑plane components (API server, etcd, scheduler, controller manager) and generates a kubeadm-config.yaml that can be version‑controlled.
  • Step 7: The admin.conf file contains the credentials needed for kubectl. Copying it to $HOME/.kube/config enables local CLI access.
  • Step 8: Calico provides a production‑grade overlay network; you can swap it for Flannel, Cilium, or Weave depending on preferences.
  • Step 9: The kubeadm join command registers each worker node with the control plane, using a token that is valid for 24 hours by default.

Verifying the Cluster

1
2
3
4
5
6
7
8
9
10
# Check node status
kubectl get nodes

# Verify the control plane pods are running
kubectl get pods -n kube-system

# Deploy a simple test application
kubectl create deployment hello-world --image=nginx
kubectl expose deployment hello-world --port=80
kubectl get services

If all commands return expected output without errors, the cluster is operational and ready for workload deployment.

Common Installation Pitfalls

IssueRoot CauseFix
kubelet fails to startSwap not disabledRun swapoff -a and comment out swap entries in /etc/fstab
CNI plugin installation hangsFirewall blocks required portsOpen TCP ports 1433‑1456 for Calico or the chosen overlay
Nodes remain in NotReadyDNS resolution failure for the API serverEnsure /etc/hosts contains entries for all node IPs
Certificate errors during kubeadm joinExpired CA certificateRegenerate the CA cert using kubeadm certs renew ca

Configuration & Optimization

Core Configuration Files

  • /etc/kubernetes/admin.conf – Holds the cluster’s authentication data.
  • /etc/kubernetes/kubelet.conf – Node‑specific kubelet settings.
  • /etc/kubernetes/kubeadm-config.yaml – The
This post is licensed under CC BY 4.0 by the author.