Este es el quinto y último tutorial de una ruta de aprendizaje que te enseña a modularizar y contenerizar una aplicación monolítica.
El recorrido de aprendizaje consta de los siguientes tutoriales:
- Descripción general
- Información sobre el monolito
- Modularizar el monolito
- Preparar la aplicación modular para la contenerización
- Contenerizar la aplicación modular
- Desplegar la aplicación en un clúster de GKE (este tutorial)
En el tutorial anterior, Contenerizar la aplicación modular, preparaste la aplicación modular Cymbal Books para su implementación. Has contenedorizado los módulos de la aplicación, has probado los contenedores resultantes y has enviado las imágenes de contenedor a Artifact Registry.
En este tutorial, desplegarás la aplicación en contenedores en un clúster de Google Kubernetes Engine. Con este paso, se completa la transformación de la aplicación Cymbal Books en un sistema modular y escalable que se ejecuta en un clúster de Kubernetes.
Costes
Si sigues los pasos de este tutorial, se aplicarán cargos a tu Google Cloud cuenta. Los costes empiezan cuando habilitas GKE e implementas la aplicación de ejemplo Cymbal Books. Estos costes incluyen los cargos por clúster de GKE, tal como se indica en la página de precios, y los cargos por ejecutar máquinas virtuales de Compute Engine.
Para evitar cargos innecesarios, inhabilita GKE o elimina el proyecto una vez que hayas completado este tutorial.
Antes de empezar
Antes de empezar este tutorial, asegúrate de haber completado los tutoriales anteriores de la serie. Para ver un resumen de toda la serie y enlaces a tutoriales específicos, consulta Plan de formación: transformar una aplicación monolítica en una aplicación de GKE (resumen).
En concreto, debes haber seguido los pasos del tutorial anterior, Contenerizar la aplicación modular.
Configurar el clúster de GKE
Antes de implementar la aplicación modular Cymbal Books, debes crear un clúster de GKE. Este clúster proporciona la infraestructura en la que se ejecutarán los contenedores de tu aplicación.
En este tutorial, usarás la CLI de gcloud para crear el clúster. También puedes usar la Google Cloud consola, que proporciona una interfaz gráfica de usuario (GUI) para crear y gestionar Google Cloudrecursos, como clústeres de GKE.
Crear y verificar un clúster de GKE
Un clúster de GKE proporciona los recursos informáticos necesarios para ejecutar tus contenedores en Kubernetes. Sigue estos pasos para crear un clúster con la CLI de gcloud.
Ve a la Google Cloud consola.
En la consola, haz clic en el botón Activar Cloud Shell:
Se abrirá una sesión de Cloud Shell en un marco de la parte inferior de la consola.
Define tu proyecto predeterminado en Google Cloud CLI:
gcloud config set project PROJECT_ID
Sustituye
PROJECT_ID
por el ID del proyecto que has creado o seleccionado en la sección Seleccionar o crear un proyecto Google Cloud del tutorial anterior. Un ID de proyecto es una cadena única que diferencia tu proyecto de todos los demás proyectos de Google Cloud. Para encontrar el ID de proyecto, ve al selector de proyectos. En esa página, puede ver los IDs de cada uno de sus Google Cloud proyectos.Crea un clúster de GKE:
gcloud container clusters create CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --num-nodes=2
Haz los cambios siguientes:
CLUSTER_NAME
: un nombre para el clúster, comocymbal-cluster
.CONTROL_PLANE_LOCATION
: la ubicación de Compute Engine del plano de control de tu clúster. Indica una región para los clústeres regionales o una zona para los clústeres zonales, comous-central1
oeurope-west1-b
.
Obtén las credenciales del clúster para que la CLI de
kubectl
pueda conectarse al clúster:gcloud container clusters get-credentials CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION
Este comando actualiza el archivo de configuración de Kubernetes, que se almacena de forma predeterminada en
~/.kube/config
. Este archivo de configuración contiene las credenciales que necesitakubectl
para interactuar con tu clúster de GKE.Comprueba que
kubectl
esté conectado al clúster enumerando los nodos del clúster:kubectl get nodes
Si la configuración se realiza correctamente, este comando muestra los nodos de tu clúster de GKE. Como has creado el clúster con
--num-nodes=2
, deberías ver información sobre dos nodos, similar a la siguiente:NAME STATUS ROLES AGE VERSION gke-nov18-default-pool-6a8f9caf-bryg Ready <none> 30s v1.30.8-gke.1128000 gke-nov18-default-pool-6a8f9caf-ut0i Ready <none> 30s v1.30.8-gke.1128000
En este ejemplo, ambos nodos están en el estado
Ready
. Este estado significa que el clúster de GKE está listo para alojar tus cargas de trabajo en contenedores.
Implementar la aplicación
Ahora que has creado un clúster de GKE, puedes desplegar la aplicación Cymbal Books en él. Para desplegar una aplicación en un clúster, aplica el manifiesto de Kubernetes al clúster.
Aplica el manifiesto de Kubernetes
En Cloud Shell, despliega la aplicación en el clúster de GKE ejecutando los siguientes comandos:
Ve al directorio raíz de la aplicación en contenedor:
cd kubernetes-engine-samples/quickstarts/monolith-to-microservices/containerized/
Aplica el manifiesto de Kubernetes:
kubectl apply -f kubernetes_manifest.yaml
El comando anterior indica a Kubernetes que cree los recursos especificados en el archivo kubernetes-manifest.yaml
. Estos recursos incluyen servicios, una implementación y pods.
Has visto los servicios por primera vez en la sección Cambiar el código modular del tutorial Preparar la aplicación modular para la contenedorización.
En ese tutorial, actualizaste el código de la aplicación para usar nombres de servicio en lugar de localhost
. Esta actualización permite a Kubernetes enrutar solicitudes entre módulos y asegura que los módulos puedan comunicarse entre sí dentro de un clúster.
Ahora, cuando apliques el manifiesto, Kubernetes creará los servicios dentro del clúster.
Un Deployment es un objeto de la API de Kubernetes que te permite ejecutar varias réplicas de pods distribuidas entre los nodos de un clúster. En la siguiente sección se explica qué son los pods.
¿Qué es un pod de Kubernetes?
En el tutorial anterior, creaste una imagen de contenedor para cada módulo de la aplicación Cymbal Books. Por ejemplo, creaste imágenes de contenedor basadas en los módulos home_app
y book_details_app
.
Cuando usas el comando kubectl apply
para desplegar el manifiesto de Kubernetes, Kubernetes extrae las imágenes de contenedor de Artifact Registry al clúster. En el clúster, las imágenes de contenedor se convierten en contenedores y los contenedores se ejecutan en pods.
Un pod es un entorno aislado en el que se ejecutan los contenedores y realiza las siguientes tareas:
- Asigna CPU y memoria: un pod proporciona los recursos que necesitan los contenedores para funcionar.
- Proporciona redes: cada pod tiene su propia dirección IP. Esto permite que el Pod se comunique con otros Pods.
Los pods se ejecutan en nodos, que son las máquinas que proporcionan potencia de computación al clúster. Kubernetes asigna automáticamente pods a los nodos y distribuye los pods entre los nodos del clúster para reducir el riesgo de sobrecargar un nodo concreto. Esta distribución ayuda al clúster a usar sus recursos de computación y memoria de forma eficiente.
Verificar la implementación
Después de aplicar el manifiesto de Kubernetes con el comando kubectl apply
, comprueba que la aplicación se ha desplegado correctamente en el clúster. Para verificar la implementación, comprueba que los pods y los servicios se estén ejecutando correctamente.
Comprobar los pods
Para ver los pods de tu clúster, ejecuta el siguiente comando:
kubectl get pods
Este comando muestra los pods y su estado actual. Busca la columna ESTADO
para confirmar que todos los pods estén marcados como Running
, lo que indica que
se están ejecutando correctamente y están listos para atender solicitudes. El resultado esperado
es el siguiente:
NAME READY STATUS RESTARTS AGE
home-app-67d59c6b6d-abcde 1/1 Running 0 30s
book-details-app-6d8bcbc58f-xyz 1/1 Running 0 30s
book-reviews-app-75db4c4d7f-def 1/1 Running 0 30s
images-app-7f8c75c79c-ghi 1/1 Running 0 30s
El estado de un pod aparece inicialmente como Pending
mientras se crea y sus contenedores están en proceso de inicio. Si un pod permanece en estado Pending
durante un periodo prolongado, es posible que el clúster no tenga suficientes recursos para que el pod pase a un estado Running
correcto. Si un pod tiene el estado CrashLoopBackOff
, puede que haya un problema con el contenedor. Los pasos para solucionar problemas se indican más adelante en el tutorial.
Comprobar los servicios
Los servicios permiten la comunicación entre pods y permiten que los clientes externos (por ejemplo, usuarios, secuencias de comandos automatizadas o herramientas de monitorización) accedan a la aplicación. Para ver los servicios de tu clúster, ejecuta el siguiente comando:
kubectl get services
La salida de este comando tiene el siguiente aspecto:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
home-app-service LoadBalancer 10.12.3.4 35.185.1.2 80:30837/TCP 30s
details-service ClusterIP 10.12.3.5 <none> 80/TCP 30s
reviews-service ClusterIP 10.12.3.6 <none> 80/TCP 30s
images-service LoadBalancer 10.12.3.7 34.125.6.3 80:32014/TCP 30s
Estos son los campos clave que debes observar en el resultado:
TYPE
: este campo indica cómo se expone el servicio. Los servicios de tipoLoadBalancer
proporcionan acceso externo a la aplicación.EXTERNAL-IP
: en el caso de un servicio de tipoLoadBalancer
, el campoEXTERNAL-IP
muestra la dirección IP pública que los usuarios pueden introducir en su navegador web para acceder a la aplicación. En el caso de un servicio de tipoClusterIP
, este campo está vacío porque los servicios de tipoClusterIP
solo se pueden acceder desde el clúster.
Probar la implementación
Después de desplegar la aplicación Cymbal Books en el clúster de GKE, comprueba que se puede acceder a la aplicación y que los contenedores pueden comunicarse entre sí.
Acceder a la aplicación
Para confirmar que se puede acceder a la aplicación, sigue estos pasos:
Recupera la dirección IP externa de
home-app-service
:kubectl get services
Busca la columna
**EXTERNAL-IP**
en el resultado y anota la dirección IP asociada ahome-app-service
.Abre un navegador web e introduce la siguiente URL:
http://EXTERNAL-IP
Sustituye
EXTERNAL-IP
por la dirección IP que has encontrado en el paso anterior.Comprueba que la página principal de la aplicación Cymbal Books se carga correctamente.
Verificar la comunicación entre servicios
Los contenedores de la aplicación Cymbal Books dependen de los servicios para intercambiar información. Para asegurarte de que los contenedores pueden comunicarse de forma eficaz, sigue estos pasos:
Recupera la dirección IP externa de
home-app-service
como se ha descrito anteriormente.Usa la interfaz de la aplicación para probar las interacciones entre contenedores. Para ello, confirma que las siguientes funciones funcionan haciendo clic en todos los enlaces disponibles en la interfaz de la aplicación:
- Comprueba las imágenes de portada de los libros: confirma que se cargan correctamente tanto en la página principal como en la página de detalles del libro. Si es así, los contenedores
home_app
ybook_details_app
se comunican correctamente con el contenedorimages_app
. - Ver detalles del libro: vaya a la página de detalles de un libro desde la página principal. Si ves los detalles de un libro, significa que el contenedor
home_app
se comunica correctamente conbook_details_app
. - Ver reseñas de libros: haz clic en un enlace de reseña de un libro para verificar que el contenedor
home_app
puede comunicarse con el contenedorbook_reviews_app
.
- Comprueba las imágenes de portada de los libros: confirma que se cargan correctamente tanto en la página principal como en la página de detalles del libro. Si es así, los contenedores
Tu aplicación ahora se está ejecutando en un clúster de GKE.
¡Enhorabuena! Has visto cómo transformar una aplicación monolítica en un sistema modular en contenedores que se ejecuta en un clúster de GKE activo. Durante el proceso, has aprendido a dividir el código acoplado en módulos independientes, a compilar y enviar imágenes de contenedor a un repositorio, a definir manifiestos de Kubernetes y a desplegar tu aplicación desde el registro en GKE. Se trata de un gran logro que refleja los pasos que dan los equipos en el mundo real para modernizar las aplicaciones en la nube.
Solución de problemas
Si la aplicación no responde o los contenedores no se comunican, sigue estos pasos para diagnosticar y resolver problemas habituales.
Consultar el estado de tus pods
Empieza enumerando todos los pods de tu clúster para determinar si se están ejecutando como se espera:
kubectl get pods
Revisa el resultado para confirmar que cada pod está en el estado Running
. Si algún pod no se está ejecutando, anota su nombre para inspeccionarlo más a fondo.
Inspeccionar los registros de pods
Si un Pod no gestiona las solicitudes correctamente, consulta sus registros para ver si hay algún mensaje de error:
kubectl logs POD_NAME
Sustituye POD_NAME
por el nombre del pod que quieras inspeccionar. Este comando es útil para identificar problemas de inicio o errores de tiempo de ejecución.
Describe un Pod para obtener información detallada
Si un Pod permanece en un estado que no es Running
durante más de cinco minutos (por ejemplo, si está en estado Pending
, ContainerCreating
o CrashLoopBackOff
), puedes ver información detallada sobre el estado y los eventos del Pod con el siguiente comando:
kubectl describe pod POD_NAME
Sustituye POD_NAME
por el nombre del pod del que quieras obtener información detallada.
La sección Events
de la salida puede indicar que las limitaciones de recursos o los problemas con las extracciones de imágenes impiden que el pod se inicie correctamente.
Verificar la configuración del servicio
Asegúrate de que tus servicios estén configurados correctamente, sobre todo el servicio que expone el módulo de casa con una dirección IP externa. Lista los servicios con el siguiente comando:
kubectl get services
Si observas que el servicio del módulo de casa tiene una dirección EXTERNAL-IP
que aparece como Pending
, ejecuta el siguiente comando:
kubectl describe service SERVICE_NAME
Sustituye SERVICE_NAME
por el nombre del servicio del módulo de casa.
Este comando proporciona más detalles sobre la configuración del servicio y te ayuda a identificar retrasos en la asignación de la dirección IP externa u otros problemas de configuración.
Consultar eventos de clúster
Puedes examinar los eventos del clúster para determinar si un problema afecta a varios componentes del clúster:
kubectl get events
Este comando puede determinar si hay problemas más generales con los recursos o la red que afecten a tu implementación.
Eliminar los recursos
Ejecutar un clúster de GKE conlleva costes. Cuando hayas completado este tutorial, elimina los recursos para evitar que se te cobren cargos adicionales. Sigue estos pasos para eliminar el clúster y, opcionalmente, todo el proyecto.
Elimina el clúster de GKE
Para eliminar el clúster de GKE, usa el siguiente comando:
gcloud container clusters delete CLUSTER_NAME
--location=CONTROL_PLANE_LOCATION
Haz los cambios siguientes:
CLUSTER_NAME
: el nombre del clúster que has creado, comocymbal-cluster
.CONTROL_PLANE_LOCATION
: la ubicación de Compute Engine del plano de control de tu clúster. Proporciona una región para los clústeres regionales o una zona para los clústeres zonales.
Cuando se te pida, confirma la eliminación.
Verificar que el clúster se ha eliminado
Para asegurarte de que el clúster se ha eliminado, ejecuta el siguiente comando:
gcloud container clusters list
El clúster ya no debería aparecer en la salida. Si es así, espera unos instantes y vuelve a intentarlo.
(Opcional) Eliminar el Google Cloud proyecto
Si has creado un Google Cloud proyecto específicamente para este tutorial y ya no lo necesitas, puedes eliminarlo por completo. Google Cloud Al eliminar el proyecto, se quitarán todos los recursos y se detendrá la facturación del proyecto:
- En la Google Cloud consola, abre la página Gestionar recursos.
- Selecciona el proyecto que quieras eliminar.
- Haz clic en Eliminar proyecto y sigue las indicaciones para confirmar la acción.
Resumen de la serie
¡Enhorabuena! Al completar este plan de formación, has aprendido los conceptos básicos para convertir una aplicación monolítica en una aplicación modular y contenerizada que se ejecuta en un clúster de Kubernetes. En los siguientes pasos se resume el proceso:
-
- Hemos analizado la estructura de la aplicación monolítica de Cymbal Books.
- Configurar un entorno de Python local para ejecutar el monolito y probar sus endpoints.
- Ha adquirido conocimientos sobre la base de código de la aplicación para prepararla para la modularización.
-
- Has aprendido a dividir el código monolítico en módulos independientes. Cada módulo gestiona una función distinta, como mostrar los detalles o las reseñas de un libro.
- Has visto cómo se implementan estos módulos como aplicaciones Flask independientes que se ejecutan en puertos diferentes.
- Se ha probado la aplicación modularizada.
Preparar el código modular para la contenerización
- Hemos detectado que tenías que actualizar las URLs en
home.py
para usar nombres de servicio en lugar delocalhost
. - Has aprendido cómo el manifiesto de Kubernetes define los servicios que permiten que los módulos de la aplicación, que ya se comunican entre sí, se encuentren en el contexto de un clúster de Kubernetes.
- Hemos detectado que tenías que actualizar las URLs en
Contenerizar la aplicación modular
- Configurar un Google Cloud proyecto y clonar la aplicación de GitHub en Cloud Shell.
- Compiló imágenes de contenedor para cada módulo con Docker y probó los contenedores de forma local.
- Ha enviado las imágenes de contenedor a Artifact Registry para preparar la aplicación para el despliegue en un clúster.
- Se ha actualizado el manifiesto de Kubernetes para que haga referencia a las rutas de las imágenes de contenedor en Artifact Registry.
Despliega la aplicación en un clúster de GKE (el tutorial en el que te encuentras ahora):
- Has creado un clúster de GKE.
- Se han desplegado las imágenes de contenedor de Artifact Registry en el clúster de GKE.
- Hemos probado la versión final de la aplicación, que ahora es escalable y se ejecuta en un entorno de Kubernetes.
Siguientes pasos
Para obtener más formación práctica sobre cómo crear clústeres, consulta nuestra serie Ruta de aprendizaje: aplicaciones escalables.