Ejecutar Bookshelf para Node.js en Kubernetes Engine

En este tutorial, se muestra cómo ejecutar la aplicación Bookshelf para Node.js en Kubernetes Engine. Sigue las instrucciones para insertar una aplicación web de Node.js en un contenedor y desplegarla en Kubernetes Engine. No es necesario estar familiarizado con la aplicación Bookshelf para seguir las indicaciones de este tutorial, pero si quieres obtener más información al respecto, consulta el tutorial sobre el entorno flexible de App Engine.

Objetivos

  • Crear un clúster de Kubernetes Engine.
  • Insertar una aplicación de Node.js en un contenedor.
  • Crear una interfaz replicada para la aplicación Bookshelf.
  • Crear un backend replicado para la aplicación Bookshelf.
  • Crear un servicio con balanceo de carga para enrutar el tráfico HTTP a la interfaz de Bookshelf.

Costes

En este tutorial, se usan componentes facturables de Cloud Platform, entre los que se incluyen los siguientes:

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

Si quieres generar una estimación de costes en función del uso previsto, usa la calculadora de precios. Es posible que los nuevos usuarios de Cloud Platform tengan derecho a una versión de prueba gratuita.

Antes de empezar

  1. Accede a tu Cuenta de Google.

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

  2. Selecciona o crea un proyecto de GCP.

    Ir a la página Administrar recursos

  3. Comprueba que la facturación esté habilitada en tu proyecto.

    Descubre cómo puedes habilitar la facturación

  4. Habilita las Cloud Datastore, Cloud Storage, and Cloud Pub/Sub API necesarias.

    Habilita las API

  5. Realiza la instalación y la inicialización del SDK de Cloud.
  6. Instala Docker. Docker sirve para crear imágenes de contenedor localmente.
  7. Instala kubectl:
    gcloud components install kubectl

Crear un clúster de Kubernetes Engine

Un clúster de Kubernetes Engine es un conjunto administrado de máquinas virtuales de Compute Engine que funcionan como un único clúster de Kubernetes. Para este tutorial necesitaremos un clúster con un mínimo de dos nodos, y estos nodos precisarán de acceso a todas las API de Google. Sustituye [YOUR_GCP_ZONE] por la zona de Cloud Platform en la que deseas alojar tu clúster.

  1. Crea el clúster:

    gcloud container clusters create bookshelf \
        --scopes "cloud-platform" \
        --num-nodes 2 \
        --zone [YOUR_GCP_ZONE]
    
  2. Verifica que tienes acceso al clúster:

    kubectl get nodes
    

    La ejecución de este comando muestra los nodos del clúster de contenedor. Asimismo, indica que este está funcionando y que puedes acceder a él.

Utiliza el comando kubectl para crear recursos en un clúster de Kubernetes Engine. Para obtener más información sobre kubectl, consulta la página de operaciones de clúster de Kubernetes Engine. En general, deberás usar gcloud para administrar los recursos del proyecto de Google Cloud y kubectl para gestionar los recursos del clúster de Kubernetes Engine. Un solo proyecto puede tener varios clústeres, por lo que es fácil que haya clústeres que se compongan de diferentes tipos de máquinas para satisfacer las distintas necesidades.

Cuando creas un clúster con gcloud, se configura automáticamente la autenticación para kubectl. Los clústeres creados con Cloud Console pueden configurar la autenticación mediante el comando gcloud container clusters get-credentials.

Clonar la aplicación de muestra

Podrás encontrar la aplicación de muestra en GitHub en GoogleCloudPlatform/nodejs-getting-started.

  1. Clona el repositorio:

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

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

Inicializar Datastore

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

  1. Abre Datastore en la consola de GCP.

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

Crear un segmento de Cloud Storage

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

En las siguientes instrucciones, se explica cómo crear un segmento de Cloud Storage. Los segmentos son los contenedores básicos que almacenan tus datos en Cloud Storage.

Para crear un segmento, sigue estas instrucciones:

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

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

  2. Establece la LCA predeterminada del segmento como public-read; con ello, los usuarios podrán ver las imágenes que suban:

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

Configurar la aplicación

En el directorio de la muestra, crea un archivo config.json con el siguiente contenido:

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

Sustituye [YOUR_PROJECT_ID] por el ID del proyecto y [YOUR_CLOUD_BUCKET] por el nombre del segmento de Cloud Storage.

Insertar la aplicación en un contenedor

La aplicación de muestra incluye un Dockerfile, que sirve para crear la imagen Docker de la aplicación. Esta imagen Docker se usa para ejecutar la aplicación en Kubernetes Engine.

# 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
# '>=0.12.7', if not then do an npm install of the latest available
# version that satisfies it.
RUN /usr/local/bin/install_node '>=0.12.7'
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 contiene un archivo .dockerignore que muestra las rutas de archivos que no se incluirán en el contenedor Docker resultante. Normalmente, esto incluye artefactos de versión e instalaciones de dependencias locales.

# Copyright 2015 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

Crea la imagen Docker de la aplicación:

docker build -t gcr.io/[YOUR_PROJECT_ID]/bookshelf .

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

Desplegar la interfaz de Bookshelf

La aplicación Bookshelf tiene un servidor de interfaz que maneja las peticiones web y un trabajador de backend que procesa los libros y añade más información.

Los recursos de clúster necesarios para ejecutar la interfaz se definen en bookshelf-frontend-datastore.yaml. Estos recursos se describen como un despliegue de Kubernetes. Los despliegues facilitan la creación y actualización de un conjunto de réplicas y sus pods asociados.

# Copyright 2016 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, sustituye [GCLOUD_PROJECT] por el ID del proyecto.
  2. Usa kubectl para desplegar los recursos en el clúster:

    kubectl create -f bookshelf-frontend-datastore.yaml
    
  3. Haz un seguimiento del estado del despliegue:

    kubectl get deployments
    

    Cuando el número de pods disponibles y el de pods deseados sea el mismo, el despliegue se habrá completado. Si tienes problemas con el despliegue, puedes eliminarlo y comenzar de nuevo:

    kubectl delete deployments bookshelf-frontend
    
  4. Una vez completado el despliegue, puedes ver los pods creados:

    kubectl get pods
    

Desplegar el backend de Bookshelf

El backend y la interfaz de Bookshelf se despliegan de la misma manera.

# Copyright 2016 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, sustituye [GCLOUD_PROJECT] por el ID del proyecto.
  2. Usa kubectl para desplegar los recursos en el clúster:

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

    kubectl get pods
    

Crear el servicio de Bookshelf

Los servicios de Kubernetes sirven para proporcionar un único punto de acceso a un conjunto de pods. Si bien es posible acceder a un solo pod, estos son efímeros. Por eso, en general, es más conveniente dirigirse a un conjunto de pods con un único punto de conexión. En la aplicación Bookshelf, el servicio de Bookshelf permite acceder a los pods de interfaz de la aplicación desde una sola dirección IP. Este servicio se define en bookshelf-service.yaml.

# Copyright 2016 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 los usa son independientes. Kubernetes usa etiquetas para seleccionar los pods de los que se encarga un servicio. Con las etiquetas, puedes tener un servicio que se ocupe de pods de diferentes conjuntos de réplicas y tener varios servicios que apunten a un único pod.

  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
    

    Puede que se tarde hasta 60 segundos en asignar la dirección IP. La dirección IP externa se mostrará en LoadBalancer Ingress.

Acceder a la aplicación Bookshelf

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

Eliminar los recursos

Para evitar que los recursos utilizados en este tutorial se cobren en tu cuenta de Google Cloud Platform, sigue estas instrucciones:

Eliminar el proyecto

La forma más fácil de evitar la facturación consiste en eliminar el proyecto que has creado para el tutorial.

Para eliminar el proyecto, sigue las instrucciones que figuran a continuación:

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

    Ir a la página Proyectos

  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.

Eliminar el clúster

Al eliminar el clúster, se retiran todos los recursos de Kubernetes Engine y Compute Engine. Sin embargo, es necesario quitar manualmente los recursos de Cloud Storage, Cloud Datastore y Cloud Pub/Sub.

Elimina el clúster con el siguiente comando. Sustituye [YOUR_GCP_ZONE] por la zona que has utilizado al crear el clúster.

gcloud container clusters delete bookshelf --zone [YOUR_GCP_ZONE]

Siguientes pasos

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...