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/

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/scale-pods, para ello cambie la rama del repositorio actual a la respectiva rama, para hacerlo ejecute en su terminal:

user@192 ~ % git checkout feature/scale-pods

Si ya se encuentra en esta rama, haga caso omiso al comando presentado anteriormente.

El escalamiento horizontal consiste en potenciar el rendimiento del sistema desde un aspecto de mejora global, a diferencia de aumentar la potencia de una única máquina. Este tipo de escalabilidad se basa en la modularidad de su funcionalidad.

En el caso que no tenga ejecutando la aplicación de suma en su cluster, acceda al archivo k8s-service.yml de la carpeta suma y modifique la uri de la imagen de la aplicación suma y ejecute el despliegue sobre su infraestructura.

user@192 ~ % kubectl apply -f k8s-service.yml

Valide cuantos pods están corriendo en el cluster que hemos creado, si se ejecuta el siguiente comando dentro del proyecto de calculadora:

user@192 ~ % kubectl get pods

podrá ver lo siguiente:

NAME                            READY   STATUS    RESTARTS   AGE
suma-8696dbb58-jrkvm            1/1     Running   0          6s

Como puede ver, por defecto tenemos un solo pod corriendo, en caso de una mayor carga y que el pod deba atender más solicitudes, se hará menester escalar para poder corresponder la operación.

Para escalar el cluster manualmente a 2 instancias, ejecute el siguiente comando:

user@192 ~ % kubectl scale deployment suma --replicas=2

Podrá obtener como respuesta:

deployment.apps/suma scaled

Ejecute nuevamente el comando kubectl get pods podrá obtener como respuesta:

user@192 ~ % kubectl get pods
NAME                             READY   STATUS    RESTARTS   AGE
suma-8696dbb58-jrkvm            1/1     Running   0          92s
suma-8696dbb58-l4s5r            1/1     Running   0          19s

Si se fija ahora hay dos pods corriendo, estos reciben tráfico cuando los request pasan por el balanceador de carga. Si va a la sección de ingress y servicios, en la sección de Pods activos puede validar que hay dos pods corriendo actualmente.

A modo de ejemplo escalaremos el cluster a 10 pods, el comando se ve de la siguiente forma:

user@192 ~ % kubectl scale deployment suma -–replicas=10

Ejecute nuevamente el comando kubectl get pods podrá obtener como respuesta:

user@192 ~ % kubectl get pods
NAME                            READY   STATUS    RESTARTS   AGE
suma-8696dbb58-258zk            0/1     ContainerCreating   0          3s
suma-8696dbb58-6z6mj            0/1     ContainerCreating   0          3s
suma-8696dbb58-9c7nw            0/1     Pending             0          2s
suma-8696dbb58-d974k            0/1     Pending             0          3s
suma-8696dbb58-h2ddz            0/1     ContainerCreating   0          3s
suma-8696dbb58-hzxtj            0/1     ContainerCreating   0          3s
suma-8696dbb58-jrkvm            1/1     Running             0          5m44s
suma-8696dbb58-l4s5r            1/1     Running             0          4m31s
suma-8696dbb58-np6c7            0/1     Pending             0          2s
suma-8696dbb58-xj627            0/1     ContainerCreating   0          2s

Ejecutar kubectl scale es una operación imperativa que tiene un efecto directo en su clúster. De esta forma, está instruyendo a Kubernetes para que suministre una cantidad específica de réplicas lo antes posible. Los cambios en los recuentos de réplicas deben ser en respuesta a eventos específicos, como la congestión que hace que las solicitudes se ejecuten lentamente o se eliminen. Lo mejor es analizar la capacidad de su servicio actual, evite escalar su aplicación con demasiada frecuencia, ya que cada operación puede causar demoras mientras se programan y finalizan los pods.

Desescalando (Imperativo)

Si basado en las métricas de los recursos ve que su aplicación tiene cierta holgura y puede ahorrar pods (esto viene con reducción en costos) en la operación, puede escalar hacia abajo. En el ejemplo anterior escalamos a 10 pods, bajaremos a 1 pod en el cluster. Mediante el mismo comando presentadora anteriormente:

user@192 ~ % kubectl scale deployment suma -–replicas=1

Note cómo indicamos el valor de 1 en las réplicas de escalamiento. Ejecute nuevamente el comando kubectl get pods podrá obtener como respuesta:

user@192 ~ % kubectl get pods
NAME                            READY   STATUS    RESTARTS   AGE
suma-8696dbb58-l4s5r            1/1     Running   0          6m

Puede ejecutar kubectl scale --replicas=0, esto eliminará todos los contenedores de los objetos seleccionados, deteniendo la aplicación. Puede volver a escalar repitiendo el comando con un valor positivo.

Otra de las opciones que tenemos disponibles para los despliegues es la posibilidad de configurar reglas de escalamiento horizontal en archivos yaml de forma declarativa. En el archivo k8s-autoescale.yml de la misma carpeta suma. en el podrá ver la regla de escalamiento configurada para el despliegue suma.

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: suma-autoscaler
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: suma
  minReplicas: 5
  maxReplicas: 10
  targetCPUUtilizationPercentage: 50

Allí se ven datos como:

Para aplicar la regla de escalamiento del archivo utilice el siguiente comando:

user@192 ~ % kubectl apply -f k8s-autoscale.yml

Podrá observar lo siguiente:

user@192 ~ % kubectl apply -f k8s-autoscale.yml
horizontalpodautoscaler.autoscaling/suma-autoscaler created

Una vez corra el archivo k8s-autoescale.yml kubectl diferenciará automáticamente los cambios y tomará medidas para evolucionar el estado de su clúster hacia lo que se declara en el archivo.

Ejecute nuevamente el comando kubectl get pods podrá obtener como respuesta:

user@192 ~ % kubectl get pods
NAME                            READY   STATUS    RESTARTS   AGE
suma-8696dbb58-78tsw            0/1     ContainerCreating   0          1s
suma-8696dbb58-l4s5r            1/1     Running             0          13m
suma-8696dbb58-m9kjx            0/1     ContainerCreating   0          1s
suma-8696dbb58-nr9jm            0/1     ContainerCreating   0          0s
suma-8696dbb58-q8hkn            0/1     ContainerCreating   0          1s

Podrá observar cómo se cumple el valor minReplicas seteado en el archivo de autoescalamiento. Recuerde escalar abajo cuando termine de experimentar para evitar el consumo de recursos adicionales.

Desescalando (Declarativo)

Cambie el archivo k8s-autoescale.yml e indique un valor mínimo de 1 réplica de un máximo de 1. El archivo de debe ver de la siguiente forma:

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: suma-autoscaler
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: suma
  minReplicas: 1
  maxReplicas: 1
  targetCPUUtilizationPercentage: 50

Si ejecuta nuevamente el comando kubectl get pods podrá observar como un solo pod está levantado luego del escalamiento hacia abajo. Puede validarlo en la consola de GCP.

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

[3] Using kubectl scale: Tutorial and best practices (no date) RSS. Disponible en: https://www.containiq.com/post/kubectl-scale#:~:text=The%20kubectl%20scale%20command%20is%20an%20imperative%20mechanism%20for%20scaling,number%20of%20pods%20are%20running. (Accessed: November 22, 2022).