So automatisieren Sie die Skalierung Ihrer Webanwendung auf DigitalOcean Ubuntu 16.04-Droplets

Einführung

In diesem Lernprogramm wird gezeigt, wie Sie die DigitalOcean-API verwenden, um Ihr Server-Setup mithilfe vonDOProxy horizontal zu skalieren. Dieses Ruby-Skript bietet nach der Konfiguration eine Befehlszeilenschnittstelle zum Skalieren Ihrer HTTP-Anwendungsserverschicht.

DOProxy wurde speziell für dieses Lernprogramm entwickelt, um eine einfache Möglichkeit zum Erstellen und Löschen von Anwendungsserver-Droplets mithilfe der DigitalOcean-API sowie zum Verwalten ihrer Mitgliedschaft in einem HAProxy-Lastenausgleich bereitzustellen. Dieses grundlegende Skalierungsmodell ermöglicht Benutzern den Zugriff auf Ihre Anwendung über den HAProxy-Server, der sie auf lastausgeglichene Weise an die Back-End-Anwendungsserver weiterleitet.

DOProxy führt drei Hauptfunktionen aus:

  • Erstellt Droplets und fügt sie dem Load Balancer hinzu

  • Löscht Droplets und entfernt sie aus dem Load Balancer

  • Verwaltet ein Inventar der von ihm erstellten Tröpfchen, bis sie gelöscht werden

DOProxy create

[.note] #Note: Der Hauptzweck dieses Lernprogramms besteht darin, die minimal erforderlichen Konzepte zu vermitteln, die zum programmgesteuerten Skalieren Ihrer DigitalOcean-Serverarchitektur über die API erforderlich sind. Sie sollten DOProxy nicht in einer Produktionsumgebung ausführen, da es nicht auf Ausfallsicherheit ausgelegt ist und nur sehr grundlegende Fehlerprüfungen durchführt. Wenn Sie sich mit diesem Skript vertraut machen, können Sie sich zunächst mit der horizontalen Skalierung über die DigitalOcean-API vertraut machen.
#

Voraussetzungen

In diesem Lernprogramm werden die folgenden Technologien verwendet, über die Sie möglicherweise lesen möchten, bevor Sie fortfahren:

Da DOProxy in Ruby geschrieben ist, können Kenntnisse in Ruby von Vorteil sein. Um sich besser mit Ruby vertraut zu machen, können Sie unsere Serie zuHow To Code in Ruby lesen. Wenn Sie mit Ruby weniger vertraut sind, stellen wir Ihnen einen Pseudocode zur Verfügung, um den Kern des DOProxy-Codes zu erläutern. Um unsere Aufrufe der API zu vereinfachen, verwenden wirDropletKit, den offiziellen DigitalOcean Ruby-Wrapper.

Bevor wir uns mit der Funktionsweise von DOProxy befassen, werden wir es installieren und auf einem Server verwenden.

Lassen Sie uns DOProxy jetzt auf einem Ubuntu 16.04-Droplet installieren.

Installieren Sie DOProxy

Erstellen Sie zunächst ein Ubuntu 16.04-Droplet in der NYC3-Region, die standardmäßig von DOProxy verwendet wird. Wenn Sie eine andere Region verwenden möchten, müssen Sie die Variableregion in der Dateidoproxy.yml nach der Installation von DOProxy konfigurieren. Dieses Droplet führt den HAProxy-Lastenausgleich und das DOProxy-Skalierungsskript aus. Wählen Sie daher eine Größe, die Ihrer Meinung nach für Ihr gewünschtes Skalierungspotenzial geeignet ist. Da dieses Tutorial eine grundlegende Demonstration der Skalierung ist, bei der kein tatsächlicher Datenverkehr erwartet wird, ist die Größe von 512 MB wahrscheinlich ausreichend.

Für die Länge dieses Dokuments bezeichnen wir dieses Tröpfchen alsDOProxy server.

Melden Sie sich als Nächstes beim Server an und befolgen Sie die AbschnitteInstallation undConfiguration (einschließlichdoproxy config undUserdata) in den AbschnittenDOProxy GitHub repository README, um DOProxy auf diesem Server zu installieren. Stellen Sie sicher, dass Sie die WerteYOUR_DO_API_TOKEN undYOUR_SSH_KEY_FINGERPRINT in der DOproxy-Konfigurationsdatei ersetzen. Andernfalls funktioniert das Skript nicht.

Nachdem Sie DOProxy und HAProxy auf Ihrem Server installiert haben, können Sie versuchen, die Umgebung zu skalieren.

Führen Sie DOProxy aus

Melden Sie sich alsroot bei Ihrem DOProxy-Server an und rufen Sie das Verzeichnis auf, in das Sie DOProxy geklont haben.

Führen Sie DOProxy ohne Argumente aus:

ruby doproxy.rb

Dies sollte die verfügbaren Befehle ausdrucken:

OutputCommands:
doproxy.rb print                   # Print backend Droplets in inventory file
doproxy.rb create                  # Create a new backend Droplet and reload
doproxy.rb delete     # Delete a Droplet and reload
doproxy.rb reload                  # Generate HAProxy config and reload HAProxy
doproxy.rb generate                # Generate HAProxy config based on inventory

Zu diesem Zeitpunkt hat DOProxy noch keine Droplets erstellt. Erstellen wir einige, um unseren HTTP-Service online zu stellen und zu skalieren.

Skalieren (Erstellen)

Führen Sie den Befehlcreate aus, um das erste von DOProxy verwaltete Droplet zu erstellen:

ruby doproxy.rb create

Dies dauert einige Zeit, bevor Sie zur Eingabeaufforderung zurückkehren (da das Skript ein neues Droplet über die API erstellt und darauf wartet, dass es gestartet wird). Wir werden darüber sprechen, wie der API-Aufruf erfolgt, wenn wir den Pseudocode durchgehen.

Sobald das Skript fertig ist, sollten Sie eine Erfolgsmeldung sehen, die die Droplet-ID enthält:

OutputSuccess: 4202645 created and added to backend.

Es wird empfohlen, nach der Rückkehr der Eingabeaufforderung einige Minuten zu warten, bevor Sie mit den nächsten Schritten fortfahren, da das Benutzerdatenskript möglicherweise noch nicht ausgeführt wurde und der HAProxy daher möglicherweise keinen Datenverkehr mehr weiterleitet.

Wenn Sie fortfahren möchten, rufen Sie die öffentliche IP-Adresse Ihres DOProxy-Servers in einem Webbrowser auf. Sie sollten eine Seite sehen, auf der diehostname,id undpublic IP address Ihres neuen Droplets aufgelistet sind.

Wir werden DOProxy verwenden, um zwei weitere Droplets für insgesamt drei zu erstellen. Sie können gerne mehr erstellen, wenn Sie möchten:

ruby doproxy.rb create
ruby doproxy.rb create

Besuchen Sie nun die öffentliche IP-Adresse Ihres DOProxy-Servers erneut in einem Webbrowser. Wenn Sie die Seite aktualisieren, werden Sie feststellen, dass sich die Informationen auf der Seite ändern, während Sie durch die von Ihnen erstellten Droplets blättern. Dies liegt daran, dass alle von HAProxy Lastenausgleich durchgeführt werden, wodurch jedes Droplet bei der Erstellung mit DOProxy zu seiner Konfiguration hinzugefügt wurde.

Wenn Sie in der DigitalOcean-Systemsteuerung nachsehen, werden Sie feststellen, dass diese neuen Droplets dort aufgelistet werden (zusammen mit dem Rest Ihrer Droplets):

Droplets in Control Panel

Schauen wir uns die erstellten Droplets genauer an, indem wir uns das Inventar von DOProxy ansehen.

Inventar drucken

DOProxy bietet einenprint-Befehl, mit dem alle Tröpfchen ausgedruckt werden, die Teil seines Inventars sind:

ruby doproxy.rb print

Sie sollten eine Ausgabe sehen, die ungefähr so ​​aussieht:

Output0) auto-nginx-0  (pvt ip: 192.0.2.175, status: active, id: 4202645)
1) auto-nginx-1  (pvt ip: 192.0.2.176, status: active, id: 4205587)
2) auto-nginx-2  (pvt ip: 192.0.2.172, status: active, id: 4205675)

In der Beispielausgabe werden Informationen zu den drei von uns erstellten Droplets angezeigt, einschließlich Hostnamen, Status und Droplet-IDs. Die Hostnamen und IDs sollten mit denen übereinstimmen, die Sie in Ihrem Webbrowser beim Zugriff auf den HAProxy-Lastenausgleich (über die öffentliche IP-Adresse von DOProxy) gesehen haben.

Wie Sie vielleicht bemerkt haben, druckte DOProxy nur Informationen zu den von ihm erstellten Droplets. Dies liegt daran, dass ein Inventar der erstellten Tröpfchen geführt wird.

Überprüfen Sie jetzt den Inhalt derinventory-Datei:

cat inventory

Sie sollten die ID jedes Tropfens sehen, eine pro Zeile. Jedes Mal, wenn ein Droplet erstellt wird, wird seine ID in dieser Inventardatei gespeichert.

Wie Sie vielleicht vermutet haben, durchläuft der Befehlprintvon DOProxy die Droplet-IDs in der Inventardatei und führt einen API-Aufruf aus, um Informationen zu jedem dieser IDs abzurufen.

Es sollte beachtet werden, dass das Speichern Ihres Server-Inventars in einer einzelnen Datei nicht die beste Lösung ist - es kann leicht beschädigt oder gelöscht werden -, aber es demonstriert eine einfache Implementierung, die funktioniert. Ein verteilter Schlüsselwertspeicher wieetcd wäre eine bessere Lösung. Sie möchten auch mehr als nur die Droplet-ID im Inventar speichern (damit Sie nicht jedes Mal API-Aufrufe vornehmen müssen, wenn Sie bestimmte Droplet-Informationen anzeigen möchten).

Verkleinern (Löschen)

DOProxy verfügt außerdem über den Befehldelete, mit dem Sie Tröpfchen in Ihrem Inventar löschen können. Für den Befehldelete müssen Sie die Zeilennummer des zu löschenden Droplets angeben (wie im Befehlprint angezeigt).

Bevor Sie diesen Befehl ausführen, möchten Sie wahrscheinlich Ihr Inventar drucken:

ruby doproxy.rb print

Wenn Sie beispielsweise das dritte Tröpfchen löschen möchten, geben Sie2 als Zeilennummer an:

ruby doprorxy.rb delete 2

Nach einem Moment wird die Bestätigungsmeldung angezeigt:

OutputSuccess: 4205675 deleted and removed from backend.

Der Befehldelete löscht das Droplet über die API, entfernt es aus der HAProxy-Konfiguration und löscht es aus dem Inventar. Sie können jederzeit überprüfen, ob das Droplet mit dem DOProxy-Druckbefehl oder über das DigitalOcean-Bedienfeld gelöscht wurde. Sie werden auch feststellen, dass es nicht mehr Teil des Load Balancers ist.

HAProxy-Konfiguration

Das letzte Stück DOProxy, das wir noch nicht besprochen haben, ist die Konfiguration von HAProxy.

Wenn Sie den DOProxy-Befehlcreate oderdelete ausführen, werden die Informationen für jedes Droplet im Inventar abgerufen und einige der Informationen zum Ändern einer HAProxy-Konfigurationsdatei verwendet. Insbesondere werden die Droplet-ID und die private IP-Adresse verwendet, um jedes Droplet als Backend-Server hinzuzufügen.

Sehen Sie sich die letzten Zeilen der generiertenhaproxy.cfg-Datei folgendermaßen an:

tail haproxy.cfg

Sie sollten so etwas sehen:

Schwanz von haproxy.cfg

    frontend www-http
       bind 203.0.113.43:80
       reqadd X-Forwarded-Proto:\ http
       default_backend www-backend

    backend www-backend

       server www-4202645 192.0.2.175:80 check # id:4202645, hostname:auto-nginx-0
       server www-4205587 192.0.2.176:80 check # id:4205587, hostname:auto-nginx-1

Der Abschnittfrontend sollte die öffentliche IP-Adresse Ihres DOProxy-Servers enthalten, und der Abschnittbackendollte Zeilen enthalten, die sich auf die einzelnen erstellten Droplets beziehen.

[.note] #Note: An dieser Stelle möchten Sie möglicherweise den Rest der mit DOProxy erstellten Droplets löschen (ruby doproxy.rb delete 0, bis alle Server verschwunden sind).
#

Nachdem Sie die Skalierung von DOProxy in Aktion gesehen haben, schauen wir uns den Code genauer an.

DOProxy Code

In diesem Abschnitt werden wir uns die relevanten Dateien und Codezeilen ansehen, mit denen DOProxy funktioniert. Wenn Sie sehen, wie DOProxy implementiert wurde, erhalten Sie einige Ideen, wie Sie die API zum Verwalten und Automatisieren Ihrer eigenen Serverinfrastruktur verwenden können.

Da Sie das Repository auf Ihren Server geklont haben, können Sie die Dateien dort oder die Dateien im DOProxy-Repository(https://github.com/scanevari/doproxy) anzeigen.

Wichtige Dateien:

  • doproxy.rb: DOProxy Ruby-Skript. Stellt die Befehlszeilenschnittstelle und die Logik hinter DOProxy bereit

  • doproxy.yml: DOProxy-Konfigurationsdatei. Enthält das API-Token und gibt Droplet-Erstellungsoptionen an

  • haproxy.cfg.erb: HAProxy-Konfigurationsvorlage. Wird verwendet, um eine Load Balancer-Konfiguration mit den richtigen Backend-Serverinformationen zu generieren

  • inventory: Droplet-Inventardatei. Speichert IDs der erstellten Droplets

  • user-data.yml: Benutzerdatendatei. Eine Cloud-Konfigurationsdatei, die beim Erstellen auf einem neuen Droplet ausgeführt wird

Lassen Sie uns zuerst in die Konfigurationsdateien eintauchen.

doproxy.yml

Dies sind die wichtigen Zeilen indoproxy.yml:

doproxy.yml

token: YOUR_DO_API_TOKEN
ssh_key_ids:
  - YOUR_SSH_KEY_FINGERPRINT
...
droplet_options:
  hostname_prefix: auto-nginx
  region: nyc3
  size: 1gb
  image: ubuntu-16-04-x64

Die Eigenschafttoken muss das API-Tokenread and writeenthalten.

Die anderen Zeilen geben die Optionen an, die verwendet werden, wenn DOProxy ein neues Droplet erstellt. Zum Beispiel die Installation des angegebenen SSH-Schlüssels (nach ID oder Fingerabdruck) und das Präfixieren der Hostnamen mit "auto-nginx".

Weitere Informationen zu gültigen Droplet-Optionen finden Sie inDigitalOcean API documentation.

user-data.yml

Dies ist die Datei, die von cloud-init ausgeführt wird, wenn ein neues Droplet erstellt wird. Dies bedeutet, dass Sie eine Cloud-Konfigurationsdatei oder ein Skript bereitstellen können, um Ihre Anwendungssoftware auf jedem neuen Droplet zu installieren.

Die Beispiel-Benutzerdatendatei enthält ein einfaches Bash-Skript, das Nginx auf einem Ubuntu-Server installiert und dessen Standardkonfigurationsdatei durch den Hostnamen, die ID und die öffentliche IP-Adresse des Droplets ersetzt:

user-data.yml

#!/bin/bash

apt-get -y update
apt-get -y install nginx
export DROPLET_ID=$(curl http://169.254.169.254/metadata/v1/id)
export HOSTNAME=$(curl -s http://169.254.169.254/metadata/v1/hostname)
export PUBLIC_IPV4=$(curl -s http://169.254.169.254/metadata/v1/interfaces/public/0/ipv4/address)
echo Droplet: $HOSTNAME, ID: $DROPLET_ID, IP Address: $PUBLIC_IPV4 > /var/www/html/index.html

Diesecurl-Befehle rufen die Informationen über das Droplet (Hostname, ID und IP-Adresse) mithilfe des DigitalOcean-Metadatendienstes ab.

In einer Produktionsimplementierung würde diese Datei die Befehle enthalten, um beispielsweise Ihre Anwendung zu installieren und zu konfigurieren. Auf diese Weise können Sie auch die Integration Ihrer Droplets in Ihre gesamte Infrastruktur automatisieren, indem Sie beispielsweise SSH-Schlüssel automatisch installieren und eine Verbindung zu Ihren Konfigurationsverwaltungs- oder Überwachungstools herstellen.

Weitere Informationen zu Benutzerdaten, Cloud-Konfiguration und Metadaten finden Sie unter den folgenden Links:

haproxy.cfg.erb

Die HAProxy-Konfigurationsvorlage enthält den größten Teil der Load-Balancer-Konfiguration mit Ruby-Code, der durch Back-End-Droplet-Informationen ersetzt wird.

Wir schauen uns nur den Ruby-Abschnitt an, der die Backend-Konfiguration generiert:

haproxy.cfg.erb

backend www-backend
   <% @Droplets.each_with_index do |droplet, index| %>
   server www-<%= droplet.id %> <%= droplet.private_ip %>:80 check # id:<%= droplet.id %>, hostname:<%= droplet.name -%>
   <% end %>

Dieser Code durchläuft jedes der Droplets im Inventar und fügt für jedes einen neuen HAProxy-Backend-Eintrag hinzu (basierend auf der privaten IP-Adresse).

Zum Beispiel wird eine Linie wie diese für jedes Droplet erzeugt:

haproxy.cfg

server www-4202645 192.0.2.175:80 check # id:4202645, hostname:auto-nginx-0

Immer wenn ein Droplet erstellt oder gelöscht wird, generiert DOProxy eine neue HAProxy-Konfigurationsdatei, die die Änderungen enthält.

doproxy.rb

Dieses Ruby-Skript besteht hauptsächlich aus einer DOProxy-Klasse, die die Methoden zur Erstellung und Löschung von Droplets, zur Bestandsverwaltung und zur Generierung der HAProxy-Konfiguration enthält.

Wenn Sie Ruby verstehen, überprüfen Sie die Datei auf GitHub:https://github.com/scanevari/doproxy/blob/master/doproxy.rb.

Wenn Sie Ruby nicht verstehen, finden Sie hier einige vereinfachtepseudocode, die die einzelnen Methoden erläutern. Es kann nützlich sein, dies mit dem tatsächlichen Ruby-Code zu vergleichen, um zu verstehen, was passiert.

def initialize

Wird jedes Mal ausgeführt, wenn DOProxy mit gültigen Argumenten ausgeführt wird:

  • Lesen Sie die Konfigurationsdatei vondoproxy.ymlund erhalten Sie die Optionen für API-Token und Droplet.

def get\_inventory

Ruft Informationen für jedes Droplet in der Inventardatei ab. Es muss ausgeführt werden, bevor eine der anderen Methoden ausgeführt wird.

  • Inventardatei lesen (die Droplet-IDs enthält)

  • Verwenden Sie für jede Droplet-ID die API, um Droplet-Informationen abzurufen

def print\_inventory

Diese Methode druckt Droplet-Informationen für jede der Droplet-IDs in der Inventardatei. Es wird mit dem Befehldoproxy.rb print aufgerufen.

  • Geben Sie für jedes Droplet im Inventar den Hostnamen, die private IP-Adresse, den Status und die ID ein

def create\_server

Wenn diese Methode über den Befehldoproxy.rb create aufgerufen wird, erstellt sie ein neues Droplet und fügt es der Inventardatei hinzu. Anschließend wirdreload_haproxy aufgerufen, um die HAProxy-Konfigurationsdatei neu zu generieren und den Load Balancer neu zu laden.

  • Lesen Sie die Benutzerdaten-Datei

  • Verwenden Sie die API, um ein Droplet basierend auf den angegebenen Benutzerdaten und Optionen zu erstellen

  • Warten Sie, bis der Droplet-Status "aktiv" wird. Verwenden Sie die API, um alle 15 Sekunden Droplet-Informationen abzurufen, bis sich der Status ändert

  • Wenn der Status "aktiv" ist, fügen Sie der Inventardatei die Droplet-ID hinzu

  • Rufen Siereload_haproxy auf, um die HAProxy-Konfigurationsdatei neu zu generieren und den Load Balancer neu zu laden

def delete\_server(line\_number)

Wenn der Befehldoproxy.rb delete verwendet wird, löscht diese Methode das angegebene Droplet und löscht seine ID aus der Inventardatei. Anschließend wirdreload_haproxy aufgerufen, um die HAProxy-Konfigurationsdatei neu zu generieren und den Load Balancer neu zu laden.

  • Die angegebene Zeile aus der Inventardatei entfernen (Droplet-ID löschen)

  • Verwenden Sie die API, um Droplet anhand seiner ID zu löschen

  • Rufen Siereload_haproxy auf, um die HAProxy-Konfigurationsdatei neu zu generieren und den Load Balancer neu zu laden

def generate\_haproxy\_cfg

Dies ist eine unterstützende Methode, mit der neue HAProxy-Konfigurationsdateien basierend auf den Droplets im Inventar erstellt werden.

  • Öffnen Sie die HAProxy-Konfigurationsvorlage (haproxy.cfg.erb).

  • Fügen Sie für jedes Droplet im Inventar einen entsprechenden Backend-Servereintrag hinzu

  • Schreiben Sie die resultierendehaproxy.cfg-Datei auf die Festplatte

def reload\_haproxy

Dies ist eine weitere unterstützende Methode, mit der die HAProxy-Konfigurationsdatei an den richtigen Speicherort kopiert und HAProxy neu geladen wird. Dies hängt vongenerate_haproxy_cfg ab.

  • Kopieren Sie die HAProxy-Konfigurationsdateihaproxy.cfg an den Speicherort, an dem HAProxy beim erneuten Laden danach sucht

  • Laden Sie HAProxy neu

Das ist der wichtigste Code, mit dem DOProxy funktioniert. Das letzte, was wir diskutieren werden, ist DropletKit, der API-Wrapper, den wir in DOProxy verwendet haben.

DropletKit Gem

DOProxy verwendetDropletKit gem, den offiziellen Ruby-Wrapper der DigitalOcean-API v2, der das Aufrufen der DigitalOcean-API erleichtert. Mit DropletKit können wir ganz einfach Ruby-Programme schreiben, die folgende Aufgaben ausführen:

  • Neue Tröpfchen erstellen

  • Löschen Sie vorhandene Tröpfchen

  • Hier erhalten Sie Informationen zu vorhandenen Droplets wie Status, IP - Adresse, Droplet - ID, Region usw

Dieses Lernprogramm konzentrierte sich auf diese speziellen API-Endpunkte. Beachten Sie jedoch, dass es viele andere Endpunkte gibt, die die programmgesteuerte Verwaltung Ihrer DigitalOcean-Serverinfrastruktur erleichtern können.

Fazit

Nachdem Sie nun gesehen haben, wie Sie mithilfe eines einfachen Skripts mithilfe der DigitalOcean-API, der Cloud-Konfiguration und der Metadaten eine Serverumgebung skalieren können, können Sie all diese Konzepte anwenden, um Ihr eigenes Server-Setup zu skalieren. Obwohl DOProxy nicht für den produktiven Einsatz vorgesehen ist, sollten Sie eine Reihe von Ideen für die Implementierung Ihrer eigenen Skalierungslösung erhalten.

Denken Sie daran, dass das hier mit DOProxy beschriebene Skalierungssetup informativ ist, aber durch die Verwendung in Verbindung mit unserenmonitoring system erheblich verbessert werden kann. Auf diese Weise können Sie die Ebene Ihres Anwendungsservers abhängig von bestimmten Bedingungen, z. B. der Auslastung der Serverressourcen, automatisch nach oben und unten skalieren.