Objetivos

Al finalizar el tutorial el estudiante estará en capacidad de:

Pasos previos

En particular se utilizarán los siguientes recursos:

  1. Repositorio privado con la imagen de contenedor de la aplicación ejemplo publicado en Artifact Registry. Por favor realice el tutorial de container registry antes de continuar con el desarrollo de esta guía.
  2. gcloud SDK para acceder a los servicios del proveedor Google Cloud Platform a partir de la consola. En caso de no tenerla instalada puede consultar el siguiente manual de instalación:https://cloud.google.com/sdk/docs/install
  3. Herramienta de control de Kubernetes, kubectl. En caso de no tenerla instalada puede consultar el siguiente manual de instalación:https://kubernetes.io/es/docs/tasks/tools/install-kubectl/

Kubernetes es una plataforma portable y extensible de código abierto para administrar cargas de trabajo y servicios. Kubernetes facilita la automatización y la configuración declarativa. Tiene un ecosistema grande y en rápido crecimiento. El soporte, las herramientas y los servicios para Kubernetes están ampliamente disponibles. [1]

Kubernetes ofrece un entorno de administración centrado en contenedores. Kubernetes orquesta la infraestructura de cómputo, redes y almacenamiento para que las cargas de trabajo de los usuarios no tengan que hacerlo. Esto ofrece la simplicidad de las Plataformas como Servicio (PaaS) con la flexibilidad de la Infraestructura como Servicio (IaaS) y permite la portabilidad entre proveedores de infraestructura. [1]

Kubernetes no es una Plataforma como Servicio (PaaS) convencional. Ya que Kubernetes opera a nivel del contenedor y no a nivel del hardware, ofrece algunas características que las PaaS también ofrecen, como deployments, escalado, balanceo de carga, registros y monitoreo. Dicho esto, Kubernetes no es monolítico y las soluciones que se ofrecen de forma predeterminada son opcionales e intercambiables. [1]

Kubernetes ofrece los elementos esenciales para construir una plataforma para desarrolladores, preservando la elección del usuario y la flexibilidad en las partes más importantes.

Con ello en mente, Kubernetes:

Existen diversos proveedores que suministran un servicio para crear un clúster de Kubernetes en la nube, entre ellos, por ejemplo: Amazon Web Services (AWS) y su servicio Elastic Kubernetes Service, Google Cloud Platform (GCP) con su servicio de Kubernetes Engine y Azure con su servicio de Azure Kubernetes Service.

En este tutorial vamos a desplegar un clúster de Kubernetes mediante el servicio autoadministrado Google Kubernetes Engine con la configuración Autopilot.

El código de la aplicación lo encuentra en el siguiente repositorio de GitHub

Repositorio

La aplicación es una pequeña API en Python y Flask con dos endpoints.

Endpoint

/<int: delivery_id>

Descripción

Retorna el detalle de un reporte de entrega de un pedido

Método

GET

Retorno

application/json, con la información de un pedido.

Parámetros del Endpoint

delivery_id: Identificador del pedido que se desea recuperar

Endpoint

/

Descripción

Almacena una nueva entrega de un pedido en la base de datos.

Método

POST

Retorno

application/json. Con un diccionario que representa la información de una entrega.

Parámetros del Endpoint

Ninguno.

Acceda a la consola de Google Cloud Platform y habilite la siguiente API: Kubernetes Engine API. Para ello, haga clic en el panel de servicios y seleccione la opción: Kubernetes Engine bajo la categoría de PROCESAMIENTO.

Tan pronto habilite las dos API, estaremos listos para desplegar el clúster de Kubernetes sobre el servicio Google Kubernetes Engine.

Utilice el tutorial de SQL de la semana 1 para desplegar la VPN y la base de datos que se utilizará en este tutorial.

Anote la IP privada y la contraseña generada para la instancia.

Ya con la API activa, vamos a desplegar el clúster mediante la consola de administración web de Google Cloud Platform. Para ello, en el menú de navegación del panel izquierdo seleccione la opción Kubernetes Engine y posteriormente la opción Clústeres.

Seguidamente se desplegará una lista con todos los clústeres que hemos instanciado. Para crear uno nuevo haga clic en la opción Crear y posteriormente seleccione la opción GKE Autopilot. El servicio de Autopilot se encargará de administrar los nodos de trabajos de manera automática dependiendo de las necesidades de carga que se registren. Si desea consultar más información, por favor consulte la referencia [2].

Seguidamente ingrese el nombre del clúster y configúrelo como un clúster público, en este ejemplo emplearemos como nombre de clúster uniandes-misw-cloud-native-k8s. Utilice las configuraciones de red de la segunda imagen.

Utilice una configuración de red con la siguiente información:

Finalmente, haga clic en el botón Crear. Con ello empezará a aprovisionarse el clúster, el tiempo de duración de este proceso es de aproximadamente 10 minutos.

Tan pronto el clúster se encuentre disponible podremos conectarnos a él mediante el SDK de gcloud. Para ello, despliegue el menú de opciones disponible sobre el nombre del clúster que creamos en la actividad anterior y seleccione la opción Conectar. Posteriormente ejecute la instrucción de conexión en la terminal de su máquina haciendo uso del SDK gcloud.

Al ejecutarlo localmente en su terminal debería ver lo siguiente:

gcloud container clusters get-credentials uniandes-misw-cloud-native-k8s --region us-central1 --project misw-tutoriales
Fetching cluster endpoint and auth data.
kubeconfig entry generated for uniandes-misw-cloud-native-k8s.

En diversas ocasiones es requerido configurar secretos y configuraciones que necesitan nuestras aplicaciones para que funcionen correctamente. Estas variables deben ser almacenadas correctamente asegurando atributos de confidencialidad e integridad, evitando así accesos no autorizados que puedan comprometer la seguridad de la infraestructura. En Kubernetes, el almacenamiento de estas variables se realiza mediante el recurso Secreto, el cual corresponde a un llavero con diversas claves cifradas que pueden ser empleadas en la definición de otros recursos como el despliegue.

Nuestra aplicación requiere de la definición de las siguientes variables en el archivo examples/secrets.yaml:

Para crear el secreto use el comando

kubectl apply -f ./examples/secrets.yaml

El secreto recién creado debe aparecer en la lista de ConfigMaps y Secrets en la consola de GCP > Kubernetes Engine.

En el tutorial pasado sobre Container Registry construimos la imagen de contenedor de la aplicación y la almacenamos en un repositorio privado empleando el servicio Artifact Registry. En esta ocasión, vamos a desplegar el contenedor de la aplicación a partir de esa imagen. Para ello, ingrese al servicio Artifact Registry y copie la URI de acceso y el tag de la imagen.

Posteriormente configure el archivo k8s-sservice.yml cambiando el comodín <image> (ubicado en la línea 46) por la URI de su repositorio privado y el tag de la imagen.

Para culminar, construya el despliegue a partir del archivo yml ejecutando la instrucción

kubectl apply -f k8s-service.yml

Este archivo contiene la definición de los contenedores que serán desplegados dentro de un pod así como la definición de los servicios para la comunicación de estos con otras redes y distribución de la carga entrante. Para verificar el estado de un despliegue puede emplear las instrucciones kubectl get pods, kubectl get services y kubectl get deployments.

Importe las pruebas disponibles para Postman mediante el archivo JSON que se encuentra en el repositorio. Posteriormente, defina el valor de la variable server con la IP externa del servicio en el clúster de Kubernetes y ejecute la prueba.

Archivo Postman

Utilice la IP que aparece registrada para el balanceador de carga en la sección de Ingress:

Finalmente, una de las opciones que tenemos disponibles para los despliegues es la posiblidad de configurar reglas de escalamiento horizontal automático basado en métricas de los pods del despliegue. Revise el archivo k8s-service.yml para ver la regla de escalamiento configurada para el despliegue aplicacion-entregas. Para aplicar la regla utilice el siguiente comando:

kubectl apply -f k8s-autoscale.yml

¡Éxitos en el desarrollo del tutorial y nos vemos en una próxima oportunidad!

[1] «Qué es Kubernetes», [Online]. Disponible en:https://kubernetes.io/es/docs/concepts/overview/what-is-kubernetes/ .

[2] «Descripción general de Autopilot | Documentación de Kubernetes Engine | Google Cloud». [Online]. Disponible en:https://cloud.google.com/kubernetes-engine/docs/concepts/autopilot-overview