Proxmox auf Raspberry Pi (Pimox)

Aus RT-Wiki
Zur Navigation springen Zur Suche springen

Eine Anleitung um Proxmox VE auf einem Raspberry Pi 4 Cluster einzurichten.

Raspberry Pi Cluster

Installation

Hardware

Minimal

  • 4x Raspbarry-Pi 4 8GB
  • 4x microSD Karte (Betriebssystem, VMs & Container)

Empfohlen für Hochverfügbarkeitscluster

  • 4x Raspbarry-Pi 4 8GB
  • 4x SSD mit USB3.0 Adapter (VMs & Container)
  • 4x microSD Karte (Betriebssystem)

Ultravariante

  • 4x Raspbarry-Pi 4 8GB
  • 8x SSD mit USB3.0 Adapter (4x Betriebssystem, 4x VMs & Container)

Optional

  • PoE HAT für Raspberry

Falls kein PoE HAT verwendet wird müssen die Raspberrys unbedingt anderweitig gekühlt werden!


SD Karten vorbereiten

  1. Die neuste Version von Raspberry Pi OS Lite (64 Bit) herunterladen.
  2. Die heruntergeladene *.zip-Datei kann direkt mit dem Raspberry Pi Imager auf die SD-Karte geflashed werden.

Tipp: In der neusten Version vom Imager kann man mit STRG+X vor dem Flashen bereits einige Einstellungen vornehmen (Hostname, SSH, Tastaturlayout, usw.)


Systemeinstellungen

Feste IP einrichten (/etc/dhcpcd.conf)

Damit der Cluster beim nächsten DHCP-Lease nicht zersprengt wird, müssen wir als erstes feste IPs für unsere Cluster Nodes vergeben.

Dafür editieren wir die Datei /etc/dhcpcd.conf:

sudo vi /etc/dhcpcd.conf

Dort suchen wir nun nach folgendem Eintrag:

# Example static IP configuration:
#interface eth0
#static ip_address=192.168.0.10/24
#static ip6_address=fd51:42f8:caae:d92e::ff/64
#static routers=192.168.0.1
#static domain_name_servers=192.168.0.1 8.8.8.8 fd51:42f8:caae:d92e::1

Nun werden die zur Konfiguration notwendigen Zeilen aktiviert, indem das # entfernt wird und die Adressen entsprechend des eigenen Netzwerkes angepasst.

Am Ende sollte das Ganze in etwa so aussehen:

# Example static IP configuration:
interface eth0
static ip_address=192.168.2.81/24
#static ip6_address=fd51:42f8:caae:d92e::ff/64
static routers=192.168.2.1
static domain_name_servers=192.168.2.1 1.1.1.1

Damit diese Einstellung wirksam wird, muss der Raspberry neu gestartet werden.
Wenn ihr einen Fehler in der Konfiguration gemacht habt, kommt ihr danach nicht mehr per SSH auf euren Raspberry!

sudo reboot

Erledigt!

Jetzt könnt ihr euch per SSH mit der festgelegten IP verbinden.


Hostnamen setzen (/etc/hostname)

Falls im Imager bereits der Hostname gesetzt wurde kann dieser Punkt übersprungen werden.

Als Erstes setzen wir einen Hostnamen für unseren Proxmox Node. Dafür editieren wir die Datei /etc/hostname.

sudo vi /etc/hostname

Hier wird nun der gewünschte Hostname eingetragen. In meinem Fall habe ich mich für ClusterPi-1 entschieden.

Der zweite Raspberry wäre dementsprechend ClusterPi-2, u.s.w.


Hosts eintragen (/etc/hosts)

Nun werden auf jedem Raspberry die Hostnamen aller Cluster Nodes eingetragen.

Dazu editieren wir die Datei /etc/hosts.

Am Anfang sieht diese ungefähr so aus:

127.0.0.1       localhost
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

127.0.1.1       ClusterPi-1

Die IPv6 Einträge können ruhigen gewissen gelöscht werden.

Am wichtigsten ist es aber den Eintrag "127.0.1.1 ClusterPi-1" zu entfernen, da der Cluster mit den absoluten Adressen arbeiten soll. [1]

Danach werden die Hostnamen der Nodes hinzugefügt, so dass es am Ende so aussehen sollte:

127.0.0.1       localhost
192.168.2.81    ClusterPi-1
192.168.2.82    ClusterPi-2
192.168.2.83    ClusterPi-3
192.168.2.84    ClusterPi-4

Die IP-Adressen müssen natürlich dem entsprechen was ihr vorher konfiguriert habt.


Root-Passwort vergeben

Damit man sich später auf der Proxmox Weboberfläche anmelden kann, muss noch ein Passwort für den Root Benutzer festgelegt werden.

Zuerst wechseln wir über sudo in den root Benutzer:

sudo -s

Jetzt kann mit passwd ein neues Passwort vergeben werden:

passwd

Jetzt da der Raspberry fertig konfiguriert ist, kann Proxmox installiert werden.


Pimox installieren

Mittlerweile gibt es Pimox in der Version 7, wofür allerdings ein Betriebssystem basierend auf Debian 11 "Bullseye" benötigt wird.

Zurzeit gibt es "Raspberry Pi OS 64 Bit" aber nur basierend auf Debian 10 (Stand: 08.2021).

Wenn Ihr also die neuste Version von Proxmox benutzen möchtet, muss zuallererst ein Upgrade auf Debian 11 gemacht werden.


Debian 10 "Buster" (pimox)

Die Paketquelle für Pimox hinzufügen und die Installation starten:

curl https://gitlab.com/minkebox/pimox/-/raw/master/dev/KEY.gpg | apt-key add -
curl https://gitlab.com/minkebox/pimox/-/raw/master/dev/pimox.list > /etc/apt/sources.list.d/pimox.list
apt update
apt upgrade
apt install proxmox-ve

Während er Installation wird man gefragt ob man die smb.conf so konfigurieren möchte, dass WINS Server Daten per DHCP empfangen werden können. Da wir kein DHCP nutzen kann das mit <No> quittiert werden.

WINS Abfrage

Direkt im Anschluss folgt eine Warnung, dass das Paket ZFS und der Linux Kernel unterschiedlichen Lizenzen unterliegen und nachdem sie auf eurem System installiert sind, nicht zusammen als ein Paket weitervertrieben werden dürfen. Dies kann mit <Ok> bestätigt werden.


Debian 11 "Bullseye" (pimox7)

Achtung: Für die Installation von pimox7, muss zuerst ein Upgrade auf Debian 11 "Bullseye" durchgeführt werden!


Pimox7 hat ein Shell-Skript, das einem das Hinzufügen der Paketquellen und das Starten der Installation abnimmt.

Die Installation sollte per Monitor und nicht per SSH durchgeführt werden, da die Netzwerkverbindung abbrechen kann!

curl https://raw.githubusercontent.com/pimox/pimox7/master/pimox.sh | sh


Lizenz Warnung

Anschließend noch eine Neustart und die Installation ist abgeschlossen:

reboot

Jetzt könnt ihr im Browser über https://<IP-Adresse>:8006 auf das PVE (Proxmox Virtual Enviroment) zugreifen!

Bei 'User' tragt ihr root ein und das Passwort welches vorher festgelegt wurde.

PVE Login


Proxmox Cluster einrichten

Damit aus den einzelnen Nodes auch ein Cluster wird, müssen wir diese im PVE mit einander verknüpfen.

  • Dazu ruft ihr die Weboberfläche irgendeines Nodes auf.
  • Auf der Linken Seite klickt ihr dann auf "Datacenter" und in der weiteren Auswahl auf "Cluster".
  • Jetzt geht ihr auf "Create Cluster" und erstellt einen Cluster mit dem gewünschten Namen.
  • Nachdem dieser Prozess abgeschlossen ist, könnt ihr über "Join Information" einen Schlüssel kopieren um die anderen Nodes dem neuen Cluster hinzuzufügen.
  • Dazu einfach auf jedem weiteren Node auf "Join Cluster" gehen und den kopierten Schlüssel einfügen.


Netzwerk Bridge erstellen

Um auf den VMs und Containern eine Netzwerkschnittstelle nutzen können, muss noch eine Netzwerk Bridge zum physischen Adapter des Raspberrys erstellt werden.

Zuerst auf jedem Node ifupdown2 installieren

sudo apt install ifupdown2

Danach auf jedem Node eine Linux Bridge erstellen:

  • System->Network
  • Create->Linux Bridge
  • Bei "Bridge ports" das Hauptinterface eintragen (z.B. eth0)
  • Mit "Apply Configuration" die Einstellungen übernehmen

Fertig ist euer Raspberry Pi - PVE Cluster!


Auf diesem Stand könnt ihr nun Virtuelle Maschinen und Container anlegen und diese vom einen Node zum anderen migrieren.

Leider hat der Cluster bisher keine Ausfallsicherheit, da die Daten der VMs/CTs nur Lokal (Auf den Nodes) gespeichert werden können.

Wenn also ein Node ausfällt auf dem die Daten einer VM/CT liegen, sind diese für die anderen Nodes nicht mehr zu erreichen und die VM/CT stoppt.


Ceph einrichten

Um den Cluster ausfallsicher zu machen, richten wir nun Ceph auf unseren vier SSDs ein.

Ceph installieren

  • Auf der Linken Seite einen Node auswählen.
  • Jetzt auf "Ceph" gehen und im anschließenden Dialog "Install Ceph" auswählen.
    • Im Dialog die neuste Version installieren
    • Danach euer Cluster Netzwerk eintragen (z.B. 192.168.2.0/24) und einen Monitor-Node auswählen.
    • "Number of replicas" bestimmt wie oft eure Daten im Cluster repliziert werden.
    • "Minimum replicas" gibt an wie viele Replikationen online sein müssen.
  • Installation starten

  • Version auswählen

  • Konfiguration

"Monitor" und "Manager" einrichten

Aktuell hat unser Ceph Cluster nur einen Monitor (Den wir bei der Installation ausgewählt haben). Wenn dieser ausfällt, ist kein Zugriff mehr auf die Daten möglich.

Also fügen wir zwei weitere hinzu:

  • Auf der linken Seite wieder einen Node auswählen
  • Dann auf Ceph -> Monitor
  • Mit Monitor -> Create zwei weitere Nodes hinzufügen

Die Anzahl der Monitore sollte immer ungerade sein, wobei drei völlig ausreichend sind. [2][3]

Nun müssen wir noch drei Manager erstellen:

Von den Managern ist immer nur einer aktiv aber auch hier sollten für eine hohe Verfügbarkeit mehrere erstellt werden.

Dafür nehmen wir die drei Nodes, die wir vorher bereits als Monitor deklariert haben. [4][5]

OSDs erstellen

SSDs vorbereiten

Als erstes sehen wir nach welches Gerät die SSD ist:

ls -l /dev

Wenn Ihr eine SD-Karte für das Betriebssystem nutzt, ist es mit hoher Wahrscheinlichkeit /dev/sda, da die SD Karte mmcblk0 heißt...

brw-rw----  1 root disk      8,  16 Jul 19 18:51 mmcblk0
brw-rw----  1 root disk      8,  16 Jul 19 18:51 mmcblk0p1
brw-rw----  1 root disk      8,  16 Jul 19 18:51 mmcblk0p2
brw-rw----  1 root disk      8,  16 Jul 19 18:51 sda
brw-rw----  1 root disk      8,  16 Jul 19 18:51 sda1

Bei 2x SSDs suchen wir das Gerät, das nur eine Partition hat (z.B. /dev/sdb /dev/sdb1)...

brw-rw----  1 root disk      8,   0 Jul 19 18:51 sda
brw-rw----  1 root disk      8,   1 Jul 19 18:51 sda1
brw-rw----  1 root disk      8,   2 Jul 19 18:51 sda2
brw-rw----  1 root disk      8,  16 Jul 19 18:51 sdb
brw-rw----  1 root disk      8,  16 Jul 19 18:51 sdb1

Danach die vorhandenen Partitionstabellen von den SSDs löschen:

sudo /sbin/sgdisk /dev/sdX -Z

Das ganze auf jedem Node ausführen und neu starten.

Als nächstes müssen die SSDs mit GPT initialisiert werden:

  • In der Proxmox VE Weboberfläche einen Node auswählen
  • Auf Disks gehen
  • Die SSD auswählen die wir vorher gelöscht haben
  • Initialize Disk with GPT auswählen
    OSD hinzufügen
  • Auf jedem Node ausführen

Sollte es dabei zu einem Fehler kommen, am besten die vorherigen Schritte wiederholen.

Wenn alles erfolgreich war können wir jetzt die OSDs erstellen.

  • Einen Node auswählen
  • Ceph->Create
  • Mit Create: OSD eine neue OSD erstellen (Die Einstellungen können beibehalten werden)
  • Auf jedem Node wiederholen
Ceph Pool erstellen

Ceph Pool erstellen

Um später einen RBD Storage zu erstellen, auf dem die VMs und Container laufen, brauchen wir einen Ceph Pool der die OSDs "vereint".

Dafür wieder einen Node auswählen

Ceph->Pools

Create


Storage erstellen

Virtuelle Maschinen (VMs) und Container (CT) erstellen

Neue VM erstellen

  • CD/DVD Laufwerk als SCSI
    Altes CD/DVD Laufwerk entfernen
  • Neues CD/DVD Laufwerk hinzufügen
    • Statt IDE wählen wir SCSI
    • Das gewünschte Image einbinden (Siehe unten)
  • Boot Reihenfolge anpassen
    Unter Options die Boot Reihenfolge anpassen
    1. CD/DVD Laufwerk
    2. Festplatte


Debian 10 "Buster"

Debian 10.9 VM Hardware

Leider scheint es nicht möglich zu sein Debian 10.10 zu installieren, da der Bootvorgang des ISO-Images immer mit einer "Synchronous Exception" abbricht.

Das Debian 10.9 Image lässt sich mit ein paar Anpassungen in den Hardwareeinstellungen allerdings installieren.

  • Unter Hardware->Add einen Serial Port hinzufügen
  • Das Display auf Serial terminal 0 ändern


Debian 11 "Bullseye"

https://cdimage.debian.org/cdimage/release/current/arm64/iso-cd/

Nachdem das Image eingebunden wurde sind keine weiteren Hardwareanpassungen nötig und die VM kann gestartet werden.


Ubuntu 12.04

https://cdimage.ubuntu.com/releases/20.04/release/ubuntu-20.04.2-live-server-arm64.iso


AlmaLinux 8

http://almalinux.li/8.4/isos/aarch64/AlmaLinux-8.4-aarch64-minimal.iso

  • Unter Hardware->Add einen Serial Port hinzufügen
  • Das Display auf Serial terminal 0 ändern
  • xterm.js Konsole öffnen
    Die Konsole über Console->xterm.js öffnen
  • VM starten

Neuen CT erstellen

Falls ihr den Container nicht Lokal, sondern auf einem Ceph RBD ablegen wollt, müsst ihr vorher den Raspberry Pi Kernel mit rbd Modul bauen.

  1. rootfs.tar.gz herunterladen (Siehe unten)
  2. Umbenennen in z.B. debian-10.10-standard_arm64_2021.08.08.tar.xz
  3. In der PVE Weboberfläche einen Storage auswählen (z.B. local)
  4. Auf CT Templates, dann auf Upload


Debian 10 "Buster"

https://us.images.linuxcontainers.org/images/debian/buster/arm64/default/


AlmaLinux 8

https://us.images.linuxcontainers.org/images/almalinux/8/arm64/default/

Ubuntu 12.04 Focal

https://us.images.linuxcontainers.org/images/ubuntu/focal/arm64/default/

Bei fehlenden CPU und/oder Memory Werten in der Proxmox Übersicht [6]:

Die Datei /boot/cmdline.txt auf dem Node öffnen:

sudo vi /boot/cmdline.txt

Dort folgendes ans Ende anhängen:

cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1

Sodass die Datei dann z.B. so aussieht:

console=serial0,115200 console=tty1 root=PARTUUID=c8669ead-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1

Das ganze bei allen anderen Nodes im Cluster wiederholen.

Optionale Modifikationen

Backup NAS einrichten

S.M.A.R.T. für die SSDs im PVE anzeigen

Zuerst muss der smartctl Aufruf vom PVE etwas erweitert werden.

Dazu müssen wir die Datei Diskmanage.pm bearbeiten.

sudo vi /usr/share/perl5/PVE/Diskmanage.pm

Dort such ihr die Zeile

my $cmd = [$SMARTCTL, '-H'];

Tipp: Mit '/' könnt ihr in vi schnell nach Text suchen /my $cmd = [$SMARTCTL, '-H']


Und ändert sie wie folgt ab:

my $cmd = [$SMARTCTL, '-d', 'sat', '-H'];

Der Nachteil ist, dass jetzt alle Speichermedien die in Ceph erfasst werden mit diesem Befehl arbeiten.

D.h. es werden z.B. bei normalen HDDs vermutlich keine S.M.A.R.T. Daten mehr angezeigt.

Dafür müsste man das Script eventuell ein bisschen erweitern damit der "-d sat" Parameter dynamisch zugeschaltet wird.


QEMU Guest Agent installieren

QEMU aktivieren
  • Die gewünschte VM auswählen und auf Options gehen
  • Doppelklick auf QUEMU Guest Agent oder den Eintrag auswählen und auf Edit
  • Beide Eintrage auswählen und auf OK

Run quest-trim after disk move or VM migration bewirkt, dass die virtuelle Festplatte der VM bei jeder Migration (Der VM oder nur des Laufwerks) auf die tatsächlich benutze Größe reduziert wird.

Dadurch werden z.B. bei einer 64GB großen Festplatte nicht die ganzen 64GB verschoben, sondern nur der tatsächlich belegte Speicher.


Als Letztes den Agent auf der VM installieren und starten:

Debian/Ubuntu

sudo apt install qemu-guest-agent

Jetzt noch den Service starten:

sudo systemctl start qemu-guest-agent

CentOS/AlmaLinux


Proxmox HA einrichten

Der Proxmox HA (High Availability) Service migriert VMs und Container automatisch sobald ein Node ausfällt.


Logs in den RAM auslagern

Um die SD Karte ein wenig zu entlasten können wir die Logs in /var/log in den RAM auslagern.

Dafür als erstes Log2Ram installieren.

Dann vergrößern wir noch das RAM Laufwerk, da wir mit den standardmäßigen 40MB bei den ganzen Proxmox/Ceph Logs schnell ans Limit kommen.

Config Datei editieren:

sudo vi /etc/log2ram.conf

Dort den Eintrag SIZE auf 128M ändern:

SIZE=128M

Node aus der PVE Weboberfläche neustarten.

Ceph - RAM Nutzung begrenzen

Standardmäßig kann Ceph für jede OSD 4GB RAM belegen. Besonders bei HDDs kann dies die Performance des Ceph Clusters erhöhen. [7][8]

Die 8GB RAM des Raspberry kann das aber schnell an die Grenzen treiben.

Mit osd_memory_target kann dieser Wert verringert oder vergrößert werden (Angabe in Byte).

Dafür auf irgendeinem Node die Datei ceph.conf bearbeiten:

vi /etc/ceph/ceph.conf

Unter [global] folgende Zeilen einfügen um den Speicher auf 2GB zu begrenzen:

osd_memory_target = 2147483648

Nach der Anpassung muss jeder Node einmal neu gestartet werden damit die Änderung wirksam wird.

Zabbix Monitoring einrichten

Zabbix Agent installieren:

sudo apt install zabbix-agent

Zabbix Konfiguration anpassen:

sudo vi /etc/zabbix/zabbix_agentd.conf
- Server=127.0.0.1
+ Server=192.168.2.10

- ServerActive=127.0.0.1
+ ServerActive=192.168.2.10

- # AllowRoot=0
+ AllowRoot=1

Die IP durch die eures Zabbix Servers ersetzen.

Zabbix new host start.png


In Zabbix einen neuen Host ohne Interface erstellen. Dieser stellt keinen eigenständigen Server dar, sondern repräsentiert den gesamten Cluster.

Später laufen dort die Daten von Ceph und Proxmox rein.

Proxmox überwachen [9]

Skript installieren

Auf jedem Node ausführen...


Python3-PIP installieren:

sudo apt update
sudo apt install python3-pip

proxmoxer und requests installieren:

pip install proxmoxer
pip install requests

Auf https://github.com/takala-jp/zabbix-proxmox das Skript proxmox_cluster.py und die beiden Templates snmp_boolean_type_valuemap.xml und proxmox_cluster_template.xml herunterladen.

Als Zielverzeichnis für das Skript kann man z.B. /etc/zabbix/scripts/ nehmen

Das Skript ausführbar machen:

chmod +x /etc/zabbix/scripts/proxmox_cluster.py


Zabbix Host einrichten

Die beiden Templates snmp_boolean_type_valuemap.xml und proxmox_cluster_template.xml in Zabbix importieren:

Configuration→Templates→Import

Zabbix new host templates.png

Als Template für den Host wählen wir Template Proxmox cluster aus.

PVE Benutzer mit API Zugriff erstellen

Auf irgendeinem Node den Benutzer erstellen:

pveum useradd zabbix@pve -comment "Zabbix monitoring user"

Ein Passwort für den Benutzer erstellen:

pveum passwd zabbix@pve

Dem neuen Benutzer mit der PVEAuditor-Rolle die Rechte geben alles zu lesen:

pveum aclmod / -user zabbix@pve -role PVEAuditor


Cronjobs einrichten

Damit regelmäßig und redundant, Daten an den Zabbix Server gesendet werden richten wir auf jedem Node zwei Cronjobs ein.

In diesem Beispiel werden vier Nodes verwendet und die beiden Cronjobs dementsprechend verteilt, sodass der Discovery alle 6 Stunden und die Datenübertragung jede Minute von einem anderen Node kommt.

sudo crontab -e -u zabbix

Node 1:

# Discovery 00:00
# Data every 4th minute (0, 4, 8, 12, ...)
0 0 * * * /etc/zabbix/scripts/proxmox_cluster.py -a 192.168.2.10 -u zabbix@pve -p <password> -t PVECluster -d
*/4 * * * * /etc/zabbix/scripts/proxmox_cluster.py -a 192.168.2.10 -u zabbix@pve -p <password> -t PVECluster

Node 2:

# Discovery 06:00
# Data every 4th minute beginning at 1 (1, 5, 9, 13, ...)
0 6 * * * /etc/zabbix/scripts/proxmox_cluster.py -a 192.168.2.10 -u zabbix@pve -p <password> -t PVECluster -d
1-59/4 * * * * /etc/zabbix/scripts/proxmox_cluster.py -a 192.168.2.10 -u zabbix@pve -p <password> -t PVECluster

Node 3:

# Discovery 12:00
# Data every 4th minute beginning at 2 (2, 6, 10, 14, ...)
0 12 * * * /etc/zabbix/scripts/proxmox_cluster.py -a 192.168.2.10 -u zabbix@pve -p <password> -t PVECluster -d
2-59/4 * * * * /etc/zabbix/scripts/proxmox_cluster.py -a 192.168.2.10 -u zabbix@pve -p <password> -t PVECluster

Node 4:

# Discovery 18:00
# Data every 4th minute beginning at 3 (3, 7, 11, 15, ...)
0 18 * * * /etc/zabbix/scripts/proxmox_cluster.py -a 192.168.2.10 -u zabbix@pve -p <password> -t PVECluster -d
3-59/4 * * * * /etc/zabbix/scripts/proxmox_cluster.py -a 192.168.2.10 -u zabbix@pve -p <password> -t PVECluster


Ceph überwachen [10]

Ceph Zabbix Sender aktivieren:

sudo ceph mgr module enable zabbix

Zabbix Host konfigurieren:

sudo ceph zabbix config-set zabbix_host 192.168.2.10

Zabbix Identifier konfigurieren (Entspricht dem "Host name" den ihr in Zabbix konfiguriert habt):

sudo ceph zabbix config-set identifier PVECluster

Der Standardintervall für die Aktualisierung beträgt 60s. Mit folgendem Befehl kann eine Aktualisierung manuell ausgelöst werden:

sudo ceph zabbix send

Quellen

Einzelnachweise