Zerotier going berserk!

Der Proxmox-Cluster verliert einzelne Knoten, diese rebooten und reißen damit die verbleibenden Knoten ebenfalls ins Jenseits. Das passiert nicht nur einmal, sondern in bunter Reihenfolge!

Symptome

Nach Isolation eines Knoten mittels pvecm expected 1 lässt sich dieser vom Dauerboot abhalten. Zu beobachten ist, dass der zerotier-Prozess mehrere CPUs voll belegt und sein Speicherbedarf stetig steigt. Bei 120GB ist dann Schluss, das OS schießt den Prozess ab.

Schleife

Da der Heartbeat des corosync über einen mittels zerotier aufgebauten Tunnel läuft, ist der Knoten jetzt isoliert und das Fencing reißt ihn nach 60 Sekunden in den Abgrund… Nach dem Reboot passiert das Gleiche wieder und wieder…

Analyse

Zerotier greift sich zum Aufbau des Tunnels alle verfügbaren physischen Interfaces.

Wenn also ein Zerotier-Interface Teil einer Bridge ist, geht der Zerotier-Traffic auch über diese Bridge und damit rekursiv wieder über das Zerotier-Interface – eine perfekte Schleife, die alles verfügbare RAM aufbraucht!

Abhilfe

Man kann zerotier das Verhalten abgewöhnen, indem man die kritischen Interfaces in eine blacklist einträgt. Das geschieht mittels der Datei /var/lib/zerotier-one/local.conf

Falls diese noch nicht existiert, muss sie angelegt werden.

{
     "physical": {
         "172.16.0.0/16": {
             "blacklist": true
         },
         "10.0.0.0/8": {
             "blacklist": true
         }
     },
     "settings": {
         "interfacePrefixBlacklist": [ "eth100","vmbr10","vmbr666","vmbr999" ]
     }
 }

Es sollten alle nicht nach draußen führenden Interfaces – und alle privaten IP-Ranges ausgeschlossen werden. Danach zerotier neu starten und sich über den moderaten Ressourcenverbrauch freuen…

Fazit

Kleine Ursache, große Wirkung, lange Analyse, lange Downtime -> nicht schön!

Davon abgesehen ist es keine sehr gute Idee, den Heartbeat über zerotier laufen zu lassen, die Latenzen sind bisweilen gigantisch, was der Stabilität des Clusters nicht gut bekommt.

Mittlerweile kommt auch für den Heartbeat tinc zum Einsatz, der Cluster ist damit deutlich stabiler geworden!

Proxmox, tinc und VLANs

Über mehrere Proxmox-Nodes soll ein VPN gespannt werden, über das mehrere VLANs den VMs zur Verfügung gestellt werden. Dies sollte mit Bordmitteln geschehen.

Das VPN wird mit tinc aufgesetzt, weil es schnell, einfach und mesh-fähig ist.

Ziel ist, einen einzigen tinc-Tunnel für mehrere VLANs zu verwenden.

Konfiguration

Die Konfiguration ist am Standard angelehnt, Besonderheiten sind fett.

Device=/dev/net/tun
 DeviceType=tap
 Forwarding=kernel
 PMTUDiscovery=yes
 PriorityInheritance=yes
 Interface=eth200
 AddressFamily=any
 Mode=switch
 ProcessPriority=high
 Name=v0
 PrivateKeyFile=/etc/tinc/pvebridge/rsa_key.priv
 ConnectTo=v1
 ConnectTo=v2
 ConnectTo=...

tinc wird mit systemctl enable tinc@pvebridge ins System eingebunden und dann mit systemctl start tinc@pvebridge gestartet.

Das Start-script tinc-up bindet das Interface an die Bridge.

!/bin/sh
BRIDGE=vmbr666
ip address add 10.66.66.2/24 dev $INTERFACE
ip link set $INTERFACE master $BRIDGE
ip link set $BRIDGE up
ip link set $INTERFACE up
bridge vlan add vid 2-4094 dev $INTERFACE

Das Interface benötigt eine IP-Adresse, bevor es in die Bridge aufgenommen wird!

Das bridge-Kommando mappt alle verfügbaren VLAN-IDs auf das darunterliegende Interface. Es funktioniert erst, nachdem das Interface in die bridge aufgenommen wurde.

Testen

Jetzt wird der erste Container (hier Ubuntu 18.04) angelegt und mit Netzwerk konfiguriert.

Nach der Generierung des zweiten Containers auf einem anderen Knoten

funktioniert der ping zwischen beiden Knoten über das VLAN.

Fallstricke

Bei Änderungen an der tinc-Konfiguration sollten die Instanzen auf den einzelnen Knoten mit zeitlichem Abstand gestartet werden, da sonst die einzelnen Instanzen ihre Gegenseite nicht finden und somit keine Verbindung zustande kommt.

Nicht vergessen, die evtl. vorhandene Zerotier-Konfiguration anzupassen und die VLAN-Interfaces auszusparen!