Installation von k3s auf Bare Metal - Schritt-für-Schritt-Anleitung mit Terraform

Installation von little k3s Kubernetes auf einem Homelab-Cluster

Inhaltsverzeichnis

Hier ist eine Schritt-für-Schritt-Anleitung zur Installation eines 3-Knoten-K3s-Clusters auf Bare-Metal-Servern (1 Master + 2 Worker).

Diese Anleitung setzt voraus, dass Sie mit einer minimalen Linux-Installation (z. B. Ubuntu 22.04 oder Debian) auf jedem Server beginnen und Ihre Steuerungsebene und Workloads selbst hosten möchten.

Kubernetes Bare-Metal-Cluster

K3s ist eine leichte Variante von Kubernetes und eignet sich gut für dieses kleine Homelab.

⚙️ Cluster-Topologie

Node Name Rolle Hostname/IP
master-1 Server (Steuerungsebene) 192.168.1.100
worker-1 Agent (Worker-Knoten) 192.168.1.101
worker-2 Agent (Worker-Knoten) 192.168.1.102

✅ Voraussetzungen

🧱 Hardware (Minimum):

  • CPU: 2 Kerne
  • RAM: 2GB+ pro Knoten
  • Festplatte: 20GB+ pro Knoten

🛠 Betriebssystem-Anforderungen:

  • Linux (Ubuntu 22.04, Debian 12, etc.)
  • curl, ssh und sudo installiert
  • Root- oder sudo-Zugriff

🧼 Saubere Netzwerkkonfiguration:

  • Stellen Sie sicher, dass alle Knoten sich gegenseitig per IP oder Hostnamen auflösen und ping können.

  • Deaktivieren Sie Swap:

    sudo swapoff -a
    sudo sed -i '/ swap / s/^/#/' /etc/fstab
    

🚀 Schritt-für-Schritt-Installation


📍Schritt 1: Installieren Sie K3s auf der Steuerungsebene (master-1)

curl -sfL https://get.k3s.io | sh -

Nach der Installation:

sudo cat /var/lib/rancher/k3s/server/node-token
  • Dies gibt Ihnen den Join-Token, der für die Worker-Knoten benötigt wird.

Bestätigen Sie, dass der Cluster läuft:

sudo kubectl get nodes

k3s enthält ein kubectl, das als k3s kubectl installiert oder als kubectl verknüpft ist.


📍Schritt 2: Installieren Sie K3s-Agents (worker-1 & worker-2)

Wiederholen Sie dies auf jedem Worker-Knoten:

Ersetzen Sie <MASTER_IP> und <NODE_TOKEN> durch die Werte aus Schritt 1.

curl -sfL https://get.k3s.io | K3S_URL=https://192.168.1.100:6443 K3S_TOKEN=<NODE_TOKEN> sh -

Beispiele:

K3S_URL=https://192.168.1.100:6443 \
K3S_TOKEN=K10abcde123456789::server:abcde123456789 \
sh -c "$(curl -sfL https://get.k3s.io)"

📍Schritt 3: Überprüfen Sie den Cluster von master-1

kubectl get nodes

Sie sollten sehen:

NAME        STATUS   ROLES    AGE   VERSION
master-1    Ready    control  5m    v1.29.2+k3s1
worker-1    Ready    <none>   2m    v1.29.2+k3s1
worker-2    Ready    <none>   2m    v1.29.2+k3s1

🔐 (Optional) Hochverfügbarkeit (HA) aktivieren

Für produktionsähnliche HA (optional in Homelabs):

  • Verwenden Sie eine externe Datenbank (z. B. MySQL/PostgreSQL/etcd).
  • Führen Sie mehrere Server-Knoten mit der --server-Flag und einer gemeinsamen Datenbank aus.
  • Siehe: K3s HA-Dokumentation

🧪 Testen Sie eine Bereitstellung

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=LoadBalancer
kubectl get svc

Überprüfen Sie den Zugriff über curl http://<worker-ip>:<port> oder richten Sie MetalLB für externe LoadBalancer-IPs ein.


🧰 Hilfreiche Hinweise

  • Kubeconfig: /etc/rancher/k3s/k3s.yaml

    • Kopieren Sie es auf Ihren lokalen Rechner und führen Sie export KUBECONFIG=... aus, um es remote zu verwalten.
  • Systemd-Dienste:

    • sudo systemctl status k3s
    • sudo systemctl status k3s-agent (auf den Workern)

💡 Extras (Optional)

  • K9s: Terminal-Benutzeroberfläche zur Verwaltung von Kubernetes: brew install k9s oder sudo snap install k9s

  • Dashboard: Aktivieren Sie es mit Manifesten:

    kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
    
  • MetalLB: Fügen Sie Load-Balancing-Unterstützung für Bare-Metal hinzu:

    kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.10/config/manifests/metallb-native.yaml
    

📦 Bereinigung

Um K3s zu entfernen:

# Auf dem Master:
/usr/local/bin/k3s-uninstall.sh

# Auf dem Worker:
/usr/local/bin/k3s-agent-uninstall.sh

Installieren Sie einen 3-Knoten-Bare-Metal-K3s-Cluster mit Terraform

Hier ist eine Terraform-Vorlage, die Ihnen hilft, einen 3-Knoten-Bare-Metal-K3s-Cluster bereitzustellen, vorausgesetzt, Sie verwalten bereits bereitgestellte Linux-Server (z. B. in Ihrem LAN/Heimlabor) über SSH und Ansible. Terraform wird Ansible-Playbooks aufrufen, um K3s zu installieren.


🧱 Annahmen

  • Sie haben bereits:

    • 3 Server mit festen IPs, die per SSH zugänglich sind.
    • SSH-Zugriff (schlüsselbasiert).
    • Terraform und Ansible lokal installiert.
  • Ziel-Betriebssystem: Ubuntu/Debian (kann angepasst werden).

  • Sie verwenden Terraform local-exec oder Ansible-Provisioner-Plugin (wir verwenden hier local-exec für die Portabilität).


📁 Verzeichnisstruktur

k3s-cluster/
├── main.tf
├── inventory.ini
├── ansible/
│   └── install_k3s.yml
└── variables.tf

📄 variables.tf

variable "master_ip" {
  default = "192.168.1.100"
}

variable "worker_ips" {
  default = ["192.168.1.101", "192.168.1.102"]
}

variable "ssh_user" {
  default = "your_user"
}

variable "ssh_private_key" {
  default = " /.ssh/id_rsa"
}

📄 main.tf

provider "null" {}

resource "null_resource" "install_k3s" {
  provisioner "local-exec" {
    command = "ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook -i inventory.ini ansible/install_k3s.yml --private-key ${var.ssh_private_key} -u ${var.ssh_user}"
  }

  triggers = {
    always_run = "${timestamp()}"
  }
}

📄 inventory.ini

[masters]
192.168.1.100

[workers]
192.168.1.101
192.168.1.102

[all:vars]
ansible_python_interpreter=/usr/bin/python3

📄 ansible/install_k3s.yml

---
- hosts: masters
  become: yes
  tasks:
    - name: Installieren Sie den k3s-Master
      shell: |
        curl -sfL https://get.k3s.io | sh -        
    - name: Holen Sie sich den node-token
      shell: cat /var/lib/rancher/k3s/server/node-token
      register: node_token
      delegate_to: localhost

- hosts: workers
  become: yes
  tasks:
    - name: Fügen Sie den Worker dem Cluster hinzu
      shell: |
        curl -sfL https://get.k3s.io | K3S_URL=https://{{ hostvars['192.168.1.100']['ansible_host'] }}:6443 K3S_TOKEN={{ hostvars['192.168.1.100']['node_token']['stdout'] }} sh -        

Hinweis: Sie müssen möglicherweise die IP- oder Token-Variablen-Zugriffsanweisungen je nach Ansible-Version anpassen. Sie können den Token auch auf dem Master generieren und in eine Datei speichern, bevor Sie die Worker-Installation ausführen.


🚀 Wie man es ausführt

Aus dem Verzeichnis k3s-cluster/:

terraform init
terraform apply

🧰 Verbesserungen (Optional)

  • Verwenden Sie dynamische Inventar-Generierung (z. B. von DHCP/dnsmasq).
  • Fügen Sie die MetalLB-Bereitstellung über Ansible hinzu.
  • Fügen Sie Hostnamen und HA-Funktionen hinzu.
  • Ersetzen Sie es durch eine Ansible-Rolle wie xanmanning.k3s für mehr Flexibilität.