Implementa una aplicación web en contenedor

En este instructivo, se muestra cómo empaquetar una aplicación web en una imagen de contenedor de Docker y ejecutar esa imagen en un clúster de Google Kubernetes Engine como un conjunto de réplicas con balanceo de cargas que puedes escalar según las necesidades de tus usuarios.

Objetivos

Para empaquetar y luego implementar tu aplicación en GKE, debes seguir los siguientes pasos:

  1. Empaqueta tu aplicación en una imagen de Docker.
  2. Ejecuta el contenedor de manera local en tu máquina (opcional).
  3. Sube la imagen a un registro.
  4. Crea un clúster de contenedores.
  5. Implementa tu app en el clúster.
  6. Expón tu app en Internet.
  7. Amplia tu implementación.
  8. Implementa una nueva versión de tu app.

Antes de comenzar

Sigue los pasos que se indican a continuación para habilitar la API de Kubernetes Engine:
  1. Consulta la página de Kubernetes Engine en Google Cloud Platform Console.
  2. Crea o selecciona un proyecto.
  3. Espera a que la API y los servicios relacionados se habiliten. Esto puede tardar varios minutos.
  4. Comprueba que la facturación esté habilitada en tu proyecto.

    Descubre cómo puedes habilitar la facturación

Opción A: Usa Google Cloud Shell

Puedes seguir este instructivo y usar Google Cloud Shell, el cual viene preinstalado con las herramientas de línea de comandos de gcloud, docker, y kubectl usadas en este instructivo. Si usas Cloud Shell, no necesitas instalar estas herramientas de línea de comandos en tu estación de trabajo.

Para usar Google Cloud Shell, sigue estos pasos:

  1. Ve a Google Cloud Platform Console.
  2. Haz clic en el botón Activar Cloud Shell en la parte superior de la ventana de la consola.

    Google Cloud Platform Console

    Se abrirá una sesión de Cloud Shell en un marco nuevo en la parte inferior de la consola, que mostrará una ventana emergente con una línea de comandos.

    Sesión de Cloud Shell

Opción B: Usa las herramientas de línea de comandos de manera local

Si prefieres seguir este instructivo en tu estación de trabajo, necesitas instalar las siguientes herramientas:

  1. Instala el SDK de Google Cloud, en el que está incluida la herramienta de línea de comandos de gcloud.
  2. Con la herramienta de línea de comandos de gcloud, instala la herramienta de línea de comandos de Kubernetes. kubectl se usa para comunicarse con Kubernetes, que es el sistema de organización de clústeres de los clústeres de GKE:

    gcloud components install kubectl
  3. Instala la edición de la comunidad de Docker (CE) en tu estación de trabajo. Usarás esto a fin de compilar una imagen de contenedor para la aplicación.

  4. Instala la herramienta de control de fuente Git para obtener la aplicación de muestra de GitHub.

Paso 1: Compila la imagen del contenedor

GKE acepta imágenes de Docker como el formato de implementación de la aplicación. Para crear una imagen de Docker, necesitas tener una aplicación y un Dockerfile.

En este instructivo, implementarás una aplicación web de muestra llamada hello-app, un servidor web escrito en Go que responde a todas las solicitudes con el mensaje “Hello, World!” en el puerto 80.

La aplicación está empaquetada como una imagen de Docker mediante el uso de Dockerfile que contiene instrucciones para compilar la imagen. Utilizarás este Dockerfile para empaquetar tu aplicación.

Para descargar el código fuente de hello-app, ejecuta los siguientes comandos:

git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
cd kubernetes-engine-samples/hello-app

Establece la variable de entorno PROJECT_ID en tu ID del proyecto de GCP. Esta variable se utilizará para asociar la imagen del contenedor con Container Registry. de tu proyecto.

export PROJECT_ID=[PROJECT_ID]

A fin de compilar la imagen del contenedor de esta aplicación y etiquetarla para subirla, ejecuta el siguiente comando:

docker build -t gcr.io/${PROJECT_ID}/hello-app:v1 .

Este comando le indica a Docker que construya la imagen mediante el Dockerfile en el directorio actual y la etiqueta con un nombre, como gcr.io/my-project/hello-app:v1. El prefijo gcr.io hace referencia a Google Container Registry, donde se aloja la imagen. Ejecutar este comando no subirá la imagen todavía.

Puedes ejecutar el comando docker images para verificar que la compilación fue exitosa:

docker images
Resultado:
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
gcr.io/my-project/hello-app    v1                  25cfadb1bf28        10 seconds ago      54 MB

Paso 2: Sube la imagen del contenedor

Debes subir la imagen del contenedor en un registro para que GKE pueda descargarla y ejecutarla.

Primero, configura la herramienta de línea de comandos de Docker para autenticarte en el Container Registry (debes ejecutar esto solo una vez):

gcloud auth configure-docker

Ahora puedes usar la herramienta de línea de comandos de Docker para subir la imagen en tu Container Registry:

docker push gcr.io/${PROJECT_ID}/hello-app:v1

Paso 3: Ejecuta tu contenedor de manera local (opcional)

Para probar tu imagen de contenedor con tu motor Docker local, ejecuta el siguiente comando:

docker run --rm -p 8080:8080 gcr.io/${PROJECT_ID}/hello-app:v1

Si estás en Cloud Shell, puedes hacer clic en el botón “Vista previa web” en la parte superior derecha para ver tu aplicación ejecutándose en una pestaña del navegador. De lo contrario, abre una ventana de la terminal nueva (o una pestaña de Cloud Shell) y ejecuta para verificar si el contenedor funciona y responde a las solicitudes con “Hello, Word!”:

curl http://localhost:8080

Cuando obtengas una respuesta exitosa, puedes cerrar el contenedor con Ctrl+C en la pestaña donde se ejecuta el comando docker run.

Paso 4: Crea un clúster de contenedores

Ahora que la imagen del contenedor está almacenada en un registro, debes crear un clúster de contenedores para ejecutar la imagen del contenedor. Un clúster consiste en un grupo de instancias de VM de Compute Engine que ejecutan Kubernetes, el sistema de organización de clúster de código abierto que potencia GKE.

Una vez que creaste un clúster de GKE, usa Kubernetes para implementar aplicaciones en el clúster y administrar el ciclo de vida de las aplicaciones.

Configura las opciones de tu ID del proyecto y de la zona de Compute Engine para la herramienta de gcloud:

gcloud config set project $PROJECT_ID
gcloud config set compute/zone [COMPUTE_ENGINE_ZONE]

Ejecuta el siguiente comando para crear un clúster de dos nodos llamado hello-cluster:

gcloud container clusters create hello-cluster --num-nodes=2

La creación del clúster puede tardar varios minutos. Una vez que se completó el comando, ejecuta el siguiente comando y observa las dos instancias de VM de trabajador del clúster:

gcloud compute instances list
Resultado:
NAME                                          ZONE           MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP     STATUS
gke-hello-cluster-default-pool-07a63240-822n  us-central1-b  n1-standard-1               10.128.0.7   35.192.16.148   RUNNING
gke-hello-cluster-default-pool-07a63240-kbtq  us-central1-b  n1-standard-1               10.128.0.4   35.193.136.140  RUNNING

Paso 5: Implementa tu aplicación

Para implementar y administrar aplicaciones en un clúster de GKE, debes comunicarte con el sistema de administración de clústeres de Kubernetes. Normalmente, haces esto con la herramienta de línea de comandos de kubectl.

Kubernetes representa aplicaciones como Pods, que son unidades que representan un contenedor (o grupo de contenedores estrechamente vinculados). El pod es la unidad más pequeña que se puede implementar en Kubernetes. En este instructivo, cada pod solo contiene tu contenedor de hello-app.

El siguiente comando kubectl create deployment kubectl hace que Kubernetes cree una implementación llamado hello-web en tu clúster. La implementación administra varias copias de tu aplicación llamadas réplicas y las programa para que se ejecuten en los nodos individuales de tu clúster. En este caso, la implementación ejecutará solo un pod de tu aplicación.

Ejecuta el siguiente comando para implementar tu aplicación:

kubectl create deployment hello-web --image=gcr.io/${PROJECT_ID}/hello-app:v1

Para ver el pod creado por la implementación, ejecuta el siguiente comando:

kubectl get pods
Resultado:
NAME                         READY     STATUS    RESTARTS   AGE
hello-web-4017757401-px7tx   1/1       Running   0          3s

Paso 6: Expón tu aplicación a Internet

Según la configuración predeterminada, los contenedores que ejecutas en GKE no son accesibles desde Internet, ya que no tienen direcciones IP externas. Debes exponer explícitamente tu aplicación al tráfico desde Internet, ejecuta el siguiente comando:

kubectl expose deployment hello-web --type=LoadBalancer --port 80 --target-port 8080

El comando kubectl expose anterior crea un recurso de servicio, el cual proporciona asistencia de redes y de IP a los pods de tu aplicación. GKE crea una IP externa y un balanceador de cargas (sujeto a facturación) para tu aplicación.

El marcador --port especifica el número de puerto configurado en el balanceador de cargas, y el marcador --target-port especifica el número de puerto en el que escucha el contenedor hello-app.

Una vez que hayas determinado la dirección IP externa para tu aplicación, copia la dirección IP. Dirige tu navegador a esta URL (como http://203.0.113.0) para verificar si tu aplicación es accesible.

Paso 7: Ajusta tu aplicación

Agrega más réplicas al recurso de implementación de tu aplicación con el comando kubectl scale. Para agregar dos réplicas adicionales a tu implementación (para un total de tres), ejecuta el siguiente comando:

kubectl scale deployment hello-web --replicas=3

Puedes ver las nuevas réplicas que se ejecutan en tu clúster cuando ejecutas los siguientes comandos:

kubectl get deployment hello-web
Resultado:
NAME        DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-web   3         3         3            2           1m
kubectl get pods
Resultado:
NAME                         READY     STATUS    RESTARTS   AGE
hello-web-4017757401-ntgdb   1/1       Running   0          9s
hello-web-4017757401-pc4j9   1/1       Running   0          9s
hello-web-4017757401-px7tx   1/1       Running   0          1m

Ahora, tienes varias instancias de tu aplicación que se ejecutan de forma independiente y puedes usar el comando kubectl scale para ajustar la capacidad de tu aplicación.

El balanceador de cargas aprovisionado en el paso anterior comenzará a enrutar el tráfico automáticamente a estas nuevas réplicas.

Paso 8: Implementa una nueva versión de tu aplicación

El mecanismo de actualización progresiva de GKE garantiza que tu aplicación se mantenga activa y disponible, incluso cuando el sistema reemplace las instancias de tu imagen de contenedor anterior por la nueva en todas las réplicas en ejecución.

Puedes crear una imagen para la versión v2 de tu aplicación mediante la creación del mismo código fuente y etiquetándolo como v2 (o puedes cambiar la string "Hello, World!" a "Hello, GKE!" antes de crear la imagen):

docker build -t gcr.io/${PROJECT_ID}/hello-app:v2 .

Luego, envía la imagen a Google Container Registry:

docker push gcr.io/${PROJECT_ID}/hello-app:v2

Ahora, aplica una actualización sucesiva a la implementación existente con una actualización de imagen:

kubectl set image deployment/hello-web hello-app=gcr.io/${PROJECT_ID}/hello-app:v2

Visita tu aplicación nuevamente en http://[EXTERNAL_IP] y observa que los cambios que hiciste surtan efecto.

Limpia

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

Después de completar este instructivo, sigue estos pasos para quitar los siguientes recursos y evitar que se apliquen cargos no deseados en tu cuenta:

  1. Borra el servicio: Este paso designa el balanceador de cargas creado para tu servicio en la nube:

    kubectl delete service hello-web

  2. Borra el clúster de contenedores: Este paso borrará los recursos que conforman el clúster de contenedores, como las instancias de procesamiento, los discos y los recursos de red.

    gcloud container clusters delete hello-cluster

¿Qué sigue?

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

Enviar comentarios sobre...

Instructivos de Kubernetes Engine