Node.js Bookshelf in Kubernetes Engine ausführen

In dieser Anleitung erfahren Sie, wie Sie die Node.js Bookshelf App in Google Kubernetes Engine (GKE) ausführen. Befolgen Sie diese Anleitung, um eine vorhandene Node.js-Webanwendung in einen Container zu verlagern und in GKE auszuführen. Es wird empfohlen, die Dokumentation der Bookshelf App als Teil der Anleitung für die App Engine-Standardumgebung durchzugehen.

Ziele

  • GKE-Cluster installieren
  • Node.js-Anwendung in Container verpacken
  • Repliziertes Front-End für die Bookshelf App erstellen
  • Repliziertes Back-End für die Bookshelf App erstellen
  • Dienst mit Load-Balancing zum Weiterleiten von HTTP-Traffic an das Bookshelf-Front-End erstellen

Kosten

In dieser Anleitung werden kostenpflichtige Komponenten der Google Cloud Platform (GCP) verwendet, darunter:

  • GKE
  • Compute Engine
  • Cloud Storage
  • Cloud Datastore
  • Cloud Pub/Sub

Sie können mithilfe des Preisrechners eine Kostenkalkulation für Ihre voraussichtliche Nutzung erstellen. Neuen Nutzern der GCP steht unter Umständen eine kostenlose Testversion zur Verfügung.

Vorbereitung

  1. Melden Sie sich in Ihrem Google-Konto an.

    Wenn Sie noch kein Konto haben, registrieren Sie sich hier für ein neues Konto.

  2. Wählen Sie ein Google Cloud Platform-Projekt aus oder erstellen Sie eines.

    Zur Seite "Ressourcen verwalten"

  3. Prüfen Sie, ob die Abrechnung für Ihr Google Cloud Platform-Projekt aktiviert ist.

    Informationen zum Aktivieren der Abrechnung

  4. Aktivieren Sie die Cloud Datastore, Kubernetes Engine, Cloud Storage, Cloud Pub/Sub, and Google+ erforderlichen APIs.

    Aktivieren Sie die APIs.

  5. Installieren und initialisieren Sie das Cloud SDK.
  6. Installieren Sie Docker. Docker dient dazu, lokal Container-Images zu erstellen.
  7. Installieren Sie kubectl.
    gcloud components install kubectl

GKE-Cluster erstellen

Ein GKE-Cluster enthält eine Reihe verwalteter virtueller Compute Engine-Maschinen, die als einzelner GKE-Cluster ausgeführt werden. Für diese Anleitung ist ein Cluster mit mindestens zwei Knoten erforderlich, wobei diese Knoten Zugriff auf alle Google-APIs benötigen.

  1. Erstellen Sie den Cluster. Ersetzen Sie [YOUR_GCP_ZONE] durch die GCP-Zone, in der Sie Ihren Cluster hosten möchten.

    gcloud container clusters create bookshelf \
        --scopes "cloud-platform" \
        --num-nodes 2 \
        --enable-basic-auth \
        --issue-client-certificate \
        --enable-ip-alias \
        --zone [YOUR_GCP_ZONE]
    
  2. Überprüfen Sie, ob Sie auf den Cluster zugreifen können: Wenn Sie diesen Befehl ausführen, werden die Knoten in Ihrem Containercluster aufgelistet und es wird angezeigt, dass Ihr Containercluster läuft und Sie darauf Zugriff haben.

    kubectl get nodes
    

Mit dem Befehl kubectl erstellen Sie Ressourcen in einem GKE-Cluster. Weitere Informationen zu kubectl finden Sie unter GKE-Clustervorgänge. Im Allgemeinen verwenden Sie gcloud, um Ressourcen in einem GCP-Projekt zu verwalten, und kubectl, um Ressourcen in einem Kubernetes Engine-Cluster zu verwalten. Ein einzelnes Projekt kann mehrere Cluster enthalten, sodass auch Cluster mit verschiedenen Maschinentypen vorhanden sein können, um unterschiedlichen Anforderungen gerecht zu werden.

Wenn Sie einen Cluster mit gcloud erstellen, wird die Authentifizierung für kubectl automatisch eingerichtet. Für Cluster, die mit der Google Cloud Platform Console erstellt wurden, kann die Authentifizierung mit dem Befehl gcloud container clusters get-credentials eingerichtet werden.

Beispiel-App klonen

Die Beispielanwendung steht unter GoogleCloudPlatform/nodejs-getting-started auf GitHub zur Verfügung.

  1. Klonen Sie das Repository.

    git clone https://github.com/GoogleCloudPlatform/nodejs-getting-started.git
    
  2. Navigieren Sie zum Beispielverzeichnis:

    cd nodejs-getting-started/optional-kubernetes-engine
    

Cloud Datastore initialisieren

Die Bookshelf App speichert Bücher mit Cloud Datastore. So initialisieren Sie Cloud Datastore zum ersten Mal in Ihrem Projekt:

  1. Rufen Sie in der GCP Console die Seite Cloud Datastore auf.

    Zu Cloud Datastore

  2. Wählen Sie eine Region für Ihren Datenspeicher aus und klicken Sie auf Weiter, wenn Sie die Seite Entität erstellen erreichen. Schließen Sie das Fenster. Mit der Bookshelf App können nun Entitäten im Datenspeicher erstellt werden.

Cloud Storage-Bucket erstellen

Die Bookshelf App speichert Bilddateien mit Cloud Storage.

Nachfolgend erfahren Sie, wie Sie einen Cloud Storage-Bucket erstellen. Buckets sind die grundlegenden Container, die Ihre Daten in Cloud Storage enthalten.

  1. Geben Sie in einem Terminalfenster folgenden Befehl ein:

    gsutil mb gs://[YOUR-BUCKET-NAME]

    Dabei gilt:

    • [YOUR-BUCKET-NAME] steht für den Namen des Cloud Storage-Buckets.
  2. Setzen Sie die standardmäßige Access Control List (ACL) des Buckets auf public-read, um hochgeladene Bilder in der Bookshelf App anzuzeigen.

    gsutil defacl set public-read gs://[YOUR-BUCKET-NAME]

    App konfigurieren

    Erstellen Sie im Beispielverzeichnis eine config.json-Datei mit folgendem Inhalt:

    {
      "GCLOUD_PROJECT": "[YOUR_PROJECT_ID]",
      "CLOUD_BUCKET": "[YOUR_CLOUD_BUCKET]",
      "DATA_BACKEND": "datastore"
    }
    

    Ersetzen Sie [YOUR_PROJECT_ID] durch die Projekt-ID und [YOUR_CLOUD_BUCKET] durch den Namen des Cloud Storage-Buckets.

    Anwendung containerisieren

    Die Beispielanwendung umfasst ein Dockerfile, mit dem das Docker-Image der Anwendung erstellt wird. Mit diesem Docker-Image wird die Anwendung in GKE ausgeführt.

    # Dockerfile extending the generic Node image with application files for a
    # single application.
    FROM gcr.io/google_appengine/nodejs
    
    # Check to see if the the version included in the base runtime satisfies
    # '>=8.12.0', if not then do an npm install of the latest available
    # version that satisfies it.
    RUN /usr/local/bin/install_node '>=8.12.0'
    COPY . /app/
    
    # You have to specify "--unsafe-perm" with npm install
    # when running as root.  Failing to do this can cause
    # install to appear to succeed even if a preinstall
    # script fails, and may have other adverse consequences
    # as well.
    # This command will also cat the npm-debug.log file after the
    # build, if it exists.
    RUN npm install --unsafe-perm || \
      ((if [ -f npm-debug.log ]; then \
          cat npm-debug.log; \
        fi) && false)
    CMD npm start
    
    Die Beispielanwendung enthält auch die Datei .dockerignore. Darin sind die Dateipfade aufgeführt, die nicht im resultierenden Docker-Container enthalten sind. In der Regel gehören hierzu Build-Artefakte und lokale Abhängigkeitsinstallationen.

    # Copyright 2018 Google Inc. All Rights Reserved.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #    http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    node_modules
    .dockerignore
    Dockerfile
    npm-debug.log
    .git
    .hg
    .svn
    
  3. Erstellen Sie das Docker-Image der Anwendung.

    docker build -t gcr.io/[YOUR_PROJECT_ID]/bookshelf
    
  4. Übertragen Sie das Image im Push-Verfahren in die Google Container Registry, sodass der Cluster auf das Image zugreifen kann:

    gcloud docker -- push gcr.io/[YOUR_PROJECT_ID]/bookshelf
    

Bookshelf-Front-End erstellen

Die Bookshelf App umfasst einen Front-End-Server, der Webanfragen verarbeitet, und einen Back-End-Worker, der Bücher verarbeitet und zusätzliche Informationen hinzufügt.

Die Clusterressourcen für das Ausführen des Front-Ends sind in bookshelf-frontend-datastore.yaml definiert. Diese Ressourcen werden als Kubernetes-Bereitstellung beschrieben. Mit Bereitstellungen kann leicht ein Replikatset mit den zugehörigen Pods erstellt und aktualisiert werden.

# Copyright 2018 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License

# This file configures the bookshelf application frontend. The frontend serves
# public web traffic.

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: bookshelf-frontend
  labels:
    app: bookshelf
# The bookshelf frontend replica set ensures that at least 3
# instances of the bookshelf app are running on the cluster.
# For more info about Pods see:
#   https://cloud.google.com/container-engine/docs/pods/
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: bookshelf
        tier: frontend
    spec:
      containers:
      - name: bookshelf-app
        # Replace [GCLOUD_PROJECT] with your project ID or use `make template`.
        image: gcr.io/[GCLOUD_PROJECT]/bookshelf
        # This setting makes nodes pull the docker image every time before
        # starting the pod. This is useful when debugging, but should be turned
        # off in production.
        imagePullPolicy: Always
        # The bookshelf process listens on port 8080 for web traffic by default.
        ports:
        - name: http-server
          containerPort: 8080
        env:
          - name: PROJECT_ID
            value: [GCLOUD_PROJECT]
  1. Ersetzen Sie [GCLOUD_PROJECT] in bookshelf-frontend-datastore.yaml durch Ihre Projekt-ID.

  2. Erstellen Sie die Ressourcen im Cluster.

    kubectl create -f bookshelf-frontend-datastore.yaml
    
  3. Verfolgen Sie den Status des Deployments:

    kubectl get deployments
    

    Das Deployment ist abgeschlossen, sobald darin die gewünschte Zahl von Pods verfügbar ist. Wenn beim Deployment Probleme auftreten, können Sie es löschen und von vorn beginnen:

    kubectl delete deployments bookshelf-frontend
    
  4. Sobald das Deployment abgeschlossen ist, können Sie die erstellten Pods sehen:

    kubectl get pods
    

Bookshelf-Back-End bereitstellen

Das Bookshelf-Back-End wird auf dieselbe Weise wie das Front-End erstellt.

# Copyright 2018 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License

# This file configures the bookshelf task worker. The worker is responsible
# for processing book requests and updating book information.

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: bookshelf-worker
  labels:
    app: bookshelf
# The bookshelf worker replica set ensures that at least 2 instances of the
# bookshelf worker pod are running on the cluster.
# For more info about Pods see:
#   https://cloud.google.com/container-engine/docs/pods/
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: bookshelf
        tier: worker
    spec:
      containers:
      - name: bookshelf-app
        # Replace [GCLOUD_PROJECT] with your project ID or use `make template`.
        image: gcr.io/[GCLOUD_PROJECT]/bookshelf
        # This setting makes nodes pull the docker image every time before
        # starting the pod. This is useful when debugging, but should be turned
        # off in production.
        imagePullPolicy: Always
        # The SCRIPT environment variable is used by `npm start` to control
        # which script is executed. This tells npm start to use `worker.js`
        # instead of the default `app.js`.
        env:
        - name: SCRIPT
          value: worker.js
        - name: PROJECT_ID
          value: [GCLOUD_PROJECT]
  1. Ersetzen Sie [GCLOUD_PROJECT] in bookshelf-worker-datastore.yaml durch Ihre Projekt-ID.

  2. Erstellen Sie die Ressourcen im Cluster.

    kubectl create -f bookshelf-worker-datastore.yaml
    
  3. Vergewissern Sie sich, dass die Pods ausgeführt werden.

    kubectl get pods
    

Bookshelf-Dienst erstellen

Kubernetes-Dienste stellen einen zentralen Zugriffspunkt für eine Reihe von Pods bereit. Es ist durchaus möglich, auf einen einzelnen Pod zuzugreifen. Pods sind jedoch sitzungsspezifisch und es ist normalerweise praktischer, eine Reihe von Pods über einen einzigen Endpunkt anzusprechen. In der Bookshelf App ermöglicht der Bookshelf-Dienst den Zugriff auf die Bookshelf-Front-End-Pods über eine einzige IP-Adresse. Dieser Dienst ist in bookshelf-service.yaml definiert.

# Copyright 2018 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License

# The bookshelf service provides a load-balancing proxy over the bookshelf
# frontend pods. By specifying the type as a 'LoadBalancer', Kubernetes Engine
# will create an external HTTP load balancer.
# For more information about Services see:
#   https://cloud.google.com/kubernetes-engine/docs/services/
# For more information about external HTTP load balancing see:
#   https://cloud.google.com/kubernetes-engine/docs/load-balancer
apiVersion: v1
kind: Service
metadata:
  name: bookshelf-frontend
  labels:
    app: bookshelf
    tier: frontend
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: http-server
  selector:
    app: bookshelf
    tier: frontend

Die Pods und der Dienst, der die Pods verwendet, sind separate Ressourcen. Kubernetes verwendet Labels, um die Pods auszuwählen, die ein Dienst verwendet. Bei Labels kann es sein, dass ein Dienst Pods von verschiedenen Replikatsets ansteuert. Es ist aber ebenfalls möglich, dass mehrere Dienste auf einen einzigen Pod verweisen.

  1. Erstellen Sie den Bookshelf-Dienst:

    kubectl create -f bookshelf-service.yaml
    
  2. Rufen Sie die externe IP-Adresse des Dienstes ab:

    kubectl describe service bookshelf
    

    Es kann bis zu 60 Sekunden dauern, bis die IP-Adresse zugeordnet wird. Die externe IP-Adresse wird unter LoadBalancer Ingress aufgelistet.

Bookshelf App aufrufen

Sie haben jetzt alle Ressourcen erstellt, die zum Ausführen der Bookshelf App auf GKE erforderlich sind. Verwenden Sie die externe IP-Adresse aus dem vorherigen Schritt, um die Anwendung im Webbrowser zu laden und Bücher zu erstellen. Wenn Sie den Worker erstellt haben, werden die Bücher automatisch mit Informationen aus der Google Books API aktualisiert.

Bereinigen

So vermeiden Sie, dass Ihr Google Cloud Platform-Konto für die in dieser Anleitung genutzten Ressourcen unnötig mit Gebühren belastet wird:

Projekt löschen

Sie vermeiden weitere Kosten am einfachsten, indem Sie das für die Anleitung erstellte Projekt löschen.

So löschen Sie das Projekt:

  1. Rufen Sie in der GCP Console die Seite Projekte auf.

    Zur Seite Projekte

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie auf Löschen delete.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Beenden, um das Projekt zu löschen.

Cluster löschen

Durch das Löschen des Clusters werden alle GKE- und Compute Engine-Ressourcen entfernt. Sie müssen jedoch alle Ressourcen in Cloud Storage, Cloud Datastore und Cloud Pub/Sub manuell entfernen.

Löschen Sie den Cluster mit dem folgenden Befehl. Ersetzen Sie [YOUR_GCP_ZONE] durch die Zone, die Sie beim Erstellen des Clusters verwendet haben.

gcloud container clusters delete bookshelf --zone [YOUR_GCP_ZONE]

Weitere Informationen

Hat Ihnen diese Seite weitergeholfen? Teilen Sie uns Ihr Feedback mit:

Feedback geben zu...