Top Banner

Ubuntu 12.04 und Ganeti – Teil1

Möchte man einen produktiven Cluster einrichten, muss natürlich zwingend Serverhardware verwendet werden. Für kleine Testumgebungen kann man PC-Hardware verwenden oder sogar mit Hilfe von VirtualBox virtualisieren. Die Knoten des Clusters sollten der Einfachheit halber aus identischer Hardware bestehen.

Hardware

Unterstützung von KVM

Um KVM zu nutzen, ist es zwingend erforderlich, dass man einen Prozessor hat, der Hardwarevirtualisierung direkt unterstützt. Dies kann man herausfinden, indem man die Ausgabe der Datei /proc/cpuinfo anschaut. Ist dort unter “flags” entweder der Eintrag vmx oder svm vorhanden, beherrscht der Prozessor diese Technik. Dies erledigt auch der folgende Befehl:

grep -E '^flags.*\b(vmx|svm)\b' /proc/cpuinfo

Alternativ kann man natürlich auch in das Datenblatt für den Prozessor schauen; eine (nicht zwingend aktuelle) Übersicht findet man auch bei Wikipedia für Intel- und AMD-Prozessoren.

Unterstützt der Prozessor Hardwarevirtualisierung, werden in der Regel die beiden benötigten Kernel-Module beim Start des Systems automatisch geladen. Dies kann man mit folgendem Befehl prüfen:

lsmod | grep kvm

Die Ausgabe sollte dann so aussehen:

## für Intel-Prozessoren
kvm
kvm_intel
## für AMD-Prozessoren
kvm
kvm_amd

Sollten die Module nicht geladen sein, kann man sie mit den folgenden Befehlen laden:

## für Intel-Prozessoren
sudo modprobe kvm
sudo modprobe kvm_intel
## für AMD-Prozessoren
sudo modprobe kvm
sudo modprobe kvm_amd

Hinweis: Bei manchen Servern ist die Hardwarevirtualisierung im BIOS deaktiviert. Diese muss dann natürlich erst aktiviert werden, damit man KVM nutzen kann.

 

Hardwareausstattung

Prinzipiell kann ein Ganeti-Cluster mit jeder Hardware aufgebaut werden, die KVM (s.o.) unterstützt. Folgende Punkte sollten aber nach Meinung des Autors zwingend gegeben sein:

– Arbeitsspeicher: 1GB Ram für das Betriebssystem zzgl. des Arbeitsspeichers aller virtuellen Instanzen des Clusters
– CPU: Mehrkernprozessoren mit vielen Kernen und großem Cache; Serverprozessoren sind vorzuziehen
– Netzwerk: Getrennte Netze mindestens für Cluster-Kommunikation (DRBD, Ganeti) und virtueller Instanzen; Empfehlung: Bonding im Mode 0 (RR-Failover); 4 Netzwerkschnittstellen

 

Netzwerk

Wichtig: Eine saubere DNS-Konfiguration ist das A und O bei Ganeti! Alternativ kann auch die Datei /etc/hosts gepflegt werden – sie muss nur auf allen Knoten IDENTISCH sein!

Management-Netz (eth0)

Die Clusterknoten haben jeweils eine eigene IP-Adresse und zusätzlich eine wandernde virtuelle IP-Adresse, welche immer auf den Master-Knoten zeigt.

Clusteradresse und -name:

10.1.1.150 cluster.server

Knotenadressen und -namen:

10.1.1.151 node1.server

10.1.1.152 node2.server

 

Netz für virtuelle Instanzen (br0)

Die virtuellen Instanzen sollen auf das LAN (10.10.10.0/24) zugreifen. Eine IP-Adresse für diese Schnittstelle wird nicht benötigt. Es wird eine Bridge erstellt (br0 auf eth1).

 

Clusterkommunikation (bond0)

Die Kommunikation bzw. die Steuerbefehle der Knoten sowie die Replizierung der Festplatten mittels DRBD wird über ein Bonding-Interface geleitet. Dies geschieht aus Performance- und Hochverfügbarkeitsgründen. Das Bonding-Interface (bond0) wird im Mode 0 (RR-Failover) mit den Interfaces eth2 und eth3 betrieben.

Knotenadressen und -namen

10.2.1.151 DRBD-N1

10.2.2.152 DRBD-N2

Grundinstallation

Je nach Hardwareausstattung sollte man für das Betriebssystem ein kleines RAID-1 einrichten. Als Speicher für die Virtuellen Maschinen soll in diesem Beispiel ein RAID-10 dienen. Nach Möglichkeit sollten 2 eigenständige RAID-Controller verbaut werden, da der Mix verschiedener RAID-Level auf einem Controller zu messbaren Performanceeinbußen führt! Alternativ kann für das Betriebssystem auch ein Software-RAID eingerichtet werden. Sehr gute Erfahrungen mit 2x146GB SAS (15k) für das Betriebssystem und 8x400GB SAS im RAID10 mit 2xHotSpare.
Bei der Grundinstallation kann die gesamte erste Festplatte verwendet werden, das Layout ist relativ egal – jedoch darf auf keinen Fall LVM eingerichtet werden. Es ist zwar möglich, auch für den Hypervisor LVM einzusetzen, jedoch nicht ganz ohne Probleme beim späteren Betrieb.

/dev/sda <- RAID-1    Speicher für Betriebssystem
/dev/sdb <- RAID-10 Speicher für VMs

Kleine Anpassungen nach der Grundinstallation von Ubuntu

Nachdem ein minimales Grundsystem  installiert wurde (in Tasksel nur OpenSSH auswählen!), sollten die folgenden Änderungen durchgeführt werden:

Dash deaktivieren -> "nein" auswählen
dpkg-reconfigure dash

 

Debconf konfigurieren -> “dialog” und “mittel” auswählen

dpkg-reconfigure debconf

 

Benötigte Pakete installieren

apt-get install  munin-node munin-plugins-extra chrony sysfsutils x86info drbd8-utils bridge-utils ifenslave-2.6 kvm debootstrap dump \
gawk iputils-arping kpartx libreadline5 libsigsegv2 make ndisc6 python-paramiko python-pycurl python-pyinotify python-pyparsing socat \
ssh python python-openssl openssl   python-simplejson pandoc sphinx-common pep8 iproute ghc6 libghc6-json-dev libghc6-network-dev \
libghc6-parallel-dev libghc6-curl-dev lvm2

 

Kernel-Tuning für die zweite virtuelle Festplatte (hier “sdb”)

cat <<EOF >>/etc/sysfs.conf
block/sdb/queue/scheduler = deadline
block/sdb/queue/iosched/front_merges = 0
block/sdb/queue/iosched/read_expire = 150
block/sdb/queue/iosched/write_expire = 1500
EOF

 

In /etc/drbd.conf die Ressourcen deaktivieren, in dem # man “skip” vor die Ressourcen schreibt, falls welche vorhanden

skip {    #<---------
  resource r0 {
    ...
  }
}

 

In der Datei /etc/lvm/lvm.conf den Filter-Eintrag wie folgt abändern:

filter = ["r|/dev/cdrom|", "r|/dev/drbd[0-9]+|" ]

 

KVM-Executable abändern, damit die echten Features der CPU genutzt werden können:

dpkg-divert --add --rename --divert /usr/bin/kvm.real /usr/bin/kvm
cat <<EOF > /usr/bin/kvm
#!/bin/sh
exec /usr/bin/kvm.real -cpu host "\$@" 
EOF
chmod +x /usr/bin/kvm

 

“Sicherheitshalber” Appamor deinstallieren um Probleme zu vermeiden

apt-get --purge remove apparmor

 

DRBD-Modulkonfiguration

echo "drbd minor_count=255 usermode_helper=/bin/true" >> /etc/modules

 

Bonding einrichten

cat <<EOF >>/etc/modprobe.d/bonding.conf
alias bond0 bonding
options bonding mode=0 miimon=100
EOF

 

Workaround, da Ubuntu’s Pycurl gegen Gnutls und nicht gegen Openssl gelinkt wurde :-/

aptitude install build-essential dpkg-dev
apt-get source python-pycurl
aptitude build-dep python-pycurl
aptitude remove libcurl4-gnutls-dev libghc-curl-dev libghc6-curl-dev
aptitude install libcurl4-openssl-dev
cd pycurl-7.19.0
perl -p -i -e "s/gnutls/openssl/" debian/control
dpkg-buildpackage -rfakeroot -b
cd ..
dpkg -i python-pycurl_7.19.0-4ubuntu3_amd64.deb

 

… Teil 2 folgt in Kürze!

Valid HTML5! Valid CSS!