Conceptos de escalabilidad

Completado

Antes de encontrar una solución de escalado, debe comprender qué es la escalabilidad y cómo se aplica a las aplicaciones de Kubernetes.

En esta unidad, revisamos algunos conceptos de escalabilidad.

Escalabilidad

La escalabilidad describe la capacidad de una aplicación o sistema para controlar una cantidad creciente de trabajo agregando más recursos a ella.

En nuestro escenario de ejemplo, la cantidad de trabajo que experimenta un aumento es el número de solicitudes de los clientes. La cantidad de recursos agregados se puede representar de dos maneras: escalabilidad vertical y escalabilidad horizontal.

Escalabilidad vertical

La escalabilidad vertical, o el escalado vertical se refiere al escalado de un sistema agregando más recursos físicos, como la memoria o la potencia de CPU. Por ejemplo, si el sitio web de la empresa consume demasiada memoria, puede actualizar la instancia de la máquina virtual para que incluya más memoria y mantener al mismo tiempo la misma aplicación subyacente.

Vertical scaling diagram.

En resumen, el escalado vertical implica aumentar el tamaño de la máquina virtual, a la vez que mantiene el mismo número de aplicaciones. Este enfoque es útil si tiene aplicaciones monolíticas que requieren una gran cantidad de potencia de proceso, pero son demasiado costosas para dividirse en partes más pequeñas. Estas aplicaciones se hospedan principalmente en máquinas virtuales en lugar de en sistemas distribuidos.

A pesar de tener un coste más razonable, las máquinas virtuales muy grandes pueden resultar muy caras. El coste de agregar más potencia de proceso es mayor que el de duplicar máquinas virtuales pequeñas. Hay un límite superior en cuanto al número de recursos que se pueden agregar a una sola máquina virtual, lo que significa que llegará un momento, cuando se alcance ese límite, en el que deberá duplicar la máquina virtual.

La escalabilidad horizontal

La escalabilidad horizontal o el escalado horizontal se refiere al escalado de un sistema duplicando la aplicación y equilibrando la carga entre las instancias de la aplicación.

Horizontal scaling diagram.

Escalar horizontalmente es útil para las aplicaciones distribuidas, como las implementadas en AKS y los sistemas sin estado, ya que puede poner en marcha varios contenedores con la misma aplicación en una sola máquina virtual. El escalado horizontal permite extraer la mayoría de los recursos mientras paga por una sola máquina virtual.

En nuestro escenario de ejemplo, el sitio de la empresa no tiene estado. Esto significa que el escalado horizontal es la mejor opción. Kubernetes proporciona un recurso predefinido denominado HorizontalPodAutoscaler (HPA) que permite escalar horizontalmente las implementaciones.

Escalabilidad manual en Kubernetes

Antes de tratar el HPA, vamos a revisar cómo escalar manualmente una aplicación de Kubernetes.

Cada implementación está enlazada a otro recurso denominado ReplicaSet. ReplicaSet es responsable de mantener un "estado de réplica deseado" y de escalar o reducir la aplicación real horizontalmente para mantener el estado deseado igual que el estado real. Puede controlar el número de réplicas de una implementación a través de la clave spec.replicas en la especificación de implementación. Esta clave establece el número de réplicas deseadas en el ReplicaSet subyacente y obliga al controlador de replicación a mantener este número de réplicas en cualquier momento.

También puede controlar el número de réplicas de una implementación con el comando kubectl scale deploy/contoso-website --replicas <number>. Este comando cambia de forma dinámica el número de réplicas deseadas en una implementación y escala o reduce verticalmente la aplicación.

HorizontalPodAutoscaler (HPA)

El HPA es el recurso nativo de Kubernetes 1.8 y versiones superiores que proporciona escalabilidad horizontal a los pods del clúster. Supervisa la API de métricas cada 30 segundos para detectar algún cambio en el recuento de réplicas deseado. Si el recuento de réplicas deseado es diferente del recuento de réplicas actual, el administrador de controladores, que administra los objetos HPA, escala o reduce horizontalmente la implementación.

HorizontalPodAutoscaling design diagram.

Los HPA funcionan con el grupo de API autoscaling de Kubernetes. Hay dos versiones de este grupo de API: v1 y v2. La versión v1 permite que la implementación se escale solo en función de las métricas de CPU. La versión v2 permite la supervisión nativa de la CPU y la memoria. En este módulo, se usa la versión v2.

Cada atributo HPA se asocia a una referencia de escala, que se define en la clave spec.scaleTargetRef del manifiesto de HPA. Esta referencia de escala debe tener los pods subyacentes que se van a escalar; de lo contrario, el HPA no funcionará, porque no es posible aplicar escalado a objetos que no se pueden escalar, como los DaemonSets.

Es importante que cada pod tenga una solicitud de recursos establecida en su especificación. El algoritmo HPA no puede calcular correctamente las métricas y determinar el uso de recursos sin esta configuración. Puede establecer esta limitación a través de la clave spec.template.spec.containers[].resources en el manifiesto de implementación, como se muestra en el ejemplo siguiente:

spec:
  template:
    spec:
      containers:
        - resources:
            requests:
              cpu: 250m
              memory: 256M
            limits:
              cpu: 500m
              memory: 512M

Ejemplo de manifiesto de HPA

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-apache
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

Comprobación de conocimientos

1.

¿Qué es el escalado horizontal?

2.

¿Por qué es importante tener una solicitud de recursos establecida en los pods vinculados a un HPA?

3.

¿Por qué es menos recomendable el escalado vertical para las aplicaciones sin estado?