So richten Sie ein Container-Orchestrierungssystem ein

In meinem vorherigen Beitrag Wie ein Container-Orchestrierungssystem aussehen könnte, habe ich einen Überblick über die Architektur gegeben und die wichtigsten Komponenten eines solchen Systems besprochen. Es basiert auf Nomad als Job Scheduler, Consul für Service Discovery und fabio für Request Routing und Load Balancing.

In diesem Beitrag werde ich Schritt für Schritt beschreiben, wie Sie dieses Container Orchestration System (COS) mit terraform auf einem leeren AWS-Konto einrichten.

Alle in diesem Beitrag beschriebenen Schritte und verwendeten Skripte wurden mit einem Ubuntu 16.04 getestet, sollten aber auch auf anderen Linux-basierten Systemen funktionieren.

Voraussetzungen

Bevor Sie mit dem Rollout des COS beginnen können, müssen Sie sich vorbereiten, indem Sie ein AWS-Konto erstellen und die für den Job erforderlichen Tools installieren.

AWS-Konto- und Berechtigungsnachweisprofil

Der COS-Code wird mithilfe von AWS-Diensten in Terraform geschrieben. Daher benötigen Sie ein AWS-Konto, um dieses System bereitstellen zu können.
Um ein neues Konto zu erstellen, müssen Sie nur dem Tutorial Erstellen und Aktivieren eines AWS-Kontos folgen.

Mit einem Konto müssen Sie AWS-Zugriffsschlüssel über die AWS-Webkonsole erstellen:

  1. Melden Sie sich bei Ihrem neuen AWS-Konto an.
  2. Erstellen Sie einen neuen Benutzer für Ihr Konto, indem Sie diesem Tutorial folgen.
  3. Erstellen Sie einen neuen Zugriffsschlüssel für diesen Benutzer, indem Sie diesem Lernprogramm folgen.

Vergessen Sie beim Ausführen dieser Schritte nicht, die Schlüssel tatsächlich herunterzuladen. Dies ist das einzige Mal, dass Sie dies tun können. Wenn Sie Ihre Schlüssel verlieren, müssen Sie nach den gleichen Schritten einen neuen erstellen.

Die heruntergeladene Datei accessKeys.csv enthält die Zugriffsschlüssel-ID und den geheimen Zugriffsschlüssel.

Mit dem Schlüssel können Sie jetzt ein AWS-Profil erstellen. Ein solches Profil ist lediglich ein Name, der auf Zugriffsschlüssel und einige Optionen für das zu verwendende AWS-Konto verweist. Daher müssen Sie die Datei ~ / .aws / credentials erstellen oder bearbeiten.
In dieser Datei fügen Sie einfach einen neuen Abschnitt mit dem Namen my_cos_account hinzu, indem Sie die Zugriffsschlüssel-ID und den geheimen Zugriffsschlüssel einfügen und die Datei speichern.

[my_cos_account]
aws_access_key_id = HIER IHREN ZUGRIFFSSCHLÜSSEL EINFÜGEN
aws_secret_access_key = HIER IHREN GEHEIMEN SCHLÜSSEL EINFÜGEN

Jetzt ist ein Profil mit dem Namen my_cos_account verfügbar, das zum direkten Erstellen der AWS-Ressourcen verwendet wird, die zum Aufbau des COS erforderlich sind.

Werkzeuge

Bevor Sie wirklich mit der Bereitstellung des COS beginnen können, müssen Sie einige wichtige Tools installieren.

Terraform: Wird zum Erstellen von AWS-Ressourcen benötigt. Hier wird die Version 0.11.11 verwendet.

  • Laden Sie die Binärdatei von Terraform Downloads herunter.
  • Entpacken und installieren.
CD ~ / Downloads
Entpacken Sie terraform_0.11.11_linux_amd64.zip
sudo mkdir -p /opt/terraform/0.11.11
sudo mv terraform /opt/terraform/0.11.11
cd / usr / bin
sudo ln -s /opt/terraform/0.11.11/terraform terraform
  • Testen Sie es mit terraform --version

Nomad (CLI): Wird als CLI benötigt, um Dienste für das COS bereitzustellen und den Status des COS anzuzeigen. Hier wird Version 0.8.6 verwendet.

  • Laden Sie die Binärdatei von Nomad Downloads herunter
  • Entpacken und installieren.
CD ~ / Downloads
Entpacken Sie nomad_0.8.6_linux_amd64.zip
sudo mkdir -p /opt/nomad/0.8.6
sudo mv nomad /opt/nomad/0.8.6
cd / usr / bin
sudo ln -s /opt/nomad/0.8.6/nomad nomad
  • Testen Sie es mit nomad --version

Packer: Wird zum Backen (Erstellen) des AWS AMI benötigt, das die Nomad-Binärdatei enthält, und wird dann tatsächlich als Image für die AWS EC2-Instanzen verwendet, die die COS bilden. Hier wird Version 1.3.3 verwendet.

  • Laden Sie die Binärdatei von Packer Downloads herunter
  • Entpacken und installieren.
CD ~ / Downloads
Entpacken Sie packer_1.3.3_linux_amd64.zip
sudo mkdir -p /opt/packer/1.3.3
sudo mv packer /opt/packer/1.3.3
cd / usr / bin
sudo ln -s /opt/packer/1.3.3/packer packer
  • Teste es mit packer --version

Einsatz

Das gesamte Setup besteht aus Terraform-Code und ist unter https://github.com/MatthiasScholz/cos verfügbar.
Dieses Projekt ist als Terraform-Modul mit einer maßgeschneiderten API konzipiert. Es kann direkt in eine bestehende Infrastruktur integriert werden, indem ein Container Orchestration System hinzugefügt wird.
Zusätzlich bietet dieses Projekt ein eigenständiges Root-Beispiel, das neben dem COS auch eine minimale Netzwerkinfrastruktur bereitstellt. Dieses Beispiel wird hier verwendet, um das System einzuführen.

Dazu müssen folgende Schritte ausgeführt werden:

  1. Beziehen Sie den Quellcode von Github.
  2. Erstellen Sie das Machine Image (AMI) für die EC2-Instanzen.
  3. Erstellen Sie ein EC2-Instanzschlüsselpaar.
  4. Stellen Sie die Infrastruktur und das COS bereit.
  5. Setzen Sie fabio ein.
  6. Stellen Sie einen Beispielservice bereit.

Besorgen Sie sich den Code

# Arbeitsordner erstellen
mkdir ~ / medium-cos / && cd ~ / medium-cos /

# Klonen Sie den Code mit dem Tag v0.0.3
git clone --branch v0.0.3 https://github.com/MatthiasScholz/cos

Erstellen Sie das Maschinen-Image

Am Ende muss es auf einigen Instanzen eine Serverversion und auf einigen eine Clientversion von consul und nomad geben. Das Gute dabei ist, dass sowohl consul als auch nomad als Binärdatei ausgeliefert werden, die den Client- und den Servermodus unterstützt. Sie müssen nur mit unterschiedlichen Parametern aufgerufen werden.
Dies führt zu der schönen Situation, dass nur ein Maschinenbild gebacken werden muss. Dieses Bild enthält den Nomaden und die Konsulbinärdatei.

Mit diesem AMI:

  • Instanzen, bei denen consul im Servermodus ausgeführt wird und kein Nomad ausgeführt wird, können gestartet werden. Diese repräsentieren die Konsul-Serverknoten.
  • Instanzen, bei denen consul im Client-Modus und nomad im Server-Modus ausgeführt wird, können gestartet werden. Diese repräsentieren die Nomadenserverknoten.
  • Instanzen, bei denen consul im Client-Modus und nomad im Client-Modus ausgeführt wird, können gestartet werden. Diese repräsentieren die nomadischen Clientknoten.

Um dieses AMI zu erstellen, muss der erste Packer mit den korrekten AWS-Anmeldeinformationen geliefert werden. Wie unter Authentication Packer beschrieben, können Sie statische Variablen, Umgebungsvariablen oder freigegebene Anmeldeinformationen verwenden.
Diese können in einer Shell festgelegt werden, indem einfach die folgenden Parameter exportiert werden.

# Umgebungsvariablen
export AWS_ACCESS_KEY_ID = 
export AWS_SECRET_ACCESS_KEY = 
export AWS_DEFAULT_REGION = us-east-1

Um das AMI zu erstellen, rufen Sie einfach auf:

cd ~ / medium-cos / cos / modules / ami2
# bauen die
packer build -var 'aws_region = us-east-1' -var 'ami_regions = us-east-1' nomad-consul-docker.json

Als Ergebnis erhalten Sie die ID des erstellten AMI.

==> amazon-linux-ami2: Temporäres Schlüsselpaar wird gelöscht ...
Build 'amazon-linux-ami2' fertig.

==> Builds fertig. Die Artefakte erfolgreicher Builds sind:
-> amazon-linux-ami2: AMIs wurden erstellt:
us-east-1: ami-1234567890xyz

Erstellen Sie ein EC2-Instanzschlüsselpaar

Auf alle Instanzen des COS kann über ssh zugegriffen werden. Daher wird während der Bereitstellung ein AWS-Instanzschlüsselpaar benötigt.
Der zu erstellende Schlüssel muss den Namen kp-us-east-1-playground-instancekey haben. Der Schlüssel wird während der Bereitstellung mit genau diesem Namen referenziert.

Wie Sie ein Schlüsselpaar erstellen, wird unter Erstellen eines Schlüsselpaars mit Amazon EC2 beschrieben.

Stellen Sie das COS bereit

Für das Deployment werden die Beispiele / Root-Beispiele verwendet. Es ist eigenständig und bildet nicht nur das COS selbst, sondern auch die zugrunde liegende Netzwerkinfrastruktur.

In diesem Schritt benötigen Sie die ID des zuvor erstellten AMI und den Namen Ihres AWS-Profils. In unserem Beispiel lautet die AMI-ID ami-1234567890xyz und das Profil heißt my_cos_account.

cd ~ / medium-cos / cos / examples / root-example
# Terraform initialisieren, Pugins und Module herunterladen
terraform init

# Aufruf des generischen Terraform-Plans
# terraform plan -out cos.plan -var deploy_profile =  -var nomad_ami_id_servers =  -var nomad_ami_id_clients = 
terraform plan -out cos.plan -var deploy_profile = my_cos_account -var nomad_ami_id_servers = ami-1234567890xyz -var nomad_ami_id_clients = ami-1234567890xyz

# Die geplanten Änderungen anwenden, dh das COS bereitstellen
terraform "cos.plan" anwenden

Nach erfolgreicher Bereitstellung druckt terraform einige nützliche Parameter auf das Terminal.

Diese können verwendet werden, um die nomadische Benutzeroberfläche xdg-open "http: // $ (terraform output nomad_ui_alb_dns)" oder die konsularische Benutzeroberfläche xdg-open "http: // $ (terraform output consul_ui_alb_dns)" in Ihrem Browser zu öffnen.

Das Bild oben zeigt die Web-Benutzeroberfläche des leeren, aber laufenden Nomaden-Clusters.

Stellen Sie Fabio bereit

Jetzt, da ein leeres System eingerichtet ist und der letzte fehlende Teil ausgeführt wird, um das COS-Setup abzuschließen, ist Fabio der Ingress Traffic Controller.
Fabio wird als erster Nomadenjob eingesetzt.

Um mit dem Nomad-Server zu interagieren, können Sie die lokal auf Ihrem Computer installierte Nomad-CLI verwenden. Zuerst müssen Sie angeben, wo die Nomad CLI den Nomadenserver finden kann, indem Sie die Umgebungsvariable NOMAD_ADDR entsprechend einstellen.
Dies kann durch Aufrufen von cd ~ / medium-cos / cos / examples / root-example && export NOMAD_ADDR = http: // $ (Terraform-Ausgabe nomad_ui_alb_dns) erfolgen.
Bei Nomadenservern sollten Sie jetzt eine Liste mit drei Nomadenservern erhalten, von denen einer zum Anführer gewählt wurde.

Die Nomad Job Description für das Deployment von Fabio finden Sie unter ~ / medium-cos / cos / examples / jobs / fabio.nomad. Es wird die rohe Binärdatei des Reverse-Proxys rollen, also noch kein Docker-Job.

job "fabio" {
  Rechenzentren = ["öffentliche Dienste"]

  Typ = "System"
  aktualisieren {
    Staffelung = "5s"
    max_parallel = 1
  }

  Gruppe "Fabio" {
    aufgabe "fabio" {
      driver = "exec"
      config {
        command = "fabio-1.5.8-go1.10-linux_amd64"
      }

      Artefakt {
        source = "https://github.com/eBay/fabio/releases/download/v1.5.8/fabio-1.5.8-go1.10-linux_amd64"
      }

      Ressourcen {
        CPU = 500
        Speicher = 128
        Netzwerk {
          MBits = 1

          Port "http" {
            statisch = 9999
          }
          Port "ui" {
            statisch = 9998s
          }
        }
      }
    }
  }
}

Mit nomad run ~ / medium-cos / cos / examples / jobs / fabio.nomad wird fabio für nomad bereitgestellt, um das COS-Setup abzuschließen.
Um zu testen, ob die Bereitstellung erfolgreich war, können Sie entweder die Fabio-Benutzeroberfläche mit xdg-open "http: // $ (terraform output fabio_ui_alb_dns)" öffnen oder die Nomad-Benutzeroberfläche überprüfen.

In der Abbildung oben ist fabio dargestellt, das als Nomadensystemjob ausgeführt wird. Somit war der Einsatz erfolgreich.

Stellen Sie einen Beispieldienst bereit

Zum COS-Projekt bei github gehört auch eine Nomaden-Jobbeschreibung für die Bereitstellung eines Beispieldienstes, des Ping-Dienstes.

Der Ping-Dienst ist ein einfacher Dienst zu Testzwecken. Wenn Sie eine Anfrage an den Endpunkt des Dienstes senden, versucht der Dienst, diese Anfrage an andere Instanzen des Ping-Dienstes weiterzuleiten. Dies erfolgt für eine definierte Anzahl von Sprüngen oder "Pings". Für jeden Hop wird der Antwort ein „Ping“ hinzugefügt. Der letzte Empfänger in der Kette beendet die Weiterleitung und fügt der verketteten Nachrichtenliste ein "Pong" hinzu.

Lassen Sie uns nun den Ping-Dienst bereitstellen und eine Anfrage dagegen senden.
Durch Aufrufen von nomad run ~ / medium-cos / cos / examples / jobs / ping_service.nomad werden vier Instanzen des Ping-Service auf dem COS bereitgestellt.
Wenn man sich den Konsul ansieht, sieht man, dass neben Konsul, Nomade, Nomadenkunde und Fabio auch der Ping-Dienst automatisch vom Nomaden registriert wird. Somit können die vier implementierten Ping-Service-Instanzen über die Serviceerkennung gefunden werden.

Jede Instanz des Dienstes wird in einem der vier Rechenzentren des COS ausgeführt, in öffentlichen Diensten, privaten Diensten, Content-Connector- oder Backoffice-Rechenzentren. Weitere Informationen zu den verfügbaren Rechenzentren finden Sie unter COS Architecture.

Randnotiz: Wie Sie im Bild sehen können, wurde der Tag urlprefix- / ping für den Ping-Dienst hinzugefügt. Dieses Tag wird benötigt, um Fabio mitzuteilen, an welchen Dienst er alle Anforderungen weiterleiten soll, die den Endpunkt / Ping erreicht haben. Weitere Details dazu finden Sie unter fabio quickstart.

Um zu testen, ob der Ping-Service korrekt implementiert wurde, ob er die anderen Instanzen mithilfe der Konsulenkatalog-API finden kann und ob Fabio eine Anfrage an eine Ping-Service-Instanz weiterleiten kann, müssen Sie nur eine GET-Anfrage an den / senden. Ping-Endpunkt.

# Ermitteln Sie den DNS-Namen des Ingress-ALB
export IGRESS_ALB = http: // $ (Terraform-Ausgabe ingress_alb_dns)

# Senden Sie die Testanfrage einmal gegen den Ping-Dienst, der im COS läuft
curl $ IGRESS_ALB / ping

Als Ergebnis bekommen Sie etw. mögen:

{
  "message": "/[private-services,v1‹/[public-services,v1‹/[content-connector,v1‹/.../[content-connector,v1‹(PONG)",
  "name": "private-services",
  "version": "v1"
}

Der Feldname gibt das Rechenzentrum der Ping-Service-Instanz an, die zuerst von der Anfrage getroffen wurde (Hop Nummer eins). Im Nachrichtenfeld können Sie sehen, wie sich die Anforderung über die bereitgestellten Instanzen des Dienstes ausbreitet. Von den privaten Diensten über die öffentlichen Dienste bis hin zum Content-Connector, um nach 10 Hops mit der PONG-Nachricht endlich aufzuhören.

Dieser Test zeigt deutlich, dass die Service-Discovery über Consul und das Request-Routing mit Fabio wie vorgesehen funktioniert.

Aufräumen

Um zu vermeiden, dass Sie Geld für die AWS-Ressourcen zahlen, wenn Sie das COS nicht mehr verwenden, sollten Sie es abreißen.
Mit terraform ist das ganz einfach. Mit dem folgenden Befehl werden alle Infrastrukturkomponenten aus Ihrem AWS-Konto entfernt, jedoch nur die, die Sie in dieser Anleitung mit terraform erstellt haben.

cd ~ / medium-cos / cos / examples / root-example
terraform destroy -var deploy_profile = my_cos_account

Zusammenfassung und Ausblick

In diesem Beitrag habe ich gezeigt, wie ein Container-Orchestrierungssystem eingerichtet wird, wie unter So könnte ein Container-Orchestrierungssystem aussehen beschrieben. Ich begann mit der Erläuterung der Installation des Basis-Setups. Anschließend bauen Sie die COS auf einem leeren AWS-Konto auf, indem Sie den unter https://github.com/MatthiasScholz/cos verfügbaren Terraform-Code verwenden und fabio bereitstellen. Um das System schließlich nutzen zu können, wurde ein erster Musterservice eingeführt und getestet.

Mit dem COS-Projekt können Sie es ganz einfach selbst ausprobieren. Stellen Sie das Root-Beispiel bereit, führen Sie Ihre Dienste aus, erweitern Sie die COS durch Hinzufügen von Überwachung und Protokollierung usw. Darüber hinaus können Sie das COS-Terraform-Modul verwenden und direkt in Ihre Infrastruktur integrieren.

Im nächsten Beitrag werde ich zeigen, wie eine gute, standardmäßige Nomadenberufsbeschreibung aussehen kann, um ein ausfallsicheres System zum Laufen zu bringen.