---
title: "Setting Up a K3s Kubernetes Cluster"
description: "A comprehensive guide to setting up a K3s cluster for your home lab or edge environment, with high availability and persistent storage."
pubDate: "2023-11-15"
heroImage: "/blog/images/posts/k3installation.png"
category: "Kubernetes"
tags: ["kubernetes", "k3s", "homelab", "infrastructure"]
draft: false
---

# Setting Up a K3s Kubernetes Cluster

K3s is a lightweight, certified Kubernetes distribution designed for resource-constrained environments like edge devices, IoT, and home labs. This guide will walk you through setting up a production-ready K3s cluster.

## Prerequisites

- At least two machines (physical or virtual) for high availability
- Ubuntu 20.04 LTS or newer
- At least 2GB RAM per node
- 20GB+ storage per node
- Network connectivity between all nodes

## Installing the Server Node

First, let's install the primary server node:

```bash
curl -sfL https://get.k3s.io | sh -s - server \
    --cluster-init \
    --tls-san=server-ip-or-hostname \
    --disable traefik \
    --disable servicelb
```

This initializes the cluster with:
- HA enabled with `--cluster-init`
- Custom TLS SAN for API server
- Disabled default traefik ingress (we'll use Nginx)
- Disabled default ServiceLB (we'll use MetalLB)

## Installing Agent Nodes

On each worker node, run:

```bash
curl -sfL https://get.k3s.io | K3S_URL=https://server-ip:6443 K3S_TOKEN=node-token sh -
```

Replace `server-ip` with your server's IP and get the token from `/var/lib/rancher/k3s/server/node-token` on the server.

## Adding High Availability

For HA, add additional server nodes:

```bash
curl -sfL https://get.k3s.io | sh -s - server \
    --server https://first-server-ip:6443 \
    --token node-token \
    --tls-san=this-server-ip \
    --disable traefik \
    --disable servicelb
```

## Setting Up Persistent Storage

We'll use Longhorn for distributed storage:

```bash
kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/master/deploy/longhorn.yaml
```

Longhorn provides replicated block storage across your nodes for high availability.

## Next Steps

After setting up your cluster, you might want to:

1. Install a proper ingress controller (Nginx, Traefik)
2. Set up a load balancer (MetalLB)
3. Configure monitoring with Prometheus and Grafana
4. Implement GitOps with Flux or ArgoCD

Stay tuned for detailed guides on each of these topics!

---

This guide provides a starting point for your journey with K3s Kubernetes. In future posts, we'll dive deeper into advanced configurations.
