Proxmox: 802.3ad Bonding und VLAN auf Cisco
Schon seit einiger Zeit versuche ich nun die zweite Netzwerkkarten (NICs) in den vielen unserer Server sinnvoll zu nutzen. Dabei sollte möglichst die Ausfallsicherheit verbessert werden, denn der Ausfall eines Virtualisierungs-Server wäre ärgerlich. Könnte man zwei NICs gebündelt betreiben, dann würde der Ausfall eines NICs oder gar eines Switch nicht zum Totalausfall führen. Auch eine Lastverteilung auf die beiden NICs wäre sinnvoll. So kann der anfallende Verkehr der VMs auf beide NICs aufgeteilt und dadurch eine bessere Anbindung der VMs erreicht werden.
Bonding nach dem 802.3ad Standard verspricht beides, benötigt dafür aber die Unterstützung durch die Switches. Unsere Cisco Infrastruktur bietet glücklicherweise entsprechende Unterstützung an. Wie die Konfiguration aussieht, wird im ersten Teil dieses Artikels gezeigt. Da wir zur Virtualisierung ausschließlich auf Proxmox setzen, findet sich am Ende auch eine Netzwerkkonfiguation für dieses System.
Cisco Konfiguration
Zur Bündelung mehrerer physischer Ports zu einem logischen dienen die sogenannten etherchannels[4]. Mit dem folgenden Befehl kann man sich vorab ansehen, welche bereits auf dem Gerät definiert sind.
sh etherchannel Channel-group listing: ---------------------- Group: 1 ---------- Group state = L2 Ports: 4 Maxports = 16 Port-channels: 1 Max Port-channels = 16 Protocol: LACP
Der etherchannel 1 (wg. Group 1, Bündelt Channel zu Groups) bereits vorhanden ist. Da die Geräte, mit denen ich arbeite, die etherchannels nicht auf mehrere Geräte gleichermaßen anlegen, können leider keine etherchannels über verschiedene Geräte hinweg angelegt werden. Dadurch kann man keine Ausfallsicherheit über mehrere Switches hinweg herstellen. Wenigstens kann man sich sicher sein, dass keine Namenskonflikt vorliegt, wenn man an dieser Stelle eine Entscheidung für einen Index getroffen hat
. Im Folgenden, wird der Index 2 und somit etherchannel 2 verwendet.
Etherchannel anlegen
Der etherchannel 2 wird als Trunk-Port angelegt, über den nur mit VLAN 1 taggte Pakete kommuniziert werden dürfen.
cisco(config)# interface Port-channel2 cisco(config-if)# description Bonding-port cisco(config-if)# switchport trunk allowed vlan 1 cisco(config-if)# switchport mode trunk cisco(config-if)# end
Physische Interfaces hinzufügen
Die beiden Interfaces gi0/1 und gi0/2 werden nun zu dem eben angelegten etherchannel 2 hinzugefügt. Über sie wird später der Proxmox-Server angeschlossen. beide werden als Trunk-Ports angelegt, die Pakete nur dann akzeptiert, wenn sie mit VLAN 1 getagged wurden. Der Parameter channel-group 2 mode active gibt an, zu welchem etherchannel der Port zählt. Auf die Option mode active wird an dieser Stelle nicht weiter eingegangen (Cisco Doku [5]).
cisco# conf t cisco(config)# int gi0/1 cisco(config-if)# description proxmox1 cisco(config-if)# switchport trunk allowed vlan 1 cisco(config-if)# switchport mode trunk cisco(config-if)# channel-group 2 mode active cisco(config-if)# end cisco# conf t cisco(config)# int gi0/2 cisco(config-if)# description proxmox2 cisco(config-if)# switchport trunk allowed vlan 1 cisco(config-if)# switchport mode trunk cisco(config-if)# channel-group 2 mode active cisco(config-if)# end
Die bisherige Arbeit prüfen
Nun sollte eine weiter Group mit zwei zugeordneten Port auftauchen:
sh etherchannel Channel-group listing: ---------------------- Group: 1 ---------- Group state = L2 Ports: 4 Maxports = 16 Port-channels: 1 Max Port-channels = 16 Protocol: LACP Group: 2 ---------- Group state = L2 Ports: 2 Maxports = 16 Port-channels: 1 Max Port-channels = 16 Protocol: LACP
Proxmox Netzwerk-Konfiguration
Nachdem die Konfiguration der Cisco Geräte vorgenommen wurde, kann mit dem Proxmox-Server weiter gemacht werden. Da es mir nach einigen Versuchen nicht gelang, eine laufende Konfiguration über das Web-Interface zu erzeugen, bin ich nach etwas Such im Netz fündig geworden [1] und habe die dort vorgestellte Lösung noch etwas angepasst.
# loopback
auto lo
iface lo inet loopback
# eth0 and eth1 only defined
iface eth0 inet manual
iface eth1 inet manual
# bonding device using mode 4 (802.1ad).
# eth0 and eth1 are slaves of this bond and
# used to send and receive packages
auto bond0
iface bond0 inet manual
up ifconfig bond0 0.0.0.0 up
bond-mode 4
bond-miimon 100
bond-lacp_rate fast
bond-xmit-hash-policy 1
slaves eth0 eth1
# vlan tagging device.
# Each packet gets vlan 1 tagged
auto bond0.1
iface bond0.1 inet manual
vlan-raw-device bond0
# Default bridge of proxmox with static
# ip configuration.
# vlan tagging device is used to
# send and receive packages.
auto vmbr0
iface vmbr0 inet static
address 195.168.2.10
netmask 255.255.255.0
gateway 195.168.2.1
bridge_ports bond0.1
bridge_stp off
bridge_fd 0
Im Wesentlichen wird ein Bonding-Interface bond0 erzeugt, das eth0 und eth1 benutzt. Da die Trunk-Ports kein VLAN Tagging vornehmen und nur VLAN 1 getaggte Pakte akzeptieren, wird ein bond0.1 angelegt (Mehr dazu unter [3]). Dieses wird nun zur vmbr0 hinzugefügt und damit werden alle Pakte, die über vmbr0 laufen mit VLAN 1 getagged. Damit die VLAN-Unterstützung überhaupt funktioniert, muss noch das entsprechende Paket installiert werden:
apt-get install vlan
Nach einen Reboot oder dem Neustart des Netzwerks kann es noch einige Sekunden dauern, bis eine Verbindung aufgebaut wird. Mittels cat /proc/net/bonding/bond0 kann man sich den Status des Bonding-Interfaces ansehen.
Möchte man weitere VLANs hinzufügen, kann man jeweils eine weitere Bridge und ein bond1.x Interface hinzufügen, wobei x die Nummer des VLANs ist. In diesem Fall ist aber noch die Konfiguration der Cisco-Geräte anzupassen. Bei Problmen kann man sich mit debug lacp misc weitere Informationen verschaffen. Mehr zu Debugging auf Cisco Routern finden Sie auf [2].
Quelle:
[1] Bitbud – Information on Technology
[2] Cisco Router Debugging
[3] Ubuntu Wiki-Eintrag zum Thema VLAN unter Linux
[4] Cisco Etherchannels
[5] Cisco zu LACP