Introduction: Erste Schritte Mit RancherOS Und Rancher

Docker, Rancher und RancherOS. Das klingt genau richtig, um einen verregneten Nachmittag zu füllen. Und einen sittlichen Nährwert wird es auch haben, kann ich doch hiermit bestimmt eine schöne neue Entwicklungsumgebung schaffen. Also mal "schnell" einlesen und los geht.

Wie soll es aber auch anderes sein? Klingt spannend, ist aber mit der einen oder anderen Hürde versehen, die man nur mit etwas suchen dann löst.

Mal noch einen kleinen Disclaimer:

Alles was ich hier zeige, ist erstmal nur so zusammengestellt, dass es irgendwie nach bestem Wissen und Gewissen läuft. Was Sicherheit, Stabilität und Effizienz angeht, muss sich jeder so seine eigenen Gedanken machen und hin und wieder auch was selbst lesen. Insbesondere dann, wenn es denn in irgend einer Weise produktiv genutzt werden soll. Auch in Sachen Lizenzen muss jeder für sich schauen, in wie weit die vorgestellten Softwareteile für ihn nutzbar sind.

Um auch das klar zu stellen: alles was hier verwendet wird, ist ein eingetragenes Warenzeichen oder stellt eine Marke der jeweiligen Hersteller dar. Die jeweiligen Produktnamen werden nur zur Identifikation der Produkte verwendet. Ich selbst habe keinerlei Rechte an diesen. Die jeweiligen Lizenzbestimmungen müssen eingehalten werden.

Jetzt aber los...

Step 1: Vorbereitung Der VM

Starten wir mit eine leeren VM. Ziel ist es, in dieser ein RancherOS zu installieren Als Betriebssystem soll etwas Linux artiges zum Einsatz kommen. Eine gute Gelegenheit, gleich das RancherOS auszuprobieren, wird es doch als leichtgewichtiges Linux mit einer tiefen Docker-Integration dargestellt. Also erstmal das ISO-Image zum Booten und installieren herunterladen. Das jeweils aktuellste Image sollte hier zu finden sein.

Nach dem download von ca. 60 MB kann dann die virtuell Maschine erstellt werden. Alles, was nicht gebraucht wird, wird weggelassen. Als CDROM wird das ISO-Image eingebunden. Nach dem Durchklicken der Dialoge kann dann die VM gestartet werden.

Der Benutzer rancher wird nach dem Start direkt ohne passwort angemeldet. Eigentlich könnte man nun direkt mit der Konfiguration beginnen. Doch das englische Tastaturlayout macht einem da Leben schwer. Und dann muss gleich noch ein RSA-Key übertragen werden. Die Lösung heißt SSH mit Putty. Dafür braucht es allerdings ein Passwort. Also root kann man dies dem User rancher setzen.

sudo bash
passwd rancher
exit

Danach kann man Putty öffnen und sich am RancherOS anmelden

Step 2: Installation RancherOS

Damit man das RancherOS in die virtuelle Maschine installiert werden kann und man sich anschließend anmelden kann, benötigt man eine Konfigurationsdatei cloud-config.yml. Diese sollte einen SSH-RSA-Public-Key enthalten, mit dem anschließend dann in Putty die Anmeldung durchgeführt wird. Also zuerst mit Puttygen ein Schlüsselpar erstellen. Privater und öffentlicher Schlüssel werden in einer Datei gespeichert. Danach kann die cloud-config.yml mit vi im rancher-Home-Verzeichnis erstellt werden.

vi cloud-config.yml

vi im Schnelldurchgang. I startet den Insert-Modus. Escape beendet ihn. :x speichert die Datei. Im Insert-Modus kann mit der rechten Maustaste Text aus der Zwischenablage eingefügt werden.

Die cloud-config muss mit einem Tag #cloud-config beginnen. Danach kann der RSA-Key eingefügt werden.

<p>#cloud-config</p><p>ssh_authorized_keys:
  - ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEA0UWUlTyYhXEgWYyWIKEXLr8oJip5/ClIS+919hrISFczj6Lpiy0D0z7MoiRannOGnJdkMR93kv7DOYFjo2Hb4NsG1qsahCCDOJo0/m3wrCrbjpE2pgE2xBTvy9oCWKwW+tywfe2tdkaWDGIWdDXvZ61aK8K6fvitOJ5yBpYZ+nyTbooegUPIM9mvAORhYSTG/jBOnShimirbjr+qYfwEjQacjZo+SFdzW/QZ7RycyAdaTUESfkn+It2U+wFK+IJPexXujjbFad5gTjAs2CJyVl9Aii51oBZqrGZVxBHz14d4FJTV+R0BMc8Lj0clRMiaiOpq7AfZYkXS5EClna6ljQ==</p>

Nach dem Speichern mit :x kann dann die eigentliche Installation gestartet werden.

sudo ros install -c cloud-config.yml -d /dev/sda

Nachdem alles installiert wurde, kann die VM neu gestartet werden. Dabei muss allerdings das CD-ROM ausgeklinkt werden. Dies geht am einfachsten, wenn die VM nochmal abgeschaltet wird. Nach dem jetzt folgenden Start ist die Anmeldung nur noch über SSH möglich. Dazu muss Putty der Key untergeschoben werden. Ist das geschafft, kann die Anmeldung erfolgen.

Damit ist die grundlegendste Installation abgeschlossen. Ich verweise allerdings nochmal auf die Rancher-Dokumentation. Die cloud-config bietet noch sehr viele Möglichkeiten, was z.B. die Konfiguration des Netzwerkes betrifft.

Step 3: Installation Rancher

Mit einem Nun laufenden Betriebssystem kann man nun auch schon mal schauen, was sich denn so an Docker auf der Maschine tummelt. Eine erste Versionsübersicht erhält man mit

<p>docker version</p>

Mit

docker images

kann man sich einen Überblick verschaffen, welche Images sich bereits in der Maschine befinden. Aktuell ist kein Image vorhanden. Das heißt aber auch, das noch keine Rancher-Installation existiert. Diese muss nun erstellt werden.

sudo docker run -d --restart=unless-stopped -p 8080:8080 rancher/server:latest

run startet ein Image. -d bedeutet dabei, dass es als eigener Prozess im Hintergrund laufen soll. Das Image soll immer wieder gestartet werden, solange der Container läuft. -p legt den externen und internen Port fest. rancher/server:latest ist dann das eigentliche Image. Existiert es lokal nicht, so wird es heruntergeladen und im Image-Cache abgelegt. Das Ergebnis sollte dann mit

docker images

angesehen werden. Ab diesem Moment sollte dann auch die Rancher UI verfügbar sein. Man kann sich dann direkt im Browser mit

http://192.168.178.46:8080

aufrufen.

Step 4: Konfiguration Rancher

In den nächsten Schritten wird nun Rancher konfiguriert. Als erstes stellen wir die Zugriffskontrolle ein. Dies erfolgt über Admin/Access Controll. Da noch kein GIT installiert ist, verwenden wir erstmal LOCAL.

Anschließend wird der erste Host konfiguriert. Dieses ist wieder der Ranger-Server selbst. Auswahl Add a host. Für diesen einfachen Fall kann die nun folgende Seite mit Save direkt gespeichert werden. Für eine einfache Konfiguration ist nun nur die Registrierung des Hosts wichtig. Der Befehl hierzu wird aus dem Textfeld in Punkt 5 kopiert und direkt in der Rancher-Konsole ausgeführt.

sudo docker run -d --privileged -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/rancher:/var/lib/rancher rancher/agent:v1.2.1 http://192.168.178.46:8080/v1/scripts/6DD78C0751A...

Danachsollte sich die Anzahl der Images und der laufenden Prozesse in Docker erhöht haben

docker images
docker ps

Wahl man im Menü der RancherUI STACKS/All aus, dann sieh man auch dort die nun vorhandene Infrastruktur. Damit sind alle Grundlagen für die Installation von Services gelegt.

Step 5: Installation PostgreSQL

Die einfachste Möglichkeit einen Service zu installieren besteht darin, dass ein Image aus dem Catalog ausgewählt wird. In unserem Fall soll dies eine PostgreSQL sein. D.h. es wird nun CATALOG/Community ausgewählt. Mittels Detail gelangt man zu Konfiguration des Templates. Mit einem Klick auf Launch wird das Template deployed und konfiguriert. Das Ergebnis ist ein neuer Stack mit dem Namen PostgreSQL . Er beinhaltet zwei Services. postgres und postgres-lb.

eigentlich könnte man nun meinen, dass man an dieser Stelle schon fertig wäre. Aber nimmt man eine pgAdmin zur Hand, so lässt sich keine Verbindung zum Server 192.168.178.46:5432 aufbauen. Die Fehlermeldung deutet darauf hin, dass keine Kommunikation über TCP aufgebaut werden kann. Aus diesem Grund müssen wir uns die Konfiguration des Loadbalancers anschauen. Ein Klick auf postgres-lb öffnet diese. Hier wird dann auch das Problem im Tab Balancer Rules offensichtlich. Der Loadbalancer leitet auf der Basis von HTTP die Anfrage aus pgAdmin weiter. pgAdmin kommuniziert aber auf einer tieferen Schicht, nämlich nur auf TCP/IP. Durch einen Klick auf die Schaltfläche mit drei Punkten kann man Upgrade/Edit aufrufen und dieses anpassen. Nach Auswahl von Edit wird die Weiterleitungsregel gespeichert und der Loadbalancer neu gestartet. Danach sollte der Zugriff mit pgAdmin sofort funktionieren.

Die Installation von PostgreSQL kann damit vorerst als abgeschlossen betrachtet werden, auch wenn klar ist, dass hier quasi nur an der Oberfläche gekratzt wurde. Erweiterung um weitere Services zur Lastverteilung, SSH usw. sind nur mal so zwei Denkanstösse, wo man noch weiter machen muss.

Step 6: Installtion Und Anpassen Eine Tomcat Images

Im letzten Punkt soll nun ein Tomcat installiert werden. Hier gibt es mehrere Punkte, auf die genauer geachtet werden muss. Zum einen gibt es kein Image im Katalog, welches verwendet werden könnte. Findet man dann ein Image bei Docker, so muss man feststellen, dass dieses noch Anpassungen benötigt. Genauer gesagt wird die Anwenderverwaltung mittels der Tomcat-users.xml oder Bearbeitung der Speichereinstellung eine Herausforderung.

Beginnen wir mit der Auswahl des Images. Docker stellt mit dem Hub eine Plattform zum Austausch von Images bereit. Eine Suche nach Tomcat fördert dabei ein als official getagtes Image zu Tage. Diese wollen wir installieren. Eine passende Version findet man dann unter dem Tag tomcat:8-jre8. Wir wechseln wieder in die RancherUI und wählen STACKS aus. Mit der Schaltfläche Add Stack kann nun ein neuer Stack erstellt werden, in dem dann ein neuer Tomcat Service laufen wird. Aktuell wird noch angezeigt, dass kein Service existiert. Dieses kann nun mit Add Service geändert werden. Der wichtigste Punkt ist hierbei Select Image. Hier wird das Image in der Nomenklatur : eingetragen.

Weiterhin passen wir hier auch gleich die Weiterleitung an. Da vom Host der Port 8080 schon für die RancherUI verwendet wird, leiten wir den Port 7070 auf den internen Port 8080 des Tomcats um. Es ist dabei zu bedenken, dass wir uns auf eine Standard-Konfiguration des Tomcats beziehen. Alle weiteren Einstellungen belassen wir vorerst auf Standard. es fehlt nur der beherzte Klick auf Create.

Docker respektive Rancher beginnt nun den Service zu deployen und zu starten. Das Ergebnis sieht im Browser erstmal auch nicht schlecht aus. Leider funktioniert die Anmeldung an der Manager App nicht wirklich. Kein Wunder, da der Tomcat im Standard ohne konfigurierte tomcat-users.xml daher kommt.

Noch schlimmer ist aber, dass sich das Image vehement einer Konfiguration selbst über die Console komplett entzieht. Die Änderungen stehen nur temporär zur Verfügung und werden, zumindest ohne einen Commit, beim nächsten Neustart des Image wieder überschrieben. Wir benötigen also einen anderen Weg. Zunächst bereinigen wir aber unser System. wir wechseln in den Tomcat Stack und löschen den Service mit Delete.

Nun müssen wir ein eigenes Image vom tomcat:8-jre8 ableiten und installieren. Dieses findet mehr oder weniger alles auf der Console statt.

Zunächst erzeugen wir ein Unterverzeichnis tomcat8build.

mkdir tomcat8build
cd tomcat8build

In diesem werden alle im weiteren benötigten Dateien abgelegt. Das Vorgehen ist nun folgendes. Wir kopieren quasi das Basis-Image und fügen alle fehlenden Dateien in das Image ein. Das bedeutet nun, wir müssen eine tomcat-users.xml erstellen und füllen.

Daneben möchten wir die Speichereinstellungen bearbeiten. Dieses geschieht im Tomcat über das Shell-Script setenv.sh.

export JAVA_OPTS="-Dfile.encoding=UTF-8 -Xms1024m -Xmx2048m -XX:PermSize=384m -XX:MaxPermSize=384m"

Als letzte Datei benötigen wir eine Datei Dockerfile. Diese steuert den folgenden Build-Prozess.

FROM tomcat:8-jre8

RUN apt-get update && apt-get install -y \ vim \ && rm -rf /var/lib/apt/lists/*

ADD tomcat-users.xml /usr/local/tomcat/conf/ ADD setenv.sh /usr/local/tomcat/bin/

Besprechen wir die Files etwas. Die tomcat-users.xml sollte klar sein. Sie beihaltet nun den user admin mit seinem Passwort admin und den Rollenzuordnungen.

In der setenv.sh wird in Tomcat-Style System-Variabeln übergeben. Filecodierung, minimaler und maximaler Speicher (Xms/Xmx) und das gleiche noch mal für den PermGenSpace. Soweit auch kein Drama.

Das Dockerfile läd in der ersten Zeile das Basis-Image, auf dem unser Build aufbauen soll. Mit dem RUN-Parameter wird nun ein Update eine Installation von vi (der fehlt irgendwie in der Basis) ausgeführt. Achtung, die Dokumentation zum Dockerfile erklärt, dass es zu Seiteneffekten kommen kann, wenn nicht alle apt-Befehle direkt hintereinander ausgeführt und auch gleich wieder aufgeräumt wird. Bitte hier nochmal genau hinschauen.

Die letzten zwei ADD-Befehle fügen nun unsere erstellten Dateien in das Filesystem des Image ein und überschreiben eventuell vorhandenen Dateien. Nun muss der Build nur noch angestoßen werden.

docker build -t tomcat8:B1 .

Auch hier gilt wieder <neuer Image-Name>:<Tag>. Achtung, der Punkt am Ende der Zeile ist wichtig!

Das Ergebnis ist nun ein neue Image, welches wir installieren können.

tomcat8 B1 e758a765c2ec About a minute ago 394.5 MB

Die Installation kennen wir bereits vom Tomcat. Wir verweisen nur auf den neuen Image-Name. Wichtig ist, da das Image nur lokal vorliegt, dass der Haken Always pull image before create entfernt wird. Ansonsten wird das Image im Hub gesucht und die Installation bricht ab, da es nicht gefunden wird.

Jetzt noch im Browser anmelden und tataaaaa: es funktioniert.

Und so nebenbei: wenn man die Shell des Images öffnet, dann geht auch vi :-)

Step 7: Ende Gut Alles Gut?

Sicherlich nicht. Das, was wir gerade gemacht haben, war nur ein erstes vorsichtiges herantasten an RancherUI, Rancher und Docker. Alles in Reinraum-Atmosphäre und ohne größere Tests. Kein Backup, kein Restore, kein Balancing , kein Service klonen usw. usw. usw. Also, noch viel Platz für weitere Forschung.

Dennoch hoffe ich, das es dem einen oder anderen so den ersten Einstieg etwas leichter gemacht hat.

Viel Spaß

Mark

Step 8: Quellennachweis