Build practical Kubernetes experience
Develop skills through operating a functioning cluster rather than using isolated examples.
Container Orchestration Case Study
A practical K3s environment with datastore encryption, two-recipient SOPS recovery, Kubernetes deployment, ingress, local load balancing and evidence-led operational documentation.
Executive Summary
The Kubernetes Homelab was created to develop practical experience beyond theory and temporary training clusters.
The platform runs K3s on dedicated ARM64 hardware and includes containerd, MetalLB, Traefik, namespaces, deployments, services and ingress resources.
The repository also includes architecture, deployment, operations, security, troubleshooting and decision documentation, demonstrating how the platform can be supported as well as deployed.
The Challenge
Docker Compose provides effective container management on a single host, but it does not demonstrate Kubernetes scheduling, services, ingress, namespaces or cluster-oriented networking.
The challenge was to create a manageable Kubernetes platform that provided real orchestration experience without introducing unnecessary complexity during the first implementation stage.
Project Objectives
Develop skills through operating a functioning cluster rather than using isolated examples.
Provide Kubernetes LoadBalancer services with addresses usable on the home network.
Use a consistent ingress layer for routing requests to applications.
Store manifests, scripts and documentation in version control.
Maintain architecture, deployment, operations, security and troubleshooting guidance.
Create a foundation for monitoring, GitOps and additional application workloads.
Delivery Approach
Validated Debian, system resources, networking, storage, sudo access and swap configuration.
Created a single-node control-plane environment using K3s and containerd.
Confirmed the node was Ready and core Kubernetes services were running.
Defined a safe local address pool and assigned a stable LoadBalancer address.
Configured ingress routing for application access through the cluster.
Created a namespace, deployment, service and ingress for a practical demonstration application.
Core Components
Distribution
Runtime
Ingress
Load Balancing
Storage
Delivery
Architecture
Platform Environment
The cluster runs on dedicated ARM64 hardware with sufficient memory and NVMe storage to support the control plane, platform services and continued workload development.
Operating system
Kubernetes distribution
Container runtime
Ingress controller
Load balancer
Storage
Namespace Design
Namespaces provide logical separation between application workloads, monitoring, logging, networking and future GitOps services.
applicationsApplication workloads intended to run independently from platform services.
argocdReserved for GitOps deployment and continuous reconciliation.
monitoringMonitoring components, dashboards and metrics collection.
loggingCentral logging components and log-processing workloads.
metallb-systemMetalLB controllers, speakers and address-pool configuration.
demoSafe namespace for testing workloads and Kubernetes resources.
First Application Deployment
The first workload was deliberately small so the focus remained on understanding Kubernetes resources and network flow rather than application complexity.
What It Demonstrated
Namespaces must exist before namespaced resources are applied.
Services provide stable access even when pods are recreated.
Ingress rules separate external routing from application configuration.
Testing with a simple workload makes networking issues easier to isolate.
Architecture Decisions
Select K3s rather than a heavier multi-component Kubernetes installation.
The platform needed to run efficiently on ARM64 hardware while providing genuine Kubernetes capability.
Lower operational overhead with access to standard Kubernetes resources and tooling.
Start with a single control-plane node before expanding to multiple nodes.
This allowed focus on Kubernetes concepts, networking and deployment before adding cluster complexity.
Created a manageable learning environment with a clear future expansion path.
Provide Layer 2 LoadBalancer addresses from a reserved section of the LAN.
Local Kubernetes environments do not receive managed cloud load balancers.
Applications can use standard LoadBalancer services with stable network addresses.
Use the ingress controller provided and supported by K3s.
Traefik integrates naturally with K3s and avoids unnecessary replacement during the initial platform stage.
Reduced implementation complexity while retaining standard ingress capability.
Project Delivery
Validated the operating system, hardware, storage and networking before installation.
Delivered host preparation, K3s, networking, ingress and workloads in a controlled order.
Checked address availability and avoided introducing conflicts into the existing LAN.
Investigated namespace and networking problems using Kubernetes and Linux tooling.
Documented why K3s, Traefik, MetalLB and a single-node starting point were selected.
Structured the repository to support GitOps, monitoring, security and additional nodes.
Challenges
The initial MetalLB address selected was already in use by another device on the network.
Scanned the available address range, identified safe addresses and changed the assigned IP.
The Kubernetes service received a stable address without disrupting another device.
The first workload resources were applied before the expected namespace existed.
Created the namespace and reapplied the deployment, service and ingress resources.
The application deployed successfully and the importance of dependency order was reinforced.
The cluster needed sufficient memory, storage and network stability for future workloads.
Validated the host before installation and documented available capacity.
The cluster runs on a suitable foundation with room for continued development.
A working cluster without clear operating guidance would be difficult to maintain or demonstrate.
Created architecture, deployment, operations, security, decision and troubleshooting documents.
The project demonstrates both implementation and supportability.
Outcomes
A functioning K3s control plane running on dedicated ARM64 hardware.
MetalLB provides a fixed address accessible from the local network.
Traefik routes requests to applications through Kubernetes ingress.
Scripts, manifests and documentation are maintained through Git.
All 14 existing Kubernetes Secrets were re-encrypted with matching server hashes.
Operational, protected recovery and detached-media controls have been independently validated.
Skills Demonstrated
Operational Practices
The project is not considered complete when an application starts. Ongoing operation, troubleshooting and documentation are treated as part of the platform design.
Regularly verify node readiness, pod state, services, ingress resources and system namespaces.
Store scripts, YAML resources and documentation in Git so changes remain reviewable and repeatable.
Monitor memory, storage and workload requirements before introducing additional applications.
Reserve LoadBalancer addresses carefully to avoid conflicts with existing LAN devices.
Use kubectl, logs, events and Linux network tools to investigate failed deployments and routing problems.
Maintain deployment, operations, security, architecture and troubleshooting guidance alongside the project.
Platform Roadmap
The current cluster provides a stable learning foundation. Future improvements will be introduced only when they add clear operational or learning value.
Use Git as the desired-state source and automatically reconcile approved Kubernetes changes.
Add Kubernetes metrics, node monitoring, pod health and workload dashboards.
Introduce a documented storage approach for applications requiring persistent data.
Expand from the single-node foundation when greater resilience or workload capacity is needed.
Use the validated SOPS and age foundation when an application-managed credential is introduced.
Evaluate suitable Docker workloads for controlled migration into Kubernetes.
Lessons Learned
A smaller Kubernetes environment still provides meaningful experience with services, ingress, namespaces and orchestration.
Address planning is essential when integrating MetalLB into an existing network.
Kubernetes resources have dependencies, and applying them in a clear order makes failures easier to understand.
Documentation and decision records are as important as manifests when the objective is to demonstrate an operable platform.
Source and Related Work