Container Plattform

Themen

Einleitung

Im vorherigen Kapitel hast du zwei Container Images für die Frontend Applikation und die Backend Applikation erstellt. Wie besprochen beinhaltet das Container Image die Applikation, es beinhaltet die Abhängigkeiten die die Applikation benötigt, und das Container Image beschreibt wie die Applikation ausgeführt werden kann. Eine Abhängigkeit vom Frontend ist zum Beispiel die HTTP Webserver-Software Nginx und das Backend Container Image beinhaltet eine Python Laufzeitumgebung, da das Backend in Python implementiert ist und Python zum ausführen braucht.

Du hast die Container Images in Amazon ECR Container Repositories hochgeladen. Die Container Repositories speichern die Container Images. Also fragst du dich vielleicht wie die Container ausgeführt werden, damit deine Frontend und Backend Applikationen nutzbar sind? Damit wirst du dich in diesem Kapitel beschäftigen.

Technische Konzepte

Eine Container Engine ist Software, die ein Container Image aus einer Container Registry herunterlädt und den Container ausführt. Die Container Engine virtualisiert das darunterliegende Host-Betriebssystem. Das bedeutet, dass der Container nicht direkt mit dem Betriebssystem interagiert, sondern alle Aufrufe durch die Container Engine gehen. Somit isoliert die Container Engine den Container vom Rest des Systems, dies trägt zu besserer Sicherheit bei.

Ein Containerverwaltungsservice (engl. Container Orchestrator) ist Software, die im Kontext vom Ausführen von Containern auftaucht. Ein Containerverwaltungsservice ist nicht zwingend notwendig zum Ausführen von einem Container, dafür ist die Container Engine zuständig. Dennoch macht ein Containerverwaltungsservice das Betreiben von Container einfacher. Meistens soll nicht nur ein Container ausgeführt werden. Oft werden mehrere Container mit dem gleichen oder unterschiedlichen Container Images ausgeführt. Im Zusammenhang von Cloud Computing hast du bereits Anforderungen wie hohe Verfügbarkeit und Elastizität kennengelernt. Diese Anforderungen können durch das Ausführen von mehreren Containern erfüllt werden. Ein Containerverwaltungsservice kontrolliert die Anzahl der Container. Zum Beispiel kann ein Containerverwaltungsservice, wenn am Black Friday mehr Kunden als normal gleichzeitig shoppen, mehr Container starten, damit alle Anfragen bearbeitet werden (Elastizität). Ein Containerverwaltungsservice kann einen Container neu starten, falls dieser gecrasht ist und trägt somit zur Hohen Verfügbarkeit bei.

Lass uns all diese neuen Konzepte mithilfe von einer Analogie besser verstehen. Ein musikalisches Blasorchester besteht aus einem Dirigenten, Musikinstrumenten (z.B. Trompete, Tuba, …), Menschen, und Notenbüchern. Ein Notenbuch beinhalten den Text der Musik beschreibt. Ein Notenbuch ist wie ein Container Image, das Container Image beinhaltet den Code, der die Applikation beschreibt. Die Notenbücher werden in einem Bücherregal gespeichert. Genauso werden Container Images in einer Container Registry gespeichert. Das Bücherregal ist also die Analogie für eine Container Registry. Um eine Aufführung durchzuführen, wählen die Menschen, die im Orchester mitspielen, verschiedene Notenbücher für die verschiedenen Instrumente. Die Menschen sind also wie eine Container Engine, die Container Images herunterlädt. Die Menschen in einem Blasorchester blasen Luft in die Musikinstrumente und die Musikinstrumente produzieren Töne. Vergleichbar führt die Container Engine (Menschen) die Container aus und gibt die Eingabe (Luft) an die Container (Musikinstrumente). Die Bühne, auf der die Menschen mit den Musikinstrumenten stehen, kann unsere Serverhardware mit Host-Betriebssystem darstellen. Auf der Bühne können mehrere Trompeten gleichzeitig gespielt werden und es können auch andere Musikinstrumente zeitgleich auf der Bühne gespielt werden. Genauso kann die Container Engine auf dem Host-Betriebssystem mehrere Instanzen von einem Container Image gleichzeitig ausführen und auch Container mit einem anderen Container Image zeitgleich ausführen. Zum Beispiel können mehrere Backend-Container und mehrere Frontend-Container gleichzeitig ausgeführt werden. Zuletzt steht der Dirigent in unserer Analogie stellvertretend für den Containerverwaltungsservice. Der Dirigent leitet das Orchester und sagt den Menschen, die Instrumente nicht zu spielen oder weiterzuspielen. Auch der Containerverwaltungsservice sendet der Container Engine Befehle, um Container zu stoppen oder zu starten.



Relevante AWS Services

Amazon Elastic Container Service (Amazon ECS) ist ein Containerverwaltungsservice. Es müssen Aufgaben definiert werden (Task Definition), um Docker-Container in Amazon ECS auszuführen. Dabei legst du fest, welches Docker-Image jeder Container für die Aufgaben nutzen soll und wie viel CPU und Speicher dafür zu Verfügung stehen. Weitere Parameter können je nach Bedarf angepasst werden. In der Definition einer Aufgabe können mehrere Container genutzt werden. Die Aufgabe selbst muss nicht die ganze Anwendung enthalten, sondern die Anwendung kann auf mehrere Aufgabendefinitionen aufgeteilt werden.

Je nachdem wie der Workload variiert und ob Container selbstständig verwaltet werden sollen, gibt es verschiedene Launchtypes für Amazon ECS: Amazon EC2 und AWS Fargate. Der Launchtype EC2 stellt Amazon EC2-Instanzen für die Container zur Verfügung und eignet sich für stabile CPU- und Speicherauslastungen. Zusätzlich musst du deine Infrastruktur selbst verwalten.

Im Vergleich dazu bietet der Launchtype Fargate den Vorteil, dass die Infrastruktur nicht selbst verwaltet werden muss und sich dieser selbstständig skaliert, wodurch die Anzahl seiner Aufgaben erhöhen oder reduzieren kann je nach Grösse der Nachfrage. Die Skalierung kann als Grundlage den Wert einer Metrik nutzen beispielsweise die CPU-Auslastung. Durch diese Metriken kann dann festgelegt werden, wann Amazon ECS skalieren soll.

Eine andere Art der Skalierung ist die geplante Skalierung. Dadurch wird festgelegt an welchem Tag und zu welcher Zeit eine bestimmte Menge an Aufgaben erfüllt werden soll. Als dritte Möglichkeit kann die Anpassung auch schrittweise erfolgen. Je nachdem wie groß oder klein die Veränderung der betrachteten Metrik ist, zum Beispiel der mittleren CPU-Auslastung, hängt davon auch die Skalierung ab. Die Skalierbarkeit ist für mehrere Availability Zones automatisch möglich und erhöht dadurch die Verfügbarkeit der eigenen Anwendungen, da durch die Availability Zones die Anwendung redundant wird. Um die Amazon EC2-Instanzen in einem Amazon ECS-Cluster zu managen, ist kein weiteres Programm nötig. Mit API-Aufrufen können container-basierte Anwendungen einfach gestartet und gestoppt werden. Außerdem können dadurch Informationen über den gesamten Zustand des Clusters aufgerufen werden. Durch Amazon ECS können auch viele bereits bekannte Services genutzt werden wie Security Groups und and IAM-Rollen.


Anwendung

In den folgenden Schritten wirst du einen Container Cluster erstellen. Das Cluster wird im nächsten Kapitel genutzt, um Frontend- und Backend-Container auszuführen. Die Task Definitionen, die du in diesem Kapitel erstellst, beschreiben, wie ein Cluster einen Frontend-, bzw. Backend-Container starten soll.

Als letzter Schritt in diesem Kapitel wirst du als Test einen einzelnen Frontend-Container manuell starten. Im nächsten Kapitel werden dann Container, beschrieben durch die Task Definitionen, automatisch gestartet.

Erstellen des Container Clusters

Aufgabe: Erstelle ein Container Cluster in Amazon Elastic Container Service (Amazon ECS) und benenne es workshop-cluster. Nutze als Template Networking only und wähle Use Container Insights aus, um mehr Einblicke später in das Cluster zu bekommen.

Hinweis
Lösung

Beim ersten Versuch den Amazon ECS Cluster zu erstellen kann es ggf. zu einer Fehlermeldung kommen mit dem Vermerk, dass eine Service Rolle noch nicht existiert. Sollte das der Fall sein, den Vorgang mit Cancel abbrechen und die oben genannten Schritte 1 - 6 nochmals ausführen. Im Hintergrund wurde die Rolle dann automatisch angelegt.

Erstellen der Task Definition

Vorgehen für Backend Container:
  1. Im Bereich Amazon ECS auf Task Definitions klicken.
  2. Klick auf Create new Task Definition.
  3. Als Task Definition Name workshop-backend eingeben.
  4. Als Launch Type AWS Fargate auswählen und als Operating system Linux/X86_64.
  5. Für Task CPU (vCPU) 0.25vCPU auswählen.
  6. Bei Task memory (GB) 0.5GB auswählen.
  7. Als Task Role None auswählen.
  8. Bei Task Execution Role LabRole eingeben.
  9. Als Container Name container-backend eingeben.
  10. Als Image Referenz die URI den Pfad von Amazon ECR eingeben (sollte wie folgt aussehen):
<yourAWSAccountID>.dkr.ecr.us-east-1.amazonaws.com/workshop-backend:latest
  1. Unter Port mappings den Port 5000 angeben.
  2. Im Abschnitt Environment Variables die folgenden Umgebungsvariablen (case sensitive) eingeben. Der DNS Endpunkt der DB Instanz sollte eine ähnliche Struktur haben wie dieser Endpunkt: workshop-db.xxxxxxxxx.us-east-1.rds.amazonaws.com. Diesen findest du bei deiner bereits erstellten RDS Datenbank.
    • Key: DB_USER | Value: clusteradmin
    • Key: DB_PASSWORD | Value: todopassword
    • Key: DB_HOST | Value: DNS Endpunkt der DB Instanz
  3. Die restlichen Optionen bleiben unverändert. Am Ende der Seite auf Create und danach View task definition klicken.

Die Umgebungsvariablen werden im Source Code der Backend Applikation gelesen. Du setzt hier Werte für die drei Umgebungsvariablen DB_USER, DB_PASSWORD, und DB_HOST. Diese Informationen nutzt der Source Code der Backend Applikation um sich mit der Datenbank zu verbinden. Mit dem DNS Endpunkt (DB_HOST) kann die Backend Applikation die Datenbank im Internet finden. Dann kann sich die Applikation mit dem DB_USER und DB_PASSWORD bei der Datenbank anmelden. Die angemeldete Backend Applikation kann jetzt Daten aus der Datenbank lesen oder neue Daten in der Datenbank speichern.

Vorgehen für Frontend Container:
  1. Im Bereich Amazon ECS auf Task Definitions klicken.
  2. Klick auf Create new Task Definition.
  3. Als Task Definition Name workshop-frontend eingeben.
  4. Als Launch Type AWS Fargate auswählen und als Operating system Linux/X86_64.
  5. Für Task CPU (vCPU) 0.25vCPU auswählen.
  6. Bei Task memory (GB) 0.5GB auswählen.
  7. Als Task Role None auswählen.
  8. Bei Task Execution Role LabRole eingeben.
  9. Als Container Name container-frontend eingeben.
  10. Als Image Referenz die URI den Pfad von Amazon ECR eingeben (sollte wie folgt aussehen):
<yourAWSAccountID>.dkr.ecr.us-east-1.amazonaws.com/workshop-frontend:latest
  1. Unter Port mappings den Port 8080 angeben.
  2. Die restlichen Optionen bleiben unverändert. Am Ende der Seite auf Create und danach View task definition klicken.

Launch der Beispielapplikation

Start eines einzelnen Frontend Containers:
  1. Klick auf Task Definition.
  2. In der Übersicht die workshop-frontend Task Definition auswählen.
  3. Unter Deploy auf Run Task klicken.
  4. Als Cluster workshop-cluster auswählen.
  5. Unter Compute options Launch Type auswählen. Der Launch type sollte auf FARGATE gesetzt sein.
  6. Unter Networking das Workshop-VPC auswählen.
  7. Als Subnet das Workshop-PublicA auswählen.
  8. Bei Security groups Workshop-ECS-Task-SG auswählen.
  9. Stelle sicher, dass bei Auto-assign public IP auf Enabled ausgewählt ist.
  10. Klick auf Run Task.

In der Übersicht wird auch der Status des Containers angezeigt. Die Spalten Last status und Desired status geben den aktuellen sowie den Ziel-Status an. Während des Starts des Containers werden die Phasen Pending und Provisioning durchlaufen. Der Container muss zuerst von aus dem Container Repository heruntergeladen werden. Dieser Prozess kann eine kurze Zeit dauern.

Aufgabe: Greife auf das Frontend durch die Public IP unter dem Port 8080 des Containers zu, indem du die IP in einem neuen Tab öffnest und den Port hinzufügst. Jetzt ist das Frontend der ToDo-App zusehen.

http://<yourContainerIP>:8080
Lösung

Das Starten des Frontend Containers soll lediglich veranschaulichen, wie einfach ein einzelner Container gestartet werden kann. Die hierfür verwendete Security Group Workshop-ECS-Task-SG wird hier ebenfalls nur für Testzwecks verwendet. Beiträge in der ToDo-Anwendung werden noch nicht über das Backend in der Datenbank gespeichert. Im nächsten Kapitel wird die Beispielanwendung hochverfügbar hinter einem Load Balancer gestartet.

Zusammenfassung und nächste Schritte

Herzlichen Glückwunsch! Du hast erfolgreich ein neues Container Cluster erstellt. Durch den Launch Mode Fargate sind keine darunterliegende Hosts notwendig. Diese Betriebsart ist sehr effektiv, da keinerlei Infrastruktur (Hosts) bereitgestellt, verwaltet, skaliert und überwacht werden muss. Mit den beiden Task Definitions wurden die Vorlagen für die spätere Ausführung der beiden Container (Frontend und Backend) erstellt. Du hast den Frontend Container kurz gestartet, um zu testen, dass er funktioniert und wie einfach ein Container bereitgestellt werden kann. Im nächsten Kapitel geht es darum, einen Load Balancer zu konfigurieren und die beiden Task Definitionen als Container Service zu starten.