Die Erstellung eines Kubernetes-Clusters auf Proxmox ermöglicht es Ihnen, in einer virtualisierten und selbst gehosteten Umgebung eine performante Container-Orchestrierungsplattform zu betreiben. Diese ist ideal für Testumgebungen, Entwicklungs- und CI-Workflows oder auch kleinere Produktionsszenarien. In dieser Anleitung erfahren Sie Schritt für Schritt, wie Sie auf Proxmox virtuelle Maschinen einrichten und daraus ein stabiles Kubernetes-Cluster aufbauen.

Schritt 1: Voraussetzungen prüfen

Bevor Sie mit der eigentlichen Einrichtung des Kubernetes-Clusters beginnen, sollten Sie sicherstellen, dass Ihre Umgebung alle technischen Voraussetzungen erfüllt. Eine saubere Ausgangsbasis erspart später viel Zeit und vermeidet Konfigurationsfehler.

Sie benötigen zunächst eine funktionierende Proxmox VE-Installation. Aus Leistungsgründen empfiehlt sich eine Bare-Metal-Installation von Proxmox. Sowohl der Web-Zugang über die Proxmox-Oberfläche als auch der SSH-Zugang zur Kommandozeile sollten verfügbar sein. Über SSH können Sie Befehle ausführen, Images hochladen und Konfigurationen automatisieren.

Für ein stabiles Kubernetes-Cluster benötigen Sie außerdem mehrere virtuelle Maschinen. Empfohlen werden folgende Kubernetes-Nodes:

  • ein Master-Node (für die sogenannte Control Plane) und
  • mindestens zwei Worker-Nodes.

Damit erreichen Sie eine gewisse Redundanz und können Kubernetes so betreiben, wie es in echten Produktionsumgebungen vorgesehen ist. Für Testzwecke genügt jedoch auch ein kleineres Setup mit einem Master und einem Worker.

Ihr Proxmox-Host sollte außerdem über eine funktionierende Bridge-Schnittstelle verfügen, die den virtuellen Maschinen den Zugang ins lokale Netzwerk und ggf. ins Internet ermöglicht. Das ist wichtig, damit die VMs später Updates herunterladen und Kubernetes-Komponenten installieren können.

Tipp

Für produktive Umgebungen empfiehlt es sich außerdem, regelmäßige Backups der virtuellen Maschinen über einen Proxmox Backup Server einzurichten. So können Sie Ihre Kubernetes-Nodes bei Bedarf schnell wiederherstellen und Ausfallzeiten minimieren.

Managed Kubernetes
Kubernetes als Managed Service von IONOS Cloud

Die ideale Plattform für performante und hochskalierbare Container-Anwendungen. Umfassend ins IONOS Cloud Ökosystem integriert und rund um die Uhr professionell betreut.

Schritt 2: Cloud-Image herunterladen und als Template vorbereiten

Kubernetes-Installationen lassen sich am einfachsten mit sogenannten Cloud-Images durchführen. Diese vorkonfigurierten Betriebssystem-Images, meist Ubuntu oder Debian, sind für den automatischen Start mit cloud-init optimiert. Wir verwenden in diesem Beispiel ein Ubuntu 22.04 LTS Cloud-Image, da es stabil, gut dokumentiert und optimal für den Einsatz mit Kubernetes geeignet ist.

Zunächst laden Sie das aktuelle Ubuntu Cloud-Image direkt auf Ihren Proxmox-Host herunter. Melden Sie sich dazu per SSH auf Ihrem Proxmox-Server an und wechseln Sie in das Verzeichnis, in dem Proxmox ISO- und Image-Dateien speichert:

cd /var/lib/vz/template/iso
bash

Laden Sie anschließend das Ubuntu-Image mit folgendem Befehl herunter:

wget -O ubuntu-22.04-server-cloudimg-amd64.img https://cloud-images.ubuntu.com/releases/22.04/release/ubuntu-22.04-server-cloudimg-amd64.img
bash
Hinweis

Alternativ können Sie das Image auch zunächst auf Ihren lokalen Rechner herunterladen und anschließend per scp (Secure Copy) auf den Proxmox-Host übertragen:

scp ubuntu-22.04-server-cloudimg-amd64.img root@<proxmox-ip>:/var/lib/vz/template/iso/
bash

Sobald das Image auf dem Proxmox-Host liegt, können Sie daraus eine neue virtuelle Maschine erstellen, die später als Template dient. Erstellen Sie für diesen Zweck zunächst eine leere VM mit einer eindeutigen ID, zum Beispiel 9000, und weisen Sie ihr grundlegende Hardware-Ressourcen zu:

qm create 9000 --name ubuntu-template --memory 2048 --net0 virtio,bridge=vmbr0
bash

Nun importieren Sie das zuvor heruntergeladene Cloud-Image als virtuelle Festplatte in den gewünschten Speicher (in unserem Beispiel local-lvm):

qm importdisk 9000 /var/lib/vz/template/iso/ubuntu-22.04-server-cloudimg-amd64.img local-lvm
bash
Tipp

Wenn Ihr Proxmox-Cluster über einen verteilten Speicher verfügt, können Sie das Image alternativ im Ceph-Storage ablegen. Die Integration von Ceph auf Proxmox bietet eine hochverfügbare und skalierbare Speicherlösung für Ihre Kubernetes-VMs.

Anschließend können Sie die importierte Festplatte mit der VM verbinden und den richtigen Controller einstellen. Auf diese Weise wird das Image an den virtuellen SCSI-Controller der virtuellen Maschine gebunden:

qm set 9000 --scsihw virtio-scsi-pci --scsi0 local-lvm:vm-9000-disk-0
bash

Damit Sie später beim Klonen der VMs automatisch IP-Adressen, Hostnamen und SSH-Schlüssel setzen können, benötigen Sie ein Cloud-Init-Laufwerk. Dieses virtuelle Laufwerk enthält die beim Starten der VM automatisch angewendeten Konfigurationsdaten. Fügen Sie das Cloud-Init-Drive hinzu und definieren Sie die Bootreihenfolge mit folgenden Befehlen:

qm set 9000 --ide2 local-lvm:cloudinit
qm set 9000 --boot c --bootdisk scsi0
bash

Aktivieren Sie zusätzlich den QEMU Guest Agent, damit Proxmox später Statusinformationen aus der VM auslesen kann, und konfigurieren Sie eine serielle Konsole, um im Notfall direkten Zugriff auf die VM-Konsole zu haben:

qm set 9000 --agent 1
qm set 9000 --serial0 socket --vga serial0
bash

Wenn alles korrekt eingerichtet ist, können Sie Ihre virtuelle Maschine in ein sogenanntes Template umwandeln. Templates dienen in Proxmox als Vorlage, aus der Sie später beliebig viele Klone erstellen können. Sie eignen sich somit perfekt für Ihre Kubernetes-Nodes.

qm template 9000
bash

Nach diesem Schritt steht Ihnen das Ubuntu-Template bereit, das als Grundlage für Ihre Kubernetes-Master- und Worker-Knoten dient.

Schritt 3: VMs für Master/Worker per CLI klonen

In einem dritten Schritt erstellen Sie aus dem zuvor angelegten Template die virtuellen Maschinen, die später als Master- und Worker-Knoten Ihres Kubernetes-Clusters dienen. Jede dieser VMs erhält eine eigene IP-Adresse, einen eindeutigen Hostnamen sowie einen SSH-Schlüssel für den sicheren Zugriff. Proxmox übernimmt die Grundkonfiguration automatisch über cloud-init, sodass Sie keine manuelle Einrichtung mehr innerhalb der virtuellen Maschinen durchführen müssen.

Klonen Sie zunächst das zuvor erstellte Template (in diesem Beispiel mit der ID 9000) und legen Sie daraus drei virtuelle Maschinen an: eine für den Master-Knoten und zwei für die entsprechenden Worker-Knoten. Dabei können Sie CPU und Arbeitsspeicher individuell anpassen:

qm clone 9000 101 --name k8s-master-1 --full true
qm set 101 --cores 2 --memory 4096
qm clone 9000 102 --name k8s-worker-1 --full true
qm set 102 --cores 2 --memory 4096
qm clone 9000 103 --name k8s-worker-2 --full true
qm set 103 --cores 2 --memory 4096
bash

Anschließend definieren Sie über cloud-init die grundlegenden Netzwerkeinstellungen, den Hostnamen und den SSH-Key. Dabei können Sie feste IP-Adressen vergeben oder DHCP nutzen. In diesem Beispiel werden statische Adressen verwendet:

# Master konfigurieren
qm set 101 --ipconfig0 ip=192.168.1.10/24,gw=192.168.1.1
qm set 101 --sshkey "$(cat ~/.ssh/id_rsa.pub)qm set 101 --ciuser ubuntu
qm set 101 --nameserver 192.168.1.1
qm set 101 --description "K8s Master 1"
# Worker konfigurieren
qm set 102 --ipconfig0 ip=192.168.1.11/24,gw=192.168.1.1
qm set 102 --sshkey "$(cat ~/.ssh/id_rsa.pub)qm set 102 --ciuser ubuntu
qm set 103 --ipconfig0 ip=192.168.1.12/24,gw=192.168.1.1
qm set 103 --sshkey "$(cat ~/.ssh/id_rsa.pub)qm set 103 --ciuser ubuntu
bash
Hinweis

Passen Sie die hier genutzten Beispiel-IP-Adressen an Ihr eigenes Netzwerk an. Verwenden Sie Werte aus dem IP-Bereich Ihres Routers und stellen Sie sicher, dass jede VM eine einzigartige Adresse erhält, die noch nicht vergeben ist.

Zum Schluss starten Sie alle drei Maschinen mit den untenstehenden Terminalbefehlen:

qm start 101
qm start 102
qm start 103
bash

Warten Sie einen Moment, bis die Systeme vollständig hochgefahren sind, und testen Sie dann die Verbindung per SSH. Wenn alles funktioniert, können Sie sich beispielsweise mit folgendem Befehl auf dem Master-Knoten anmelden:

ssh ubuntu@192.168.1.10

Schritt 4: Basis-Konfiguration auf allen virtuellen Maschinen hinzufügen

Bevor Sie Kubernetes auf den VMs installieren, sollten Sie einige systemweite Einstellungen vornehmen, die für den stabilen Betrieb erforderlich sind. Dazu gehören das Deaktivieren von Swap, das Anpassen von Kernel-Parametern für Netzwerk und IP-Forwarding sowie die Synchronisation der Systemzeit. Diese Maßnahmen sorgen dafür, dass Kubernetes korrekt arbeiten kann und Netzwerkfunktionen innerhalb der Container zuverlässig funktionieren.

Zunächst deaktivieren Sie Swap auf allen Nodes, da Kubernetes dies für die Scheduler-Logik verlangt. Außerdem entfernen Sie den entsprechenden Eintrag in /etc/fstab, damit Swap nach einem Neustart nicht erneut aktiviert wird:

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

Anschließend konfigurieren Sie die Kernel-Parameter, um sicherzustellen, dass Netzwerkpakete zwischen Containern und Knoten korrekt verarbeitet werden können:

cat <<'EOF' | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
# Änderungen anwenden
sudo sysctl --system
bash

Ein weiterer wichtiger Schritt ist die Synchronisation der Systemzeit, damit Zertifikate und Cluster-Komponenten keine Probleme aufgrund abweichender Zeiten verursachen. Dazu können Sie chrony installieren und starten:

sudo apt update && sudo apt install -y chrony
sudo systemctl enable --now chrony
bash

Schließlich empfiehlt es sich, einige grundlegende Hilfsprogramme zu installieren, die für spätere Schritte nützlich sind:

sudo apt install -y curl apt-transport-https ca-certificates gnupg lsb-release
bash

Nach diesen Schritten sind alle Nodes einheitlich vorbereitet, Swap ist deaktiviert, die Netzwerkeinstellungen sind korrekt gesetzt und die Zeit synchronisiert. Ihre VMs sind nun bereit für die Installation von Kubernetes und den Aufbau Ihres Clusters.

Schritt 5: Wahl der Kubernetes-Distribution

Bevor Sie mit der eigentlichen Installation von Kubernetes beginnen, sollten Sie sich für eine passende Distribution entscheiden. Auf Basis Ihrer Anforderungen können Sie zwischen zwei empfehlenswerten Varianten wählen:

  • RKE2 (Rancher Kubernetes Engine 2): RKE2 ist eine stabile, production-ready Kubernetes-Distribution, die von Rancher entwickelt wird. Sie eignet sich besonders, wenn Sie später eine grafische Verwaltung über Rancher nutzen möchten oder ein Cluster mit mehreren Control-Plane-Nodes planen.
  • k3s: k3s ist eine schlanke Kubernetes-Distribution, die ideal für Testumgebungen, Home-Labs oder ressourcenbegrenzte Systeme ist. Sie ist sehr einfach zu installieren und benötigt weniger Speicher und CPU.

Für den Aufbau eines robusten Kubernetes-Clusters auf Proxmox, das auch in einem produktionsnahen Szenario betrieben werden könnte, empfiehlt sich RKE2. Wenn Sie jedoch schnell ein kleines Test- oder Entwicklungscluster einrichten möchten, ist k3s die praktischere Alternative. Im weiteren Verlauf dieser Anleitung wird RKE2 genutzt.

Schritt 6: RKE2 auf dem Master installieren

Nachdem die Basis-Konfiguration Ihrer virtuellen Maschinen abgeschlossen ist, können Sie mit der Installation von RKE2 auf dem Master-Knoten beginnen. Melden Sie sich dazu per SSH auf dem Master-Node an:

ssh ubuntu@192.168.1.10
bash

Laden Sie nun das RKE2-Installationsskript herunter und führen Sie es aus. Dabei können Sie optional einen Kanal mit der gewünschten Version angeben:

curl -sfL https://get.rke2.io | sudo INSTALL_RKE2_CHANNEL=v1.28 bash -
bash

Nach der Installation aktivieren Sie den RKE2-Serverdienst und starten ihn sofort:

sudo systemctl enable --now rke2-server.service
bash

Überprüfen Sie mit folgendem Befehl, ob der RKE2-Server korrekt läuft:

sudo systemctl status rke2-server
bash

Um das Kubernetes-Cluster von Ihrem lokalen Rechner aus verwalten zu können, kopieren Sie die kubeconfig-Datei:

sudo chmod 644 /etc/rancher/rke2/rke2.yaml
scp ubuntu@192.168.1.10:/etc/rancher/rke2/rke2.yaml ~/rke2-kubeconfig
bash

Anschließend passen Sie die Master-IP in der Datei an, damit kubectl korrekt auf den Server zugreift:

sed -i 's/127.0.0.1:6443/192.168.1.10:6443/' ~/rke2-kubeconfig
export KUBECONFIG=~/rke2-kubeconfig
bash

Mit diesem Befehl können Sie nun prüfen, ob der Master-Node erreichbar ist:

kubectl get nodes
bash

Wenn der Master angezeigt wird, ist die Installation erfolgreich abgeschlossen und Sie können im nächsten Schritt die Worker-Knoten hinzufügen.

Dedicated Server
Dedizierte Server mit modernsten Prozessoren
  • 100 % Enterprise-Hardware
  • Minutengenaue Abrechnung
  • Nur bei uns: Cloud-Funktionen

Schritt 7: RKE2-Agent auf den Worker-Knoten installieren

Nachdem der Master-Knoten erfolgreich eingerichtet wurde, können Sie nun die Worker-Knoten in Ihr Cluster integrieren. Dazu installieren Sie auf jedem Worker den RKE2-Agent und verbinden ihn mit dem Master.

Auf dem Master-Knoten benötigen Sie zunächst das Node-Token, das für die Authentifizierung der Worker beim Cluster erforderlich ist:

sudo cat /var/lib/rancher/rke2/server/node-token
bash

Notieren Sie sich das Token. Sie benötigen den Wert gleich auf den Worker-Knoten.

Melden Sie sich per SSH auf jedem Worker-Knoten an:

ssh ubuntu@192.168.1.11
bash

Laden Sie das Installationsskript für RKE2 herunter und installieren Sie den Agenten mit folgendem Befehl:

curl -sfL https://get.rke2.io | sudo INSTALL_RKE2_CHANNEL=v1.28 sh -
bash

Erstellen Sie anschließend die Konfigurationsdatei für den Agenten und tragen dort die Master-IP sowie den Node-Token ein:

sudo mkdir -p /etc/rancher/rke2
cat <<EOF | sudo tee /etc/rancher/rke2/config.yaml
server: https://192.168.1.10:9345
token: <TOKEN_HIER_EINFÜGEN>
EOF
bash

Abschließend aktivieren und starten Sie den RKE2-Agent-Dienst:

sudo systemctl enable --now rke2-agent.service
bash

Wiederholen Sie diesen Vorgang für alle Worker-Knoten im Cluster. Nach einigen Minuten können Sie auf dem Master überprüfen, ob die Worker-Knoten korrekt verbunden sind:

kubectl get nodes
bash

Sie sollten nun alle Nodes sehen, den Master sowie die neu hinzugefügten Worker. Damit ist Ihr Cluster vollständig und bereit für die Installation von Netzwerk-Plugins, Load Balancer und weiteren Kubernetes-Komponenten.

Schritt 8: Netzwerk-CNI und LoadBalancer installieren

Nachdem Master- und Worker-Knoten erfolgreich eingerichtet sind, benötigen Sie ein Container Network Interface (CNI), damit die Pods im Cluster miteinander kommunizieren können, sowie einen Load Balancer, um Services im Netzwerk erreichbar zu machen. In dieser Anleitung verwenden wir Calico als CNI und MetalLB für die Layer-2-Load-Balancing-Funktionalität.

Calico stellt die Netzwerkverbindungen zwischen den Pods her, regelt die IP-Zuweisung und ermöglicht optional Netzwerk-Policies. Sie können es mit einem einfachen Terminalbefehl installieren:

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
bash

Überprüfen Sie anschließend, ob alle Calico-Pods erfolgreich gestartet wurden:

kubectl get pods -n kube-system
bash

Alle Pods sollten den Status Running oder Completed anzeigen. Falls Pods noch Pending zeigen, warten Sie ein paar Minuten, denn Calico benötigt eine Weile, um die Netzwerkkonfiguration auf allen Nodes zu verteilen.

Kubernetes unterstützt standardmäßig den Service-Typ Load Balancer, der externe IPs benötigt. In einem selbst-gehosteten Cluster wie auf Proxmox wird hierfür MetalLB verwendet. Installieren Sie zunächst MetalLB:

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

Erstellen Sie anschließend einen IP-Pool, aus dem MetalLB IP-Adressen für Services vergeben kann. Passen Sie die IP-Range an Ihr lokales Netzwerk an:

cat <<EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: my-ip-pool
namespace: metallb-system
spec:
addresses:
- 192.168.1.200-192.168.1.210
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: l2adv
namespace: metallb-system
spec: {}
EOF
bash

Überprüfen Sie auch hier, ob die MetalLB-Pods korrekt laufen:

kubectl get pods -n metallb-system
bash

Sobald alle Pods den Status Running haben, ist Ihr Netzwerk eingerichtet. Sie können nun Kubernetes-Services vom Typ LoadBalancer verwenden, um Anwendungen im LAN erreichbar zu machen. Damit ist Ihr Kubernetes-Proxmox-Cluster vollständig eingerichtet und bereit, Anwendungen zu deployen und Netzwerkressourcen zu verwalten.

GPU Server
Dedizierte Hardware mit hochperformanter Grafikkarte

Greifen Sie beim Handling großer Datenmengen flexibel auf GPU-gestützte Rechenleistung zurück. Mit Pay-as-you-go zahlen Sie nur, wenn Sie die Ressourcen tatsächlich benötigen – minutengenau abgerechnet.

War dieser Artikel hilfreich?
Zum Hauptmenü