Files
homelab/docs/02-k3s-installation.md

3.5 KiB

02 — k3s Installation

Datum: 2026-03-16 Version: v1.34.5+k3s1 Container Runtime: containerd 2.1.5-k3s1


Cluster-Übersicht

Node Rolle IP
rnk-cp01 control-plane 192.168.11.170
rnk-wrk01 agent (worker) 192.168.11.171
rnk-wrk02 agent (worker) 192.168.11.172

Voraussetzungen

  • KVM + libvirt installiert (siehe 01-kvm-libvirt.md)
  • Bridge br0 auf allen Nodes konfiguriert (siehe 01-network-bridge.md)
  • SSH-Zugang von rnk-cp01 zu rnk-wrk01 und rnk-wrk02 ohne Passwort
  • Internetverbindung auf allen Nodes

Installation

1. k3s Server auf rnk-cp01

curl -sfL https://get.k3s.io | sh -s - server \
  --node-ip=192.168.11.170 \
  --tls-san=192.168.11.170 \
  --flannel-iface=br0 \
  --write-kubeconfig-mode=644
Flag Erklärung
--node-ip IP-Adresse die dieser Node im Cluster advertised
--tls-san IP ins TLS-Zertifikat aufnehmen (für externe kubectl-Zugriffe)
--flannel-iface=br0 Flannel CNI nutzt br0 statt des physischen Interfaces
--write-kubeconfig-mode=644 kubeconfig für nicht-root User lesbar

Hinweis: --advertise-addr existiert in k3s v1.34+ nicht mehr. Der korrekte Flag ist --tls-san.

Status prüfen:

sudo systemctl is-active k3s

2. Node-Token auslesen

sudo cat /var/lib/rancher/k3s/server/node-token

Der Token wird für den Agent-Join benötigt.

3. k3s Agent auf rnk-wrk01 und rnk-wrk02

Von rnk-cp01 per SSH, beide Worker parallel:

TOKEN=$(sudo cat /var/lib/rancher/k3s/server/node-token)

# rnk-wrk01
ssh mtkadmin@192.168.11.171 "curl -sfL https://get.k3s.io | \
  K3S_URL=https://192.168.11.170:6443 \
  K3S_TOKEN='$TOKEN' \
  sh -s - agent \
  --node-ip=192.168.11.171 \
  --flannel-iface=br0" &

# rnk-wrk02
ssh mtkadmin@192.168.11.172 "curl -sfL https://get.k3s.io | \
  K3S_URL=https://192.168.11.170:6443 \
  K3S_TOKEN='$TOKEN' \
  sh -s - agent \
  --node-ip=192.168.11.172 \
  --flannel-iface=br0" &

wait

Verifikation

kubectl get nodes -o wide

Erwartete Ausgabe:

NAME        STATUS   ROLES           AGE   VERSION        INTERNAL-IP
rnk-cp01    Ready    control-plane   ...   v1.34.5+k3s1   192.168.11.170
rnk-wrk01   Ready    <none>          ...   v1.34.5+k3s1   192.168.11.171
rnk-wrk02   Ready    <none>          ...   v1.34.5+k3s1   192.168.11.172

Kubeconfig

Die kubeconfig liegt auf rnk-cp01 unter:

/etc/rancher/k3s/k3s.yaml

Für externen Zugriff (z.B. vom Laptop) kopieren und Server-IP anpassen:

scp mtkadmin@192.168.11.170:/etc/rancher/k3s/k3s.yaml ~/.kube/config
sed -i 's/127.0.0.1/192.168.11.170/' ~/.kube/config

Nützliche Befehle

# Alle Nodes anzeigen
kubectl get nodes -o wide

# System-Pods prüfen
kubectl get pods -n kube-system

# k3s Logs (Server)
sudo journalctl -u k3s -f

# k3s Logs (Agent)
sudo journalctl -u k3s-agent -f

# k3s deinstallieren (Server)
sudo k3s-uninstall.sh

# k3s deinstallieren (Agent)
sudo k3s-agent-uninstall.sh

Ergebnis

Alle drei Nodes sind im Status Ready:

NAME        STATUS   ROLES           VERSION        INTERNAL-IP      CONTAINER-RUNTIME
rnk-cp01    Ready    control-plane   v1.34.5+k3s1   192.168.11.170   containerd://2.1.5-k3s1
rnk-wrk01   Ready    <none>          v1.34.5+k3s1   192.168.11.171   containerd://2.1.5-k3s1
rnk-wrk02   Ready    <none>          v1.34.5+k3s1   192.168.11.172   containerd://2.1.5-k3s1