Exécuter l'application Bookshelf pour Node.js sur Kubernetes Engine

Ce tutoriel vous explique comment exécuter l'application Bookshelf pour Node.js sur Google Kubernetes Engine (GKE). Suivez ce tutoriel pour intégrer une application Web Node.js existante à un conteneur et la déployer dans GKE. Il est recommandé de parcourir la documentation de l'application Bookshelf dans le cadre du tutoriel relatif à l'environnement standard App Engine.

Objectifs

  • Créer un cluster GKE
  • Intégrer une application Node.js à un conteneur
  • Créer une interface dupliquée pour l'application Bookshelf
  • Créer un backend répliqué pour l'application Bookshelf
  • Créer un service d'équilibrage de charge pour router le trafic HTTP vers l'interface Bookshelf

Coûts

Ce tutoriel utilise des composants facturables de Google Cloud Platform (GCP), y compris :

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

Utilisez le simulateur de coût pour générer une estimation des coûts en fonction de votre utilisation prévue. Les nouveaux utilisateurs de GCP peuvent bénéficier d'un essai gratuit.

Avant de commencer

  1. Connectez-vous à votre compte Google.

    Si vous n'en possédez pas déjà un, vous devez en créer un.

  2. Sélectionnez ou créez un projet Google Cloud Platform.

    Accéder à la page "Gérer les ressources"

  3. Assurez-vous que la facturation est activée pour votre projet Google Cloud Platform.

    Découvrir comment activer la facturation

  4. Activez Cloud Datastore, Kubernetes Engine, Cloud Storage, Cloud Pub/Sub, et Google+les API requises.

    Activer les API.

  5. Installez et initialisez le SDK Cloud.
  6. Installez la plate-forme Docker. Docker est utilisé pour construire des images de conteneurs en local.
  7. Installez kubectl.
    gcloud components install kubectl

Créer un cluster GKE

Un cluster GKE est un ensemble géré de machines virtuelles Compute Engine fonctionnant comme un cluster GKE unique. Ce tutoriel nécessite un cluster comportant au minimum deux nœuds, qui doivent pouvoir accéder à toutes les API Google.

  1. Créez le cluster. Remplacez [YOUR_GCP_ZONE] par la zone GCP dans laquelle vous souhaitez héberger votre cluster.

    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. Vérifiez que vous avez accès au cluster. La commande suivante répertorie les nœuds de votre cluster de conteneurs et indique que celui-ci est opérationnel et que vous y avez accès.

    kubectl get nodes
    

Vous devez utiliser la commande kubectl pour créer des ressources dans un cluster GKE. Pour en savoir plus sur kubectl, consultez la page relative aux opérations du cluster GKE. En principe, vous utilisez la commande gcloud pour gérer les ressources de votre projet GCP et kubectl pour gérer celles de votre cluster GKE. Un projet peut comprendre plusieurs clusters, ce qui permet de disposer de clusters composés de différents types de machines, pour répondre plus facilement à vos différents besoins.

Lorsque vous créez un cluster avec gcloud, l'authentification est configurée automatiquement pour kubectl. Pour les clusters créés à l'aide de la console Google Cloud Platform, vous pouvez configurer l'authentification avec la commande gcloud container clusters get-credentials.

Cloner l'exemple d'application

L'exemple d'application est disponible sur GitHub en accédant à l'adresse GoogleCloudPlatform/nodejs-getting-started.

  1. Clonez le dépôt.

    git clone https://github.com/GoogleCloudPlatform/nodejs-getting-started.git
    
  2. Accédez à l'exemple de répertoire.

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

Initialiser Cloud Datastore

L'application Bookshelf stocke les livres à l'aide de Cloud Datastore. Pour réaliser la première initialisation de Cloud Datastore dans votre projet, procédez comme suit :

  1. Dans la console GCP, ouvrez Cloud Datastore.

    Accéder à Cloud Datastore

  2. Sélectionnez une région pour votre datastore, puis cliquez sur Continuer jusqu'à atteindre la page Créer une entité. Fermez la fenêtre. L'application Bookshelf est prête à créer des entités dans Cloud Datastore.

Créer un bucket Cloud Storage

L'application Bookshelf utilise Cloud Storage pour stocker les fichiers images.

Les instructions suivantes montrent comment créer un bucket Cloud Storage. Les buckets sont les conteneurs de base dans lesquels sont stockées vos données dans Cloud Storage.

  1. Dans une fenêtre de terminal, saisissez la commande suivante :

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

    Où :

    • [YOUR-BUCKET-NAME] représente le nom du bucket Cloud Storage.
  2. Pour afficher les images importées dans l'application Bookshelf, définissez la liste de contrôle d'accès (LCA) par défaut du bucket sur public-read.

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

    Configurer l'application

    Dans l'exemple de répertoire, créez un fichier config.json avec ce contenu :

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

    Remplacez [YOUR_PROJECT_ID] par l'ID de votre projet et remplacez [YOUR_CLOUD_BUCKET] par le nom de votre bucket Cloud Storage.

    Intégrer l'application à un conteneur

    L'exemple d'application inclut un Dockerfile utilisé pour créer l'image Docker de l'application. Cette image Docker exécute l'application sur GKE.

    # 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
    
    L'exemple d'application inclut également un fichier .dockerignore qui répertorie les chemins de fichiers qui ne sont pas inclus dans le conteneur Docker généré. Généralement, cela inclut les artefacts de build et les installations de dépendances locales.

    # 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. Créez l'image Docker de l'application.

    docker build -t gcr.io/[YOUR_PROJECT_ID]/bookshelf
    
  4. Transférez l'image vers Google Container Registry pour que votre cluster puisse accéder à l'image.

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

Déployer l'interface Bookshelf

L'application Bookshelf se compose d'une interface qui gère les requêtes Web, et d'un nœud de calcul backend qui traite les livres et ajoute des informations supplémentaires.

Les ressources du cluster nécessaires pour exécuter l'interface sont définies dans bookshelf-frontend-datastore.yaml. Ces ressources sont décrites comme un déploiement de Kubernetes. Les déploiements facilitent la création et la mise à jour d'un ensemble d'instances dupliquées et des pods associés.

# 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. Dans bookshelf-frontend-datastore.yaml, remplacez [GCLOUD_PROJECT] par votre ID de projet.

  2. Déployez les ressources sur le cluster.

    kubectl create -f bookshelf-frontend-datastore.yaml
    
  3. Suivez l'état du déploiement.

    kubectl get deployments
    

    Une fois que le nombre de pods souhaité est disponible, le déploiement est terminé. Si vous rencontrez des problèmes avec le déploiement, vous pouvez le supprimer et recommencer.

    kubectl delete deployments bookshelf-frontend
    
  4. Une fois le déploiement terminé, vous pouvez afficher les pods créés par le déploiement.

    kubectl get pods
    

Déployer le nœud de calcul backend Bookshelf

Le nœud de calcul de backend Bookshelf est déployé de la même manière que l'interface.

# 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. Dans bookshelf-worker-datastore.yaml, remplacez [GCLOUD_PROJECT] par votre ID de projet.

  2. Déployez les ressources sur le cluster.

    kubectl create -f bookshelf-worker-datastore.yaml
    
  3. Vérifiez que les pods sont en cours d'exécution.

    kubectl get pods
    

Créer le service Bookshelf

Les services Kubernetes fournissent un point d'accès unique à un ensemble de pods. Bien qu'il soit possible d'accéder à un seul pod, les pods sont éphémères et il est généralement plus pratique d'accéder à un ensemble de pods avec un seul point de terminaison. Dans l'application Bookshelf, le service Bookshelf vous permet d'accéder aux pods d'interface Bookshelf à partir d'une adresse IP unique. Ce service est défini dans bookshelf-service.yaml.

# 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

Notez que les pods et le service qui utilise les pods sont séparés. Kubernetes utilise des étiquettes pour sélectionner les pods auxquels accède un service. Avec les étiquettes, vous pouvez utiliser un service unique pour interagir avec les pods de différents ensembles d'instances dupliquées. Vous pouvez également faire pointer plusieurs services vers un pod unique.

  1. Créez le service Bookshelf.

    kubectl create -f bookshelf-service.yaml
    
  2. Obtenez l'adresse IP externe du service.

    kubectl describe service bookshelf
    

    Notez que l'attribution de l'adresse IP peut prendre jusqu'à 60 secondes. L'adresse IP externe est répertoriée sous LoadBalancer Ingress.

Accéder à l'application Bookshelf

Vous avez maintenant déployé toutes les ressources nécessaires à l'exécution de l'application Bookshelf sur GKE. Utilisez l'adresse IP externe de l'étape précédente pour charger l'application dans votre navigateur Web et créer des livres. Si vous avez déployé le nœud de calcul, les livres sont automatiquement mis à jour avec les informations de l'API Google Livres.

Nettoyer

Afin d'éviter que des frais ne soient facturés sur votre compte Google Cloud Platform pour les ressources utilisées dans ce tutoriel, procédez comme suit :

Supprimer le projet

Le moyen le plus simple d'empêcher la facturation est de supprimer le projet que vous avez créé pour ce tutoriel.

Pour supprimer le projet, procédez comme suit :

  1. Dans la console GCP, accédez à la page "Projets".

    Accéder à la page Projets

  2. Dans la liste des projets, sélectionnez celui que vous souhaitez supprimer, puis cliquez sur Supprimer.
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.

Supprimer le cluster

Le fait de supprimer le cluster supprime également toutes les ressources GKE et Compute Engine, mais vous devez supprimer manuellement toutes les ressources de Cloud Storage, Cloud Datastore et Cloud Pub/Sub.

Pour supprimer le cluster, saisissez la commande suivante. Remplacez [YOUR_GCP_ZONE] par la zone que vous avez définie lors de la création du cluster.

gcloud container clusters delete bookshelf --zone [YOUR_GCP_ZONE]

Étapes suivantes

  • Testez par vous-même d'autres fonctionnalités de Google Cloud Platform. Découvrez nos tutoriels.
  • Découvrez d'autres services GCP.
Cette page vous a-t-elle été utile ? Évaluez-la :

Envoyer des commentaires concernant…