Ejecutando múltiples instancias de la aplicación

Objetivos

Escalar una aplicación

Anteriormente creamos un Deployment, y luego lo expusimos públicamente a través de un Service. El Deployment creó solo un Pod para ejecutar nuestra aplicación. Cuando el tráfico aumenta, deberemos escalar la aplicación para mantenerse a la par con la demanda de los usuarios.

Si no ha trabajado en las secciones anteriores, comience desde Usar KIND para crear un clúster.

El escalado se logra cambiando el número de réplicas en un Deployment.

Introducción al escalado

Escalar un Deployment asegurará que se creen nuevos Pods y se programen en Nodos con recursos disponibles. El escalado aumentará el número de Pods al nuevo estado deseado. Kubernetes también admite el escalado automático de Pods, pero está fuera del alcance de este tutorial. También es posible escalar a cero, y terminará todos los Pods del Deployment especificado.

Ejecutar múltiples instancias de una aplicación requerirá una forma de distribuir el tráfico a todos ellos. Los Services tienen un balanceador de carga integrado que distribuirá el tráfico de red a todos los Pods de un Deployment expuesto. Los Services monitorearán continuamente los Pods en ejecución usando endpoints, para asegurar que el tráfico se envíe solo a los Pods disponibles.

Una vez que tenga varias instancias de una aplicación en ejecución, podrá realizar actualizaciones sin interrupciones. Cubriremos eso en la siguiente sección del tutorial. Ahora, vayamos a la terminal y escalaremos nuestra aplicación.

Escalando un Deployment

Para listar los deployments use el subcomando get deployments: kubectl get deployments

La salida debería ser similar a:

    NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
    kubernetes-bootcamp   1/1     1            1           11m

Este comando muestra:

Para ver el ReplicaSet creado por el Deployment, ejecute kubectl get rs

Notemos que el nombre del ReplicaSet siempre está formateado como [DEPLOYMENT-NAME]-[RANDOM-STRING]. La cadena aleatoria se genera al azar y usa el pod-template-hash como semilla.

Dos columnas importantes de esta salida son:

A continuación, escalaremos el Deployment a 4 réplicas. Usaremos el comando kubectl scale, seguido del tipo de implementación, nombre y número deseado de instancias:

kubectl scale deployments/kubernetes-bootcamp --replicas=4

Para listar nuevamente los Deployments, usaremos get deployments:

kubectl get deployments

El cambio se aplicó y tenemos 4 instancias de la aplicación disponibles. A continuación, verificaremos si el número de Pods cambió:

kubectl get pods -o wide

Ahora hay 4 Pods, con diferentes direcciones IP. El cambio se registró en el registro de eventos de implementación. Para verificar eso, use el subcomando describe:

kubectl describe deployments/kubernetes-bootcamp

Podemos ver en la salida de este comando que ahora hay 4 réplicas.

Balanceo de carga

Comprobemos que el Service está balanceando la carga del tráfico. Para averiguar la IP y el puerto expuestos, podemos usar describe services como aprendimos en la parte anterior del tutorial:

kubectl describe services/kubernetes-bootcamp

Crearemos una variable de entorno llamada NODE_PORT que tenga como valor el puerto en el nodo:

export NODE_PORT="$(kubectl get services/kubernetes-bootcamp -o jsonpath='{.spec.ports[].nodePort}')"

echo "NODE_PORT=$NODE_PORT"

export NODE_IP="$(kubectl get nodes/cluster-prueba-worker -o jsonpath='{.status.addresses[0].address}')"

echo "NODE_IP=$NODE_IP"

A continuación, haremos un curl a la dirección IP y al puerto expuestos. Ejecute el comando varias veces:

curl "http://$NODE_IP:$NODE_PORT"

Nos conectamos a un Pod diferente con cada solicitud. Esto demuestra que el balanceo de carga está funcionando.

Escalado hacia abajo

Para escalar hacia abajo el Deployment a 2 réplicas, ejecute nuevamente el subcomando scale:

kubectl scale deployments/kubernetes-bootcamp --replicas=2

Liste los Deployments para verificar si el cambio se aplicó con el subcomando get deployments:

kubectl get deployments

El número de réplicas disminuyó a 2. Enumere el número de Pods, con get pods:

kubectl get pods -o wide

Esto nos confirma que 2 Pods fueron terminados.

Cuando esté listo, continúe con Realizar una actualización gradual.