Ejecución de Bookshelf en Node.js en Kubernetes Engine

En este instructivo se muestra cómo ejecutar la aplicación de Node.js en Bookshelf en Google Kubernetes Engine (GKE). Sigue las indicaciones para organizar en contenedores y también implementar una aplicación web de Node.js existente en GKE. Se recomienda que revises la documentación de la aplicación Bookshelf como parte del instructivo del entorno estándar de App Engine.

Objetivos

  • Crear un clúster de GKE
  • Organizar una aplicación de Node.js en contenedores
  • Crear un frontend replicado para la aplicación Bookshelf
  • Crear un backend replicado para la aplicación Bookshelf
  • Crear un servicio balanceador de cargas para enrutar el tráfico HTTP al frontend de Bookshelf

Costos

En este instructivo, se usan componentes facturables de Google Cloud Platform (GCP), incluidos los siguientes:

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

Usa la calculadora de precios para generar una estimación de los costos según el uso previsto. Los usuarios nuevos de GCP pueden ser aptos para una prueba gratuita.

Antes de comenzar

  1. Accede a tu Cuenta de Google.

    Si todavía no tienes una cuenta, regístrate para obtener una nueva.

  2. En GCP Console, en la página de selección de proyecto, selecciona o crea un proyecto de GCP.

    Ir a la página de selección de proyecto

  3. Asegúrate de tener habilitada la facturación para tu proyecto de Google Cloud Platform. Obtén información sobre cómo confirmar que tienes habilitada la facturación para tu proyecto.

  4. Habilita lasCloud Datastore, Kubernetes Engine, Cloud Storage, Cloud Pub/Sub y Google+APIAPI.

    Habilita lasAPI

  5. Instala e inicializa el SDK de Cloud.
  6. Instala Docker. Se usa para compilar imágenes de contenedores de manera local.
  7. Instala kubectl.
    gcloud components install kubectl

Crear un clúster de GKE

Un clúster de GKE es un conjunto administrado de máquinas virtuales de Compute Engine que operan como un clúster de GKE único. Este instructivo necesita un clúster con un mínimo de dos nodos, y estos nodos necesitan acceder a todas las API de Google.

  1. Crea el clúster. Reemplaza [YOUR_GCP_ZONE] por la zona de GCP en la que quieres alojarlo.

    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. Verifica que tienes acceso al clúster. Cuando ejecutas el siguiente comando, aparece una lista de los nodos en el clúster de tu contenedor y, además, indica que el clúster está activo y funcionando, y que puedes acceder a él.

    kubectl get nodes
    

Usa el comando kubectl para crear recursos en un clúster de GKE. Para obtener más información sobre kubectl, consulta las operaciones de clúster de GKE. En general, usa gcloud para administrar recursos en tu proyecto de GCP y kubectl a fin de administrar recursos en tu clúster de GKE. Un proyecto único puede tener varios clústeres, lo que facilita tener clústeres creados a partir de diferentes tipos de máquinas a fin de satisfacer necesidades distintas.

Cuando creas un clúster con gcloud, automáticamente se configura una autenticación para kubectl. En los clústeres creados con Google Cloud Platform Console se puede configurar la autenticación a través del comando gcloud container clusters get-credentials.

Clonar la aplicación de muestra

La aplicación de muestra está disponible en GitHub en GoogleCloudPlatform/nodejs-getting-started.

  1. Clona el repositorio.

    git clone https://github.com/GoogleCloudPlatform/nodejs-getting-started.git
    
  2. Navega al directorio de muestra.

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

Inicializar Cloud Datastore

La aplicación Bookshelf usa Cloud Datastore para almacenar los libros. Para inicializar Cloud Datastore en tu proyecto por primera vez, completa los siguientes pasos:

  1. Abre Cloud Datastore en GCP Console.

    Ir a Cloud Datastore

  2. Selecciona una región para tu almacén de datos y haz clic en Continuar hasta que llegues a la página Crear una entidad. Cierra la ventana, ya que la aplicación Bookshelf está lista para crear entidades en Cloud Datastore.

Crear un depósito de Cloud Storage

La aplicación Bookshelf utiliza Cloud Storage para almacenar archivos de imagen.

Las instrucciones siguientes muestran cómo crear un depósito de Cloud Storage. Los depósitos son los contenedores básicos que conservan tus datos en Cloud Storage.

  1. Ingresa el siguiente comando en una ventana de terminal:

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

    Donde:

    • [YOUR-BUCKET-NAME] representa el nombre de tu depósito de Cloud Storage.
  2. Para ver las imágenes que se subieron en la aplicación Bookshelf, configura la Lista de control de acceso (LCA) predeterminada del depósito como public-read.

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

    Configurar la aplicación

    En el directorio de muestra, crea un archivo config.json que contenga lo siguiente:

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

    Reemplaza [YOUR_PROJECT_ID] con el ID del proyecto y [YOUR_CLOUD_BUCKET] con el nombre de tu depósito de Cloud Storage.

    Crear contenedores para la aplicación

    La aplicación de muestra incluye un Dockerfile que se usa para crear la imagen de Docker de la aplicación. Esta imagen de Docker ejecuta la aplicación en 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
    
    La aplicación de muestra también incluye un archivo .dockerignore que muestra una lista de rutas de archivos que no se incluyen en el contenedor de Docker resultante. Por lo general, esto incluye artefactos de compilación y también instalaciones de dependencias 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. Compila la imagen de Docker de la app.

    docker build -t gcr.io/[YOUR_PROJECT_ID]/bookshelf
    
  4. Envía la imagen a Google Container Registry para que el clúster pueda acceder a ella.

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

Implementar el frontend de Bookshelf

La aplicación Bookshelf tiene un servidor de frontend que controla las solicitudes web y un trabajador de backend que procesa los libros y agrega información adicional.

Los recursos del clúster que se necesitan para ejecutar el frontend se definen en bookshelf-frontend-datastore.yaml. Estos recursos se describen como una implementación de Kubernetes. Las implementaciones facilitan la creación y la actualización de un conjunto de réplicas y sus pods asociados.

# 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. En bookshelf-frontend-datastore.yaml, reemplaza [GCLOUD_PROJECT] por el ID del proyecto.

  2. Implementa los recursos en el clúster.

    kubectl create -f bookshelf-frontend-datastore.yaml
    
  3. Haz un seguimiento del estado de la implementación.

    kubectl get deployments
    

    La implementación estará completa cuando tenga la misma cantidad de pods disponibles y de pods deseados. Si tienes problemas con la implementación, bórrala y empieza de nuevo.

    kubectl delete deployments bookshelf-frontend
    
  4. Cuando la implementación finalice, podrás ver los pods que esta creó.

    kubectl get pods
    

Implementar el backend de Bookshelf

El backend de Bookshelf se implementa del mismo modo que el frontend.

# 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. En bookshelf-worker-datastore.yaml, reemplaza [GCLOUD_PROJECT] por el ID del proyecto.

  2. Implementa los recursos en el clúster.

    kubectl create -f bookshelf-worker-datastore.yaml
    
  3. Verifica que los pods se estén ejecutando.

    kubectl get pods
    

Crear el servicio de Bookshelf

Los servicios de Kubernetes proporcionan un solo punto de acceso a un conjunto de pods. Si bien es posible acceder a un solo pod, los pods son efímeros, por lo que te recomendamos dirigirte a un conjunto de pods con un solo extremo. En la aplicación Bookshelf, el servicio de la misma te permite acceder a los pods de frontend de Bookshelf desde una dirección IP única. Este servicio se define en 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

Ten en cuenta que los pods y el servicio que usa los pods son independientes. Kubernetes usa etiquetas para seleccionar los pods a los que se dirige un servicio. Gracias a las etiquetas, puedes tener un servicio que se dirija a los pods desde conjuntos de réplicas diferentes y tener varios servicios que apunten a un pod en particular.

  1. Crea el servicio de Bookshelf.

    kubectl create -f bookshelf-service.yaml
    
  2. Obtén la dirección IP externa del servicio.

    kubectl describe service bookshelf
    

    Ten en cuenta que la dirección IP puede tardar hasta 60 segundos en asignarse. La dirección IP externa aparecerá en LoadBalancer Ingress.

Acceder a la aplicación Bookshelf

Ya implementaste todos los recursos necesarios para ejecutar la aplicación Bookshelf en GKE. Usa la dirección IP externa del paso anterior a fin de cargar la aplicación en el navegador web y crear libros. Si implementaste el trabajador, los libros se actualizan automáticamente con la información de la API de Google Libros.

Limpiar

Sigue estos pasos para evitar que se apliquen cargos a tu cuenta de Google Cloud Platform por los recursos que usaste en este instructivo:

Borra el proyecto

La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.

Para borrar el proyecto, haz lo siguiente:

  1. En GCP Console, dirígete a la página Administrar recursos.

    Ir a la página Administración de recursos

  2. En la lista de proyectos, selecciona el proyecto que deseas borrar y haz clic en Borrar .
  3. En el cuadro de diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

Borrar el clúster

Borrar el clúster quita todos los recursos de GKE y Compute Engine, pero tendrás que quitar todos los recursos en Cloud Storage, Cloud Datastore y Cloud Pub/Sub de forma manual.

Usa el siguiente comando para borrar el clúster. Reemplaza [YOUR_GCP_ZONE] con la zona que usaste cuando creaste el clúster.

gcloud container clusters delete bookshelf --zone [YOUR_GCP_ZONE]

Pasos siguientes