# 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 ```bash 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:** ```bash sudo systemctl is-active k3s ``` ### 2. Node-Token auslesen ```bash 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: ```bash 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 ```bash 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 ... v1.34.5+k3s1 192.168.11.171 rnk-wrk02 Ready ... 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: ```bash 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 ```bash # 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 v1.34.5+k3s1 192.168.11.171 containerd://2.1.5-k3s1 rnk-wrk02 Ready v1.34.5+k3s1 192.168.11.172 containerd://2.1.5-k3s1 ```