Virtualisierungscluster mit Ganeti

Massenproduktion

Wenn wichtige Dienste virtualisiert werden, muss die Management-Software dafür sorgen, dass die zugrunde liegenden VMs auch laufen. Ganeti hat die Hochverfügbarkeit virtueller Maschinen zum Programm gemacht. Wir stellen die von Google entwickelte Software näher vor.
IT-Administrator startet mit einem Blick in die Zukunft in das neue Jahr. So dreht sich der Heftschwerpunkt der Januar-Ausgabe um das Thema 'Future Networks'. ... (mehr)

Der Artikel über die Migration von KVM-Maschinen im letzten Heft hat die Software Ganeti kurz gestreift. Dieses Mal wollen wir uns die Open Source-Software, mit der sich Cluster für hochverfügbare virtuelle Maschinen aufbauen lassen, etwas genauer ansehen. Ganeti wird seit 2007 von Google entwickelt und ist unter der GPLv2 lizenziert. Auf der Homepage haben immerhin über 800 Benutzer das Projekt favorisiert. Ganeti unterstützt die Hypervisor-Systeme Xen und KVM und bietet für Storage mittlerweile eine Reihe von Optionen, was etwa durch den Support verteilter Storage-Lösungen auch eine Perspektive für die Zukunft bietet.

Ganeti ist für Installationen mit bis zu 150 physischen Nodes gedacht, hat also auch das Potenzial für größere Umgebungen. Im Prinzip lässt sich Ganeti auch auf einem Rechner installieren, aber dann gibt es eben keine Möglichkeiten für Lastverteilung und Ausfallsicherheit. Im Verlauf dieses Artikels soll ein Ganeti-Cluster mit drei Nodes entstehen. Dass die Rechner, je nach geplanter Auslastung durch VMs, über ausreichend RAM und Speicherplatz verfügen sollten, versteht sich von selbst.

Host vorbereiten

Zuerst müssen die VM-Hosts mit einer Linux-Distribution bespielt werden, in unserem Beispiel Ubuntu 14.04. Das bietet zwar Ganeti in seinem Repository an, aber nur eine alte Version. Um die aktuelle Version 2.15.1 aus dem Quellcode [1], der in Python und Haskell geschrieben ist, zu verwenden, müssen Sie den Haskell-Compiler und diverse dazugehörige Pakete installieren. Eine Liste der nötigen Pakete ist in der Installationsanleitung zu finden. Installieren Sie zusätzlich zu den aufgeführten Paketen noch "python-yaml" und "libghc-temporary-dev". Die Konfiguration des Quellcodes startet

# ./configure --localstatedir=/var --sysconfdir=/etc --with-ssh-initscript='service ssh'

Gegenüber der Dokumentation tritt hier zusätzlich die Option "--with-ssh-init­script" auf, die dafür sorgt, dass bei der Installation von Ganeti-Nodes der Restart des SSH-Daemons auf Systemen klappt, die kein SysV-Init mehr verwenden. Dieses Problem tritt dummerweise auch auf, wenn Sie die Standard-Ganeti-Pakete in Ubuntu verwenden. Dann müssen Sie das Helper-Skript "/usr/lib/ ganeti/daemon-util" editieren und in Zeile 425 den SSH-Aufruf von Hand anpassen (Bild 1).

Bild 1: Bei modernen Linux-Distributionen ist es nötig, die Funktion zum Neustart des SSH-Daemons anzupassen.

Ein Aufruf von »make« startet die Übersetzung des Quellcodes, make install kopiert anschließend die Dateien an die richtigen Stellen im Verzeichnisbaum. Erstaunlicherweise stimmten in unserer Umgebung einige Symlinks nach der Installation nicht, die wir deshalb von Hand anpassten:

# cd /usr/local/lib/ganeti
# rm default; ln -s 2.15 default
# cd /usr/locl/share/ganeti
# rm default; ln -s 2.15 default

Um die Ganeti-Daemons beim Booten eines Node automatisch zu starten, können Sie ein mitgeliefertes Init-Skript verwenden, das Sie in das SysV-Init-Verzeichnis kopieren, ausführbar machen und für den Autostart aktivieren:

# cp ganeti-2.15.1/doc/examples/ganeti.initd /etc/init.d/ganeti
# chmod +x /etc/init.d/ganeti
# update-rc.d ganeti defaults

Wer Systemd verwendet, findet die passenden Dateien im Verzeichnis "doc/examples/systemd".

Netzwerkkonfiguration

Bei der Netzwerkkonfiguration benötigt Ganeti auf jedem Host ein Bridge-Device, um darin die IP-Adresse des Clusters unterzubringen, die der Master-Node zusätzlich zu seiner Host-Adresse innehat. Bei Ubuntu sieht die Netzwerkkonfiguration in "/etc/network/interfaces" so aus:

auto br0
iface br0 inet dhcp
bridge_ports eth0

Denken Sie daran, dass das Funktionieren der Bridge die Installation des Pakets "bridge-utils" voraussetzt. Die Konfiguration per DHCP ist normalerweise nur sinnvoll, wenn der DHCP-Server die IP-Adresse anhand der MAC-Adresse fest zugewiesen hat. Alternativ stellen Sie in der Netzwerkkonfiguration eine feste IP-Adresse ein.

Besonders wichtig ist die Konfiguration der Hostnamen, die von Ganeti an vielen Stellen verwendet werden. Weicht ein von Ganeti erwarteter Hostname von demjenigen ab, den der beteiligte Rechner zu besitzen glaubt, funktioniert der Cluster nicht:

hostname mismatch: expected ganeti2 but got ganeti2.cloud.net

Besonders schwierig wird die Sache dadurch, dass Ganeti neben dem DNS auch auf die Datei "/etc/hosts" zurückgreift. Alternativ lässt sich ein Cluster auch so einrichten, dass er die Hosts-Datei ignoriert. Setzen Sie den Hostnamen eines Nodes etwa mit »hostnamectl set-hostname« , müssen Sie unter Umständen den Hostnamen wieder von der Adresse 127.0.1.1 in der Hosts-Datei entfernen. Besonders hilfreich bei der Fehlersuche ist hierbei das Tool getent, das aufdeckt, wenn ein Hostname mit mehreren Adressen registriert ist, von denen das System dann normalerweise die erste (falsche) wählt:

# getent hosts node1

Ganeti kann zwar auch zum Betrieb mit einer gewöhnlichen User-ID konfiguriert werden, die aber dann je nach Konfiguration die passenden Rechte braucht. Alternativ betreiben Sie Ganeti einfach mit Root-Rechten. In jedem Fall müssen Sie für den entsprechenden Account die Secure Shell SSH so konfigurieren, dass Sie sich ohne Eingabe eines Passworts auf den anderen Ganeti-Nodes einloggen können. Am einfachsten geht das, wenn Sie per »ssh-copy-id« den SSH Public Key auf die anderen Rechner kopieren, wo er in der Datei "$HOME/.ssh/authorized_keys" landet. Gegebenenfalls müssen Sie noch in der Konfigurationsdatei "/etc/ssh/sshd_config" die Einstellung "PermitRootLogin" auf "yes" setzen.

Auf jedem Node muss zudem eine mindestens 20 GByte große LVM Volume Group existieren. Von Hand legen sie eine Volume Group mit dem Namen "gvg" beispielsweise so an:

# pvcreate /dev/sdb1
# vgcreate gvg /dev/sdb1

Die DRBD-Konfiguration übernimmt Ganeti weitgehend selbst. Neben der Installation der "drbd8-utils" bleibt nur, das DRBD-Kernelmodul zu starten und einen Parameter dafür einzurichten:

# echo "drbd" > /etc/modules
# echo options drbd minor_count=128 usermode_helper=/bin/true > /etc/modprobe.d/drbd.conf

Damit sind die wichtigsten Voraussetzungen für die Installation eines Ganeti-Clusters erfüllt. Da wir uns im Beispiel auf ein Setup mit dem KVM-Hypervisor konzentrieren, ist auch noch das Metapaket "kvm" zu installieren, das den Emulator Qemu und einige Tools enthält.

Bild 2: Die Initialisierung des Clusters hat ohne Fehler funktioniert, wie der Verify-Befehl zeigt.
comments powered by Disqus
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Ausgabe /2023