Dieses erweiterte Beispiel zeigt, wie eine Logbook-Anwendung erstellt wird, die node.js für das Frontend und MySQL als Backend verwendet. Die Vorlage erstellt und verbindet auch einen HTTP-Load-Balancer, der Lasten zwischen zwei Zonen ausgleicht, sowie ein Autoscaling, das die Anwendung automatisch skaliert.
In diesem Beispiel wird angenommen, dass Sie mit Docker-Containern und Compute Engine-Ressourcen, insbesondere HTTP-Load-Balancing, Autoscaling, verwalteten Instanzgruppen und Instanzvorlagen, vertraut sind.
Weitere einführende Informationen finden Sie im Startleitfaden oder in der detaillierten Anleitung.
Hinweis
- Wenn Sie die Befehlszeilenbeispiele in dieser Anleitung verwenden möchten, installieren Sie das gcloud-Befehlszeilentool.
- Wenn Sie die API-Beispiele in dieser Anleitung verwenden möchten, richten Sie den API-Zugriff ein.
- Machen Sie sich mit HTTP-Load-Balancing in Compute Engine vertraut.
- Machen Sie sich mit Docker-Containern vertraut.
Vorlagen erstellen
Dieses Beispiel startet ein Deployment mit mehreren Typen von Ressourcen. Zunächst erstellen Sie wiederverwendbare Vorlagen, durch die diese Ressourcen separat definiert werden. Später nutzen Sie diese Vorlagen in Ihrer endgültigen Konfiguration.
Am Ende dieses Beispiels haben Sie eine Bereitstellung, die diese Ressourcen enthält:
- Eine einzige Compute Engine-Instanz für die Back-End-MySQL-VM.
- Eine Instanzvorlage, die ein Docker-Image verwendet.
- Zwei automatisch skalierte, verwaltete Instanzgruppen in zwei verschiedenen Zonen, die den Frontend-Node.js-Dienst ausführen.
- Weitere zwei automatisch skalierte, verwaltete Instanzgruppen, die statische Daten liefern.
- Eine Systemdiagnose und einen HTTP-Load-Balancer für die Verteilung von Traffic über die jeweiligen verwalteten Instanzgruppen.
Back-End-Vorlagen erstellen
Das Back-End dieser Anwendung ist eine einzelne Compute Engine-Instanz, auf der ein MySQL Docker-Container ausgeführt wird. Erstellen Sie eine Vorlage, in der eine Compute-Engine Instanz definiert ist, die ein containeroptimiertes Image verwendet. Benennen Sie die Datei container_vm.[py|jinja]
:
Jinja
Python
Die Vorlage definiert eine Reihe von Variablen wie containerImage
und manifest
, die ausgefüllt werden, wenn Sie die Konfiguration erstellen. Diese Vorlage allein erstellt nur eine einzelne VM-Instanz.
Wenn Sie Container-Images auf Compute Engine-Instanzen verwenden, müssen Sie auch eine Manifestdatei angeben (anders als ein Deployment Manager-Manifest), um für Compute Engine zu beschreiben, welches Container-Image verwendet werden soll. Erstellen Sie eine Hilfsmethode mit dem Namen container_helper.[py|jinja]
, um das Container-Manifest dynamisch zu definieren:
Jinja
Python
Front-End-Vorlagen erstellen
Das Front-End dieser Anwendung führt Node.js aus und erlaubt Nutzern, Nachrichten auf der Webseite zu posten. Es wird zwei verwaltete Instanzgruppen geben, die jeweils zwei Instanzen enthalten: eine primäre verwaltete Instanzgruppe und eine sekundäre verwaltete Instanzgruppe für das Load-Balancing.
Folgen Sie der Anleitung unten, um Front-End-Vorlagen zu erstellen.
Erstellen Sie eine Instanzvorlage.
Sie benötigen eine Instanzvorlagen-Ressource, um eine verwaltete Instanzgruppe zu erstellen, d. h. eine Gruppe identischer VM-Instanzen, die zentral verwaltet werden. In diesem Beispiel wird eine verwaltete Instanzgruppe für die node.js-Front-End-Instanzen erstellt, aber erstellen Sie zuerst eine Instanzvorlage.
Definieren Sie eine Datei mit dem Namen
container_instance_template.[py|jinja]
:Jinja
Python
Automatisch skalierte und verwaltete Instanzgruppe erstellen
Mit dieser Instanzvorlage können Sie jetzt eine Vorlage definieren, die die Instanzvorlage verwendet, um eine automatisch skalierte verwaltete Instanzgruppe zu erstellen. Erstellen Sie eine neue Datei mit dem Namen
autoscaled_group.[py|jinja]
und folgendem Inhalt:Jinja
Python
Erstellen Sie die entsprechende Schemadatei:
Jinja
Python
Erstellen Sie Ressourcen, die diese Vorlagen verwenden.
Bis hier haben Sie Basisvorlagen definiert, die die Attribute Ihrer Ressourcen bestimmen. Definieren Sie mithilfe dieser Vorlagen die Einrichtung Ihres Front-Ends. Erstellen Sie eine neue Datei mit dem Namen
service.[py|jinja]
und folgendem Inhalt:Jinja
Python
Erstellen Sie die entsprechende Schemadatei:
Jinja
Python
Sehen wir uns an, was diese Vorlage erstellt:
Zwei verwaltete Instanzgruppen, eine primäre und eine sekundäre.
Die Vorlage verwendet die Vorlage
autoscaled_group.[py|jinja]
, um eine primäre und sekundäre verwaltete Instanzgruppe mit Autoscaling zu erstellen.Als Nächstes erstellt die Vorlage einen Back-End-Dienst und eine Systemdiagnose. Für das HTTP-Load Balancing ist ein Back-End-Dienst erforderlich. Er definiert die Bereitstellungskapazität der Instanzgruppen in diesem Back-End-Dienst. In diesem Fall sind die primären und sekundären verwalteten Instanzgruppen Teil des Back-Ends und die Standardattribute des Back-End-Dienstes finden Anwendung.
Standardmäßig führt ein Back-End-Dienst das Load Balancing basierend auf der CPU-Auslastung der verbundenen Instanzgruppen durch, aber Sie können das Load Balancing auch basierend auf Anfragen pro Sekunde (RPS) durchführen.
Hinweis: Wenn ein Back-End-Dienst erstellt wird, ist immer eine Systemdiagnose notwendig.
Einheitliche Vorlage erstellen
Erstellen Sie schließlich eine gemeinsame Vorlage, die die Backend- und Frontend-Vorlage miteinander kombiniert. Erstellen Sie eine neue Datei mit dem Namen application.[py|jinja]
:
Jinja
Python
Erstellen Sie eine zugehörige Schemadatei:
Jinja
Python
Die Vorlage definiert zusätzlich zum Frontend und Backend noch weitere Ressourcen:
Einen statischen Dienst mit primären und sekundären verwalteten Instanzgruppen. Dieser statische Dienst stellt eine Webseite bereit, die sich unter dem Pfad
/static
in Ihrer Anwendung befindet.Eine URL-Zuordnungsressource. Das HTTP-Load-Balancing benötigt eine URL-Zuordnung, um die verschiedenen URLs den richtigen Pfaden zuzuordnen. In diesem Fall ist der durch das Attribut
defaultService
angegebene Standardpfad der Back-End-Dienst, den Sie zuvor erstellt haben. Falls ein Nutzer/static
aufruft, ordnet die URL-Zuordnung diesen Pfad dem statischen Dienst, wie im AbschnittpathMatchers
definiert, zu.Eine globale Weiterleitungsregel und einen Ziel-HTTP-Proxy. Da das Load-Balancing für die Anwendung in zwei verschiedenen Zonen stattfindet, benötigen Sie eine globale Weiterleitungsregel für eine einzelne externe IP-Adresse. Zusätzlich benötigen Sie einen Ziel-HTTP-Proxy für die Einrichtung des HTTP-Load-Balancing.
Eine Firewallregel, die Traffic über Port 8080 erlaubt.
Konfiguration erstellen
Mit Ihren Vorlagen und den verknüpften Schemas können Sie eine Konfiguration erstellen, die diese Ressourcen bereitstellt. Erstellen Sie eine Konfigurationsdatei mit dem Namen application.yaml
und folgendem Inhalt und ersetzen Sie ZONE_TO_RUN
und SECONDARY_ZONE_TO_RUN
durch die primäre und sekundäre Zone Ihrer Wahl.
Jinja
Python
Konfiguration bereitstellen
Jetzt können Sie Ihre Ressourcen bereitstellen. Führen Sie über die Google Cloud CLI den folgenden Befehl aus. Optional können Sie dabei advanced-configuration-l7
durch einen Deployment-Namen Ihrer Wahl ersetzen. Beachten Sie, dass Ihr Bereitstellungsname automatisch verwendet wird, um die Ressourcen zu benennen.
In diesem Beispiel lautet der Deployment-Name advanced-configuration-l7
. Denken Sie daran, diesen Deployment-Namen in allen folgenden Beispielen zu verwenden, falls Sie sich dazu entscheiden, den Namen des Deployments zu ändern.
gcloud deployment-manager deployments create advanced-configuration-l7 --config application.yaml
Die Antwort sollte ähnlich aussehen, wie die folgenden Ressourcen:
Waiting for create operation-1469468950934-5387966d431f0-49b11bc4-1421b2f0...done. Create operation operation-1469468950934-5387966d431f0-49b11bc4-1421b2f0 completed successfully. NAME TYPE STATE ERRORS advanced-configuration-l7-application-fw compute.v1.firewall COMPLETED [] advanced-configuration-l7-application-l7lb compute.v1.globalForwardingRule COMPLETED [] advanced-configuration-l7-application-targetproxy compute.v1.targetHttpProxy COMPLETED [] advanced-configuration-l7-application-urlmap compute.v1.urlMap COMPLETED [] advanced-configuration-l7-backend compute.v1.instance COMPLETED [] advanced-configuration-l7-frontend-bes compute.v1.backendService COMPLETED [] advanced-configuration-l7-frontend-hc compute.v1.httpHealthCheck COMPLETED [] advanced-configuration-l7-frontend-it compute.v1.instanceTemplate COMPLETED [] advanced-configuration-l7-frontend-pri-as compute.v1.autoscaler COMPLETED [] advanced-configuration-l7-frontend-pri-igm compute.v1.instanceGroupManager COMPLETED [] advanced-configuration-l7-frontend-sec-as compute.v1.autoscaler COMPLETED [] advanced-configuration-l7-frontend-sec-igm compute.v1.instanceGroupManager COMPLETED [] advanced-configuration-l7-static-service-bes compute.v1.backendService COMPLETED [] advanced-configuration-l7-static-service-hc compute.v1.httpHealthCheck COMPLETED [] advanced-configuration-l7-static-service-it compute.v1.instanceTemplate COMPLETED [] advanced-configuration-l7-static-service-pri-as compute.v1.autoscaler COMPLETED [] advanced-configuration-l7-static-service-pri-igm compute.v1.instanceGroupManager COMPLETED [] advanced-configuration-l7-static-service-sec-as compute.v1.autoscaler COMPLETED [] advanced-configuration-l7-static-service-sec-igm compute.v1.instanceGroupManager COMPLETED []
Dienstlabels hinzufügen
Legen Sie als Nächstes die passenden Dienst-Labels für ihre verwalteten Instanzgruppen fest. Dienst-Labels sind Metadaten, die von den Load-Balancing-Diensten zur Gruppierung von Ressourcen verwendet werden.
Führen Sie die folgenden Befehle aus, wobei Sie für die primäre und sekundäre Zone die Zonen angeben, die Sie in der Konfigurationsdatei für Ihr Deployment ausgewählt haben, um Dienst-Labels hinzuzufügen:
gcloud compute instance-groups unmanaged set-named-ports advanced-configuration-l7-frontend-pri-igm \
--named-ports http:8080,httpstatic:8080 \
--zone [PRIMARY_ZONE]
gcloud compute instance-groups unmanaged set-named-ports advanced-configuration-l7-frontend-sec-igm \
--named-ports http:8080,httpstatic:8080 \
--zone [SECONDARY_ZONE]
Konfiguration testen
Rufen Sie zum Testen Ihrer Konfiguration die externe IP-Adresse ab, über die der Datenverkehr läuft, indem Sie die Weiterleitungsregel abfragen:
gcloud compute forwarding-rules list | grep advanced-configuration-l7-l7lb advanced-configuration-l7-l7lb 107.178.249.126 TCP advanced-configuration-l7-targetproxy
In diesem Fall lautet die externe IP 107.178.249.126
.
Besuchen Sie in einem Browser die externe IP-Adresse über Port 8080. Wenn beispielsweise Ihre externe IP 107.178.249.126
ist, lautet die URL:
http://107.178.249.126:8080
Es sollte eine leere Seite angezeigt werden. Posten Sie dann eine Nachricht auf der Seite. Wechseln Sie zur folgenden URL:
http://107.178.249.126:8080?msg=hello_world!
Es wird bestätigt, dass Ihre Nachricht hinzugefügt wurde. Navigieren Sie zurück zur Haupt-URL und die Seite sollte jetzt folgende Meldung enthalten:
hello_world!
Sie können auch die von Ihnen erstellte statische Seite besuchen oder eine Systemdiagnose Ihrer Anwendung durchführen, indem Sie die folgenden URLs aufrufen:
# Static web page
http://107.178.249.126:8080/static
# Health check
http://107.178.249.126:8080/_ah/health
Gratulation! Sie haben Ihre Konfiguration erfolgreich bereitgestellt.
Docker-Images erstellen (optional)
Docker ermöglicht die Automatisierung und Ausführung von Software in Containern. Container erlauben es Ihnen, verschiedene Dienste in Containern zu isolieren, die alle auf einer einzelnen Linux-Instanz ausgeführt werden können.
In diesem Beispiel werden einige vorhandene Docker-Images verwendet, aber Sie können auch eigene Versionen dieser Docker-Images erstellen. Anleitungen zum Erstellen der MySQL-Backend-Images und Node.js-Frontend-Images finden Sie im Abschnitt Ressourcenvorlagen erstellen.
So erstellen Sie das Docker-Image, das von der statischen Webseite verwendet wird:
Erstellen Sie eine neue VM-Instanz mit einem containeroptimierten Image:
gcloud compute instances create docker-playground \ --image-family container-vm \ --image-project google-containers \ --zone us-central1-a \ --machine-type f1-micro
Stellen Sie eine Verbindung zur Instanz her:
gcloud compute ssh --zone us-central1-a docker-playground
Erstellen Sie eine Datei mit dem Namen
Dockerfile
und folgendem Inhalt:FROM node:latest RUN mkdir /var/www/ ADD service.js /var/www/service.js WORKDIR /var/www/ RUN npm install mysql CMD ["node", "service.js"]
Erstellen Sie eine Datei mit dem Namen
service.js
und folgendem Inhalt:var http = require('http'); var url = require('url'); console.log('Started static node server') http.createServer(function (req, res) { reqUrl = url.parse(req.url, true); res.useChunkedEncodingByDefault = false; res.writeHead(200, {'Content-Type': 'text/html'}); if (reqUrl.pathname == '/_ah/health') { res.end('ok'); } else if (reqUrl.pathname == '/exit') { process.exit(-1) } else { res.end('static server'); } }).listen(8080, '0.0.0.0'); console.log('Static server running at http://127.0.0.1:8080/');
Erstellen Sie das Docker-Image und ersetzen Sie dabei
username
durch Ihren Docker Hub-Nutzernamen. Wenn Sie keinen Docker Hub-Nutzernamen haben, erstellen Sie einen, bevor Sie das Docker-Image erstellen.sudo docker build --no-cache -t username/nodejsservicestatic .
Verschieben Sie die Images in das Docker-Repository:
sudo docker push username/nodejsservicestatic
Jetzt haben Sie die Docker-Images, um Node.js und MySQL auszuführen. Diese Images können im Repository angezeigt werden. Suchen Sie dazu nach den Image-Namen. Wenn Sie die Images ausprobieren möchten, ersetzen Sie alle Instanzen von gcr.io/deployment-manager-examples/mysql
und gcr.io/deployment-manager-examples/nodejsservice
durch die entsprechenden Images.
Tipp
Wenn Sie dieses Beispiel abgeschlossen haben, können Sie:
- Auf diesem Beispiel aufbauen, indem Sie eine robustere Webseite erstellen oder dem Webserver weitere Dienste hinzufügen.
- Mehr über Konfigurationen und Deployments lesen.
- Eigene Konfigurationen erstellen.