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 suma, el cual fue publicado en el tutorial Container Registry. Por favor realice ese tutorial 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/docs/tasks/tools/

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.

Para este tutorial manejaremos el repositorio de calculadora-numeros usado en los tutoriales pasados, en caso de no tenerlo clonado aún, puede consultarlo en el siguiente enlace. Trabajaremos sobre la rama feature/kubernetes-sum, para ello cambie la rama del repositorio actual al respectivo hash del tag, para hacerlo ejecute en su terminal:

user@192 ~ % git checkout feature/kubernetes-sum

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.

Para la conexión del cluster vamos a utilizar un red virtual de direcciones privadas. Las redes virtuales permiten la comunicación entre los componentes de Kubernetes y otras aplicaciones. Para crear la red utilice el siguiente comando en Cloud Shell.

Para crear una red virtual, el comando se ve de la siguiente forma:

user@192 ~ % gcloud compute networks create <RED> --project=<ID-PROYECTO> --subnet-mode=custom --mtu=<MTU> --bgp-routing-mode=regional

Donde:

  1. Mtu: Corresponde a la unidad de transmisión máxima de una conexión de red, en bytes, del mayor paquete permitido que se puede transferir a través de la conexión.
  2. Bgp-routing-mode: Corresponde al modo de enrutamiento dinámico de una red de VPC, ya sea regional o global.

Para el caso del ejemplo:

user@192 ~ % gcloud compute networks create vpn-tutoriales-misw --project=uandes-native --subnet-mode=custom --mtu=1460 --bgp-routing-mode=regional

Subred para kubernetes

Una subred, o subred, es una pieza segmentada de una red más grande. Más específicamente, las subredes son una partición lógica de una red IP en varios segmentos de red más pequeños. Para crear la subred que se utilizará en el cluster de kubernetes, ejecute el comando:

user@192 ~ % gcloud compute networks subnets create <NOMBRE-SUBRED> --range=<RANGO-IP> --network=<RED-PADRE> --region=<REGION> --project=<ID-PROYECTO>

Para el caso del ejemplo:

user@192 ~ % gcloud compute networks subnets create red-k8s-tutoriales --range=192.168.32.0/19 --network=vpn-tutoriales-misw --region=us-central1 --project=uandes-native

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 se hayan creado. 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 (Recuerde que estas redes se crearon en pasos anteriores) con la siguiente información:

Finalmente, haz 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 ESTABLECER CONEXIÓN. 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:

user@192 ~ % gcloud container clusters get-credentials uniandes-misw-cloud-native-k8s --region us-central1 --project uandes-native

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-service.yml que se encuentra dentro de la carpeta suma cambiando el comodín <image> (ubicado en la línea 38) por la URI de su repositorio privado y el tag de la imagen.

Antes de ejecutarlo, revisemos un poco su configuración.

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

user@192 ~ % 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.

  1. kubectl get pods:

Es un comando que se usa para recuperar información de un clúster de Kubernetes en su máquina local. Esto incluye todos los pods, implementaciones, servicios y ReplicationControllers.

user@192 ~ % kubectl get pods
W1112 16:21:42.982225    9346 gcp.go:120] WARNING: the gcp auth plugin is deprecated in v1.22+, unavailable in v1.25+; use gcloud instead.
To learn more, consult https://cloud.google.com/blog/products/containers-kubernetes/kubectl-auth-changes-in-gke
NAME                                   READY   STATUS    RESTARTS   AGE
suma-7d9454d9f5-x2bqc   1/1     Running   0          6m57s
  1. kubectl get services

Este comando muestra información asociada a los pods y el despliegue en sí de los servicios, puede ver información como la IP del cluster, el tipo de servicio, puertos, etc.

user@192 ~ % kubectl get services
W1112 16:22:40.238125    9366 gcp.go:120] WARNING: the gcp auth plugin is deprecated in v1.22+, unavailable in v1.25+; use gcloud instead.
To learn more, consult https://cloud.google.com/blog/products/containers-kubernetes/kubectl-auth-changes-in-gke
NAME                       TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)        AGE
suma                       LoadBalancer   192.168.73.177   

34.172.15.158

   80:31632/TCP   32m
kubernetes                 ClusterIP      192.168.72.1     <none>           443/TCP        5h16m
  1. kubectl get deployments.

Este comando muestra información acerca de los despliegues, número de pods disponibles y cuantos de estos están corriendo, entre otros datos relevantes.

user@192 ~ % kubectl get deployments
W1112 16:23:57.990528    9399 gcp.go:120] WARNING: the gcp auth plugin is deprecated in v1.22+, unavailable in v1.25+; use gcloud instead.
To learn more, consult https://cloud.google.com/blog/products/containers-kubernetes/kubectl-auth-changes-in-gke
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
Suma                  1/1     1            1           9m12s

Si desea leer mas al respecto consulte el siguiente link https://kubernetes.io/docs/reference/kubectl/

En caso de errores con el despliegue revise el estado de sus pods con los comandos

user@192 ~ % kubectl describe pod <nombre del pod>
user@192 ~ % kubectl logs <nombre del pod> --all-containers
user@192 ~ % kubectl get events

Note que al ejecutar el comando kubectl get services, se obtuvo una IP externa, esta corresponde al balanceador de carga que es el punto de entrada a los pods contenidos dentro del cluster. En el caso del ejemplo corresponde a 34.172.15.158, corriendo en el puerto 80. Para probar que el despliegue está funcionando, identifique su IP externa y reemplazarla en el siguiente curl:

user@192 ~ % curl --location --request POST 'http://<IP-BALANCEADOR>:<PUERTO>/suma' \
--header 'Content-Type: application/json' \
--data-raw '{
    "num_1": 399,
    "num_2": 1
}'

Para el caso del ejemplo corresponde a:

user@192 ~ % curl --location --request POST 'http://34.172.15.158:80/suma' \
--header 'Content-Type: application/json' \
--data-raw '{
    "num_1": 399,
    "num_2": 1
}'

Obteniendo el resultado:

{
    "message": "Estudiante la suma de los dos numeros es: 400",
    "result": 400
}

Puede observar el despliegue, entrando a la consola de GCP en el servicio Kubernetes Engine > Cargas de trabajo

¡É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