Das Orchestrierungswerkzeug Juju

Bewertung: 5 / 5

Stern aktivStern aktivStern aktivStern aktivStern aktiv
 

Die Orchestrierung von OpenStack Komponenten und Anwendungen ist eines der größten Probleme im Bereich OpenStack.

OpenStack selbst besteht aus einer großen Anzahl einzelner Komponenten die separat oder zusammen installiert werden müssen und die insgesamt ca. 1200-1400 Konfigurationsparamenter besitzen. Deshalb wurden mit der Zeit verschiedene Werkzeuge erschaffen bzw. benutzt um die Orchestrierung der OpenStack Komponenten zu einer funktionierenden Installation zu ermöglichen.

Einige Distributionen verwenden Chef (z.B. die IBM Distributionen Cloud Manager und Cloud Orchestrator), andere Triple-O (OpenStack on OpenStack, hier wird ein fertiges OpenStack Image zur Installation einer angepassten OpenStack Installation verwendet). Die unserer Meinung nach beste Orchestrierung stellt jedoch Ubuntu mit der Software Juju bereit.

Juju ist eine Software die Orchestrierung von OpenStack sowohl über eine grafische Oberfläche als auch per CLI Befehle ermöglicht. Eine grafische OpenStack Installation sieht z.B. so aus:

Auf diesem Bild sieht man die einzelnen Komponenten von OpenStack, wie Keystone, Glance, Cinder, usw. sowie die Infrastruktur wie mysql, rabbitmq, ntp.

Weiterhin sieht man sehr gut die Verbindungen der einzelnen Komponenten untereinander. So haben fast alle Module Verbindung zur mysql Datenbank, da sie dort ihre Daten ablegen.

Mit Hilfe von Juju kann man OpenStack installieren indem man auf der grafischen Zeichenoberfläche die einzelnen Komponenten anordnet und dann mit der Maus untereinander verbindet. Dies ergibt ein sehr übersichtliches Bild und man findet sich in der Installation schnell zurecht. Sobald man ein Modul auf der Oberfläche angeordnet hat, kann man es noch konfigurieren bevor man es startet. Dabei kann man Dinge wie Netzwerkschnittstellen oder Konfigurationsparameter ändern und auch angeben wo das neue Modul laufen soll. Das kann z.B. ein neuer Server sein oder eine weitere LXC Umgebung auf einem bestehenden Server. Sobald man alles fertig konfiguriert hat kann man das Modul dann starten. Danach kann man es dann mit anderen schon bestehenden Modulen verbinden. Dabei werden die einzelnen Module automatisch neu gestartet falls das notwendig ist. Am Ende hat man dann eine komplette, funktionierende OpenStack Umgebung.

Aber fangen wir am Besten vorne an:

Zunächst einmal muss man seine Server auf denen man OpenStack installieren will mit dem Ubuntu Tool MAAS verwaltet haben. (Siehe maas.ubuntu.com)
Wenn man alle Server dort verwaltet hat, kann man mit der JuJu Installation beginnen. Auf dem MAAS Server muss auch Juju installiert sein und man kann nun Juju mit dem Befehl "juju bootstrap" initialisieren. Dies entnimmt einen Server aus dem von MAAS verwalteten Pool und benutzt ihn als Orchestrierungsserver für die weitere Juju Installation. Mittels

juju deploy --to 0 juju-gui

wird nun auf diesem Orchestrierungsserver auch das Juju-GUI installiert. Der erste von MAAS initialisierte Server bekommt nämlich die Nummer 0, der zweite 1, usw. Mit der expliziten Anweisung "--to 0" weisen wir Juju an nicht noch einen weiteren Server aus dem Pool zu holen sondern die Installation auch auf dem Server 0 durchzuführen.

Nun können wir weitere Komponenten installieren, wie mysql, rabbitmq, nova-cloud-controller, usw. Um hierbei nicht weitere Server zu verbrauchen aber trotzdem eine Separierung der Dienste zu erreichen können wir diese auf separaten Linux Containern auf unserem Server 0 folgendermaßen installieren:

juju deploy --to lxc:0 mysql
juju deploy --to lxc:0 keystone
juju deploy --to lxc:0 nova-cloud-controller
juju deploy --to lxc:0 glance
juju deploy --to lxc:0 rabbitmq-server
juju deploy --to lxc:0 openstack-dashboard
juju deploy --to lxc:0 cinder

Nun haben wir schon eine ziemlich ausführliche OpenStack Installation und es fehlt eigentlich nur noch ein Compute Node auf dem dann unsere von OpenStack verwalteten virtuellen Maschinen ausgeführt werden sollen. Da wir dafür mehr Ressourcen brauchen spendieren wir hier einen eigenen Server und legen diesen folgendermaßen an:

juju deploy nova-compute

Wie man hier sieht verwenden wir weder "--to 0" noch "--to lxc:0" und legen somit einen neuen Server aus dem MAAS Pool an und verwenden nicht einen alten oder einen Linux Container.
Nun müssen wir noch die einzelnen Komponenten miteinander in Beziehung setzen, was mit folgenden Befehlen geschieht:

juju add-relation mysql keystone
juju add-relation nova-cloud-controller mysql
juju add-relation nova-cloud-controller rabbitmq-server
juju add-relation nova-cloud-controller glance
juju add-relation nova-cloud-controller keystone
juju add-relation nova-compute nova-cloud-controller
juju add-relation nova-compute mysql-server
juju add-relation nova-compute rabbitmq-server
juju add-relation nova-compute glance
juju add-relation glance mysql
juju add-relation glance keystone
juju add-relation glance cinder
juju add-relation mysql cinder
juju add-relation cinder rabbitmq-server
juju add-relation cinder nova-cloud-controller
juju add-relation cinder keystone
juju add-relation openstack-dashboard keystone

Diese Befehle ergeben eine voll lauffähige OpenStack Installation so wie sie von Marco Ceppi in seinem schönen Artikel auf http://marcoceppi.com/2014/06/deploying-openstack-with-just-two-machines/ beschrieben wird und im unten stehenden Bild zu sehen ist.

 Diese Implementierung ist ein Beispiel für eine OpenStack Minimalinstallation auf nur zwei Servern (plus einem Server für MAAS, also insgesamt drei).

Juju hat aber insbesondere auch Vorteile wenn man nicht nur schnell eine Minimalinstallation machen, sondern eine bestehende Installation hochskalieren will. Wenn ich also z.B. meinen RabbitMQ Server redundant machen will, kann ich das auf einfache Weise tun, entweder in dem ich bei der initialen Installation schon angebe auf wievielen Knoten der Service verteilt laufen soll (hier 3):

juju deploy -n 3 rabbitmq-server

oder, wenn ich eine bestehende Installation im laufenden Betrieb hochskalieren will kann ich das mit folgendem Befehl tun:

juju add-unit rabbitmq-server

Eine sehr gute Anleitung zur Hochverfügbarkeit von OpenStack mittels Juju Installation finden man übrigens unter https://wiki.ubuntu.com/ServerTeam/OpenStackHA

Wenn nun die einzelnen von Juju implementierten Module konfiguriert werden müssen, also diverse Konfigurationsparameter eingestellt werden müssen, kann man diese in eine sogenannte yaml Datei eintragen und dann beim Deployment verwenden. So kann z.B. eine Ceph Implementierung auf drei Knoten so aussehen:

juju deploy --config local.yaml -n 3 ceph

Aber man kann Juju nicht nur verwenden um OpenStack zu installieren! Nein, man kann, wenn man OpenStack installiert hat, Juju auch dazu verwenden Anwendungen auf OpenStack zu installieren und automatisch dazu neue virtuelle Maschinen zu generieren.

Hierzu muss zuerst in einer virtuellen OpenStack Maschine die als Startpunkt verwendet wird Juju installiert werden, mittels:

sudo apt-get install juju-core

Nun muss mittels "juju init" die Juju Umgebung initialisiert werden. Dabei wird die initiale Juju Umgebung in der Datei ".juju/environments.yaml" generiert. Diese ist jetzt an die Erfordernisse der eigenen Cloud anzupassen. Dies könnte z.B. so aussehen:

default: mycloud

environments:
  mycloud:
    type: openstack
    use-floating-ip: false
    use-default-secgroup: false
    network: private
    auth-url: http://192.168.0.100:5000/v2.0
    region: RegionOne
    auth-mode: userpass
    tenant-name: demo
    username: demo
    password: <das gewählte Passwort>

Nun muss ein Umage gewählt werden mit dem neue Instanzen deployt werden. Es wird zunächst heruntergeladen und dann in Glance abgelegt. Die dabei generierte Image ID wird dann weiter verwendet.

wget https://cloud-images.ubuntu.com/releases/14.04/release/ubuntu-14.04-server-cloudimg-amd64-disk1.img

glance image-create --name ubuntu-14.04-server-cloudimg-amd64-disk1 --disk-format qcow2 --container-format bare --owner demo --is-public True --file ubuntu-14.04-server-cloudimg-amd64-disk1.img

+------------------+------------------------------------------+

| Property         | Value                                    |

+------------------+------------------------------------------+

| checksum         | b65cbc63bfa4abb6144dddf43caa6b5e         |

| container_format | bare                                     |

| created_at       | 2014-04-28T14:47:01                      |

| deleted          | False                                    |

| deleted_at       | None                                     |

| disk_format      | qcow2                                    |

| id               | b2731f9e-6971-4c91-bea3-39aa0e23e15b     |

| is_public        | True                                     |

| min_disk         | 0                                        |

| min_ram          | 0                                        |

| name             | ubuntu-14.04-server-cloudimg-amd64-disk1 |

| owner            | demo                                     |

| protected        | False                                    |

| size             | 252707328                                |

| status           | active                                   |

| updated_at       | 2014-04-28T14:47:03                      |

| virtual_size     | None                                     |

+------------------+------------------------------------------+
Nun müssen die Metadaten für das Image generiert werden:
juju metadata generate-image -a amd64 -i b2731f9e-6971-4c91-bea3-39aa0e23e15b -r RegionOne -s trusty -d /opt/stack -u http://192.168.0.100:5000/v2.0 -e mycloud
 
Im nächsten Schritt werden die Metadaten gefüllt:
juju metadata generate-tools -d /opt/stack
Und jetzt wird das Juju gebootstrapped und damit die erste virtuelle Maschine für Juju generiert:
juju bootstrap --metadata-source /opt/stack --upload-tools
Ab jetzt können mittels Juju weitere Instanzen erzeugt werden und wie vorher Juju sich die Compute Nodes aus MAAS gezogen hat, tut es dies jetzt als virtuelle Instanzen aus OpenStack.
 
juju deploy mysql
juju deploy wordpress
juju add-relation wordpress mysql
juju expose wordpress
juju status
 
Nach diesen Befehlen hat man ein auf Basis mysql laufendes Wordpress innerhalb zweier OpenStack Instanzen.