Ejecutando múltiples instancias de la aplicación
Objetivos
- Escalar una aplicación usando kubectl.
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:
- NAME muestra los nombres de los Deployments en el clúster.
- READY muestra la relación de réplicas CURRENT / DESIRED
- UP-TO-DATE muestra el número de réplicas que se han actualizado para lograr el estado deseado.
- AVAILABLE muestra cuántas réplicas de la aplicación están disponibles para sus usuarios.
- AGE muestra la cantidad de tiempo que la aplicación ha estado en funcionamiento.
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:
- DESIRED muestra el número de réplicas deseadas de la aplicación, que define cuando crea el Deployment. Este es el estado deseado.
- CURRENT muestra cuántas réplicas se están ejecutando actualmente.
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.