Conceptos de escalabilidad
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.
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.
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.
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