Concepto: implementación de la aplicación

Completado

Antes de implementar la aplicación en Kubernetes, revisemos implementaciones de Kubernetes y analicemos sus limitaciones en nuestro escenario.

¿Qué son las implementaciones de Kubernetes?

A diagram that shows a Kubernetes Deployment with a label and three pods.

Una implementación de Kubernetes es una evolución de los pods. Las implementaciones encapsulan pods en un objeto inteligente que les permite escalar horizontalmente. Puede duplicar y escalar fácilmente la aplicación para que admita más carga sin necesidad de configurar reglas de red complejas.

Las implementaciones permiten actualizar las aplicaciones sin tiempo de inactividad simplemente cambiando la etiqueta de imagen. La actualización de una implementación desactiva las aplicaciones en línea una a una y las reemplaza por la versión más reciente en lugar de eliminar todas las aplicaciones y crear otras nuevas, lo que significa que la implementación puede actualizar los pods que contiene sin que ello afecte visiblemente a la disponibilidad.

Aunque hay muchas ventajas en el uso de implementaciones en pods, no pueden controlar adecuadamente nuestro escenario.

Este escenario implica una aplicación controlada por eventos que recibe un gran número de eventos en varias ocasiones. Sin un objeto escalador KEDA o HPA, tendría que ajustar manualmente el número de réplicas para procesar el número de eventos y reducir verticalmente la implementación cuando la carga vuelve a la normalidad.

Manifiesto de implementación de ejemplo

Este es un fragmento de código de ejemplo del manifiesto de implementación:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: contoso-microservice
spec:
  replicas: 10                      # Tells K8S the number of pods needed to process the Redis list items
  selector:                         # Define the wrapping strategy
    matchLabels:                    # Match all pods with the defined labels
      app: contoso-microservice     # Labels follow the `name: value` template
  template:                         # Template of the pod inside the deployment
    metadata:
      labels:
        app: contoso-microservice
    spec:
      containers:
        - image: mcr.microsoft.com/mslearn/samples/redis-client:latest
          name: contoso-microservice

En el manifiesto de ejemplo, replicas se establece en 10, que es el número más alto que podemos establecer para las réplicas necesarias disponibles para procesar el número máximo de eventos. Sin embargo, esto hace que la aplicación consuma demasiados recursos durante los periodos de menor actividad, lo que podría dejar sin recursos a otras implementaciones del clúster.

Una solución consiste en usar un HPA independiente para supervisar el uso de CPU de los pods, que es una mejor opción que escalar manualmente en ambas direcciones. Sin embargo, el HPA no se centra en el número de eventos recibidos en la lista de Redis.

La mejor solución es usar KEDA y un escalador de Redis para consultar la lista y determinar si se necesitan más o menos pods para procesar los eventos.