Usar el escalado automático de clústeres en Azure Kubernetes Service (AKS)

Para satisfacer las necesidades de la aplicación en AKS, es posible que deba ajustar el número de nodos que ejecutan las cargas de trabajo. El componente de escalado automático de clústeres supervisa los pods del clúster que no pueden programarse debido a las restricciones de los recursos. Cuando la escalabilidad automática de clústeres detecta problemas, escala verticalmente el número de nodos del grupo de nodos para satisfacer las necesidades de la aplicación. También comprueba periódicamente si hay nodos infrautilizados y los elimina cuando las cargas de trabajo pueden reasignarse de forma segura y se cumplen las condiciones para reducir la escala.

En este artículo, se muestra cómo habilitar y administrar el escalador automático de clústeres en AKS, que se basa en la versión de código abierto de Kubernetes.

Antes de empezar

En este artículo se necesita la CLI de Azure versión 2.0.76 o posterior. Ejecute az --version para encontrar la versión. Si necesita instalarla o actualizarla, vea Instalación de la CLI de Azure.

Habilitación o deshabilitación del escalador automático de clústeres en un clúster

Importante

El escalador automático del clúster es un componente de Kubernetes. Aunque el clúster de AKS usa Virtual Machine Scale Sets para los nodos, no habilite ni edite manualmente la configuración para el escalado automático del conjunto de escalado. Permita que el escalador automático del clúster de Kubernetes administre la configuración del escalado necesaria. Para más información, consulte ¿Puedo modificar los recursos de AKS en el grupo de recursos del nodo?

Habilitación del escalador automático de clústeres en un nuevo clúster

  1. Cree un grupo de recursos con el comando az group create.

    az group create --name myResourceGroup --location eastus
    
  2. Cree un clúster de AKS mediante el comando az aks create, y habilite y configure el escalador automático de clústeres en el grupo de nodos para el clúster mediante el parámetro --enable-cluster-autoscaler y especifique un nodo --min-count y --max-count. El siguiente comando de ejemplo crea un clúster con un único nodo respaldado por un conjunto de escalado de máquinas virtuales, habilita el escalador automático del clúster, establece un mínimo de uno y un máximo de tres nodos:

    az aks create \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --node-count 1 \
    --vm-set-type VirtualMachineScaleSets \
    --load-balancer-sku standard \
    --enable-cluster-autoscaler \
    --min-count 1 \
    --max-count 3 \
    --generate-ssh-keys
    

    Tardará unos minutos en crear el clúster y configurar las opciones del escalado automático de clústeres.

Habilitación del escalador automático de clústeres en los tres grupos de nodos

Actualice un clúster existente mediante el comando az aks update, y habilite y configure el escalador automático de clústeres en el grupo de nodos mediante el parámetro --enable-cluster-autoscaler y especifique un nodo --min-count y --max-count. En el siguiente comando de ejemplo, se actualiza un clúster de AKS existente para habilitar el escalador automático de clústeres en el grupo de nodos para el clúster y se establece un mínimo de uno y un máximo de tres nodos:

az aks update \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --enable-cluster-autoscaler \
    --min-count 1 \
    --max-count 3

Tardará unos minutos en actualizar el clúster y configurar las opciones del escalador automático de clústeres.

Deshabilitación del escalador automático de clústeres en un clúster

Deshabilite el escalador automático de clústeres mediante el comando az aks update y el parámetro --disable-cluster-autoscaler.

az aks update \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --disable-cluster-autoscaler

Los nodos no se quitan cuando se deshabilita el escalado automático de clústeres.

Nota

Puede escalar manualmente el clúster después de deshabilitar el escalador automático de clústeres mediante el comando az aks scale. Si usa el escalado automático horizontal de pods, continúa ejecutándose con el escalado automático de clústeres deshabilitado, pero es posible que los pods no puedan programarse si todos los recursos de nodo están en uso.

Rehabilitación del escalador automático de clústeres en un clúster

Puede volver a habilitar el escalador automático de clústeres en un clúster existente mediante el comando az aks update y al especificar los parámetros --enable-cluster-autoscaler, --min-count y --max-count.

Habilitación o deshabilitación del escalador automático del clúster en grupos de nodos

Uso del escalador automático de clústeres en varios grupos de nodos

Puede usar el escalador automático de clústeres con varios grupos de nodos y puede habilitar el escalador automático de clústeres en cada grupo de nodos individuales y pasarles reglas de escalabilidad automática únicas.

Actualice la configuración de un grupo de nodos existente mediante el comando az aks nodepool update.

az aks nodepool update \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name nodepool1 \
    --update-cluster-autoscaler \
    --min-count 1 \
    --max-count 5

Deshabilitación del escalador automático de clústeres en un grupo de nodos

Deshabilite el escalador automático de clústeres en un grupo de nodos mediante el comando az aks nodepool update y el parámetro --disable-cluster-autoscaler.

az aks nodepool update \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name nodepool1 \
    --disable-cluster-autoscaler

Volver a habilitar el escalador automático de clústeres en un grupo de nodos

Puede volver a habilitar el escalador automático de clústeres en un grupo de nodos mediante el comando az aks nodepool update y especificando los parámetros --enable-cluster-autoscaler, --min-count y --max-count.

Nota

Si tiene previsto usar el escalador automático de clústeres con grupos de nodos que abarcan varias zonas y aprovechar las características de programación relacionadas con zonas, por ejemplo, la programación topológica de volumen, se recomienda tener un grupo de nodos por zona y habilitar --balance-similar-node-groups mediante el perfil del escalador automático. Esto garantiza que el escalador automático se pueda escalar verticalmente de manera correcta y mantener equilibrados los tamaños de los grupos de nodos.

Actualización de la configuración del escalador automático de clústeres

A medida que las necesidades de la aplicación van cambiando, es posible que deba ajustar el número de nodos del escalado automático de clústeres de forma eficiente.

Cambie el número de nodos mediante el comando az aks update y actualice el escalador automático de clústeres mediante el parámetro --update-cluster-autoscaler y especifique el nodo actualizado --min-count y --max-count.

az aks update \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --update-cluster-autoscaler \
    --min-count 1 \
    --max-count 5

Nota

El escalador automático de clústeres aplica el número mínimo en los casos en los que el número real cae por debajo del mínimo debido a factores externos, como durante una expulsión de acceso puntual o al cambiar el valor de recuento mínimo de la API de AKS.

Uso del perfil del escalador automático de clústeres

Puede configurar detalles más pormenorizados del escalador automático de clúster si cambia los valores predeterminados en el perfil del escalador automático para todo el clúster. Por ejemplo, se produce un evento de reducción vertical una vez que los nodos se infrautilizan después de 10 minutos. Si tiene cargas de trabajo que se ejecutan cada 15 minutos, puede que quiera cambiar el perfil del escalador automático para reducir verticalmente los nodos infrautilizados después de 15 o 20 minutos. Cuando se habilita el escalador automático del clúster, se usa un perfil predeterminado a menos que se especifiquen otros valores.

Importante

El perfil del escalador automático de clústeres afecta a todos los grupos de nodos que usan el escalador automático de clústeres. No se puede establecer un perfil del escalador automático por grupo de nodos. Al establecer el perfil, los grupos de nodos existentes con el escalador automático de clústeres habilitado comienzan a usar el perfil de inmediato.

Configuración del perfil del escalador automático de clústeres

En la tabla siguiente se enumeran las opciones de configuración disponibles para el perfil del escalador automático de clústeres:

Configuración Descripción Valor predeterminado
scan-interval La frecuencia con la que se vuelve a evaluar el clúster para escalar o reducir verticalmente. 10 segundos
scale-down-delay-after-add Cuánto tiempo después del escalado vertical se reanuda la evaluación de la reducción horizontal. 10 minutos
scale-down-delay-after-delete Cuánto tiempo después de la eliminación del nodo se reanuda la evaluación de la reducción horizontal. scan-interval
scale-down-delay-after-failure Cuánto tiempo después de la reducción vertical se reanuda la evaluación de la reducción horizontal. Tres minutos
scale-down-unneeded-time Cuánto tiempo debe ser innecesario un nodo antes de que sea válido para la reducción vertical. 10 minutos
scale-down-unready-time Cuánto tiempo debe ser innecesario un nodo no listo antes de que sea válido para la reducción vertical. 20 minutos
ignore-daemonsets-utilization Si se omitirán los pods DaemonSet al calcular el uso de recursos para reducir verticalmente. false
daemonset-eviction-for-empty-nodes Si los pods DaemonSet se finalizarán correctamente desde nodos vacíos. false
daemonset-eviction-for-occupied-nodes Si los pods DaemonSet se finalizarán correctamente desde nodos que no estén vacíos. true
scale-down-utilization-threshold Valor máximo entre la suma de las solicitudes de CPU y la suma de las solicitudes de memoria de todos los pods que se ejecutan en el nodo, dividido por el recurso asignable correspondiente del nodo, por debajo del cual se puede considerar un nodo para reducción de escala. 0,5
max-graceful-termination-sec Número máximo de segundos que el escalador automático del clúster espera la terminación del pod al intentar reducir verticalmente un nodo. 600 segundos
balance-similar-node-groups Detecta grupos de nodos similares y equilibra el número de nodos entre ellos. false
expander El tipo de grupo de nodos expander que se va a usar en el escalado vertical. Los valores posibles incluyen most-pods, random, least-waste y priority. random
skip-nodes-with-local-storage Si es true, el escalador automático de clústeres no elimina nodos con pods con almacenamiento local, por ejemplo, EmptyDir o HostPath. false
skip-nodes-with-system-pods Si es true, el escalador automático de clústeres no elimina los nodos con pods de kube-system (excepto para DaemonSet o mirror). true
max-empty-bulk-delete Número máximo de nodos vacíos que se pueden eliminar al mismo tiempo. 10 nodos
new-pod-scale-up-delay En escenarios como la escala de ráfagas y lotes en los que no quiere que la CA actúe antes de que el programador de Kubernetes programe todos los pods, puede indicarle a la CA que ignore los pods no programados antes de que tengan una antigüedad concreta. 0 segundos
max-total-unready-percentage Porcentaje máximo de nodos no leídos en el clúster. Una vez que se haya superado este porcentaje, la CA detiene las operaciones. 45 %
max-node-provision-time Tiempo máximo que la escalabilidad automática espera a que se aprovisione un nodo. 15 minutos
ok-total-unready-count El número de nodos no leídos permitidos, con independencia del valor de max-total-unready-percentage. Tres nodos

Nota

Los parámetros ignore-daemonsets-utilization, daemonset-eviction-for-empty-nodes y daemonset-eviction-for-occupied-nodes están en disponibilidad general a partir de la versión 2024-05-01 de la API.

Establecimiento del perfil del escalador automático de clústeres en un nuevo clúster

Cree un clúster de AKS mediante el comando az aks create y establezca el perfil de escalador automático de clústeres mediante el parámetro cluster-autoscaler-profile.

az aks create \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --node-count 1 \
    --enable-cluster-autoscaler \
    --min-count 1 \
    --max-count 3 \
    --cluster-autoscaler-profile scan-interval=30s \
    --generate-ssh-keys

Establecimiento del perfil del escalador automático de clústeres en un clúster existente

Establezca el escalador automático de clústeres en un clúster existente mediante el comando az aks update y el parámetro cluster-autoscaler-profile. En el ejemplo siguiente, se configura el valor de intervalo de detección como 30 s:

az aks update \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --cluster-autoscaler-profile scan-interval=30s

Configuración del perfil del escalador automático de clústeres para reducir verticalmente de forma agresiva

Nota

No se recomienda reducir verticalmente de forma agresiva los clústeres que experimentan escalado horizontal y reducción horizontal frecuentes en intervalos cortos, ya que podría dar lugar a tiempos de aprovisionamiento de nodos extendidos en estas circunstancias. Aumentar scale-down-delay-after-add puede ayudar en estas circunstancias al mantener el nodo más tiempo para controlar las cargas de trabajo entrantes.

El siguiente comando configura un perfil de reducción vertical agresivo. Examina el clúster cada 30 segundos, reanuda la evaluación de reducción de escala inmediatamente después de añadir un nodo y un minuto después de un fallo, hace que los nodos innecesarios y no preparados puedan optar a la reducción de escala después de tres minutos, limita la terminación ordenada a 30 segundos, permite eliminar hasta 1.000 nodos vacíos de una sola vez y aumenta los límites de nodos no preparados al 100 % o 1.000 nodos. También conserva explícitamente el comportamiento predeterminado de no omitir nodos con almacenamiento local y esperar hasta 15 minutos para que se aprovisione un nodo.

az aks update \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --cluster-autoscaler-profile scan-interval=30s,scale-down-delay-after-add=0m,scale-down-delay-after-failure=1m,scale-down-unneeded-time=3m,scale-down-unready-time=3m,max-graceful-termination-sec=30,skip-nodes-with-local-storage=false,max-empty-bulk-delete=1000,max-total-unready-percentage=100,ok-total-unready-count=1000,max-node-provision-time=15m

Configuración del perfil del escalador automático de clústeres para cargas de trabajo en ráfagas

El siguiente comando configura un perfil para cargas de trabajo con picos de actividad. Examina el clúster cada 20 segundos, pausa la evaluación de reducción durante 10 minutos después de añadir un nodo para mantener capacidad para los picos de demanda entrantes, reanuda la evaluación un minuto después de un fallo, hace que los nodos innecesarios y no preparados puedan reducirse después de cinco minutos, limita la terminación ordenada a 30 segundos, permite eliminar hasta 100 nodos vacíos a la vez y eleva los límites de nodos no preparados al 100 % o 1.000 nodos. También conserva explícitamente el comportamiento predeterminado de no omitir nodos con almacenamiento local y esperar hasta 15 minutos para que se aprovisione un nodo.

az aks update \
    --resource-group "myResourceGroup" \
    --name myAKSCluster \
    --cluster-autoscaler-profile scan-interval=20s,scale-down-delay-after-add=10m,scale-down-delay-after-failure=1m,scale-down-unneeded-time=5m,scale-down-unready-time=5m,max-graceful-termination-sec=30,skip-nodes-with-local-storage=false,max-empty-bulk-delete=100,max-total-unready-percentage=100,ok-total-unready-count=1000,max-node-provision-time=15m

Restablecimiento del perfil de escalador automático del clúster a los valores predeterminados

Restablezca el perfil del escalador automático de clústeres mediante el comando az aks update.

az aks update \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --cluster-autoscaler-profile ""

Uso de ProvisioningRequest con el escalador automático del clúster

ProvisioningRequest es un recurso personalizado que puede usar para solicitar recursos para un grupo de pods relacionados. El escalador automático del clúster considera estos pods como una sola unidad. En función de la clase de aprovisionamiento especificada, el escalador automático del clúster puede reservar recursos existentes para los pods o ampliar el clúster.

Nota

  • ProvisioningRequest La compatibilidad requiere un clúster de AKS que ejecute Kubernetes versión 1.33 o posterior.
  • Considere la posibilidad de usar un perfil agresivo de reducción al usar ProvisioningRequest para que los nodos no utilizados de los aumentos de escala parciales o no completados se eliminen rápidamente.
Clase de aprovisionamiento Descripción
check-capacity.autoscaling.x-k8s.io Comprueba si el clúster tiene suficientes recursos para los pods especificados. Si los recursos están disponibles, el escalador automático del clúster los reserva para el ProvisioningRequest durante 10 minutos para evitar que otros ProvisioningRequests reclamen esos mismos recursos.
best-effort-atomic-scale-up.autoscaling.x-k8s.io El escalador automático del clúster hace todo lo posible por aprovisionar todos los recursos solicitados en una sola operación de ampliación. Si no puede aprovisionarlo todo, el ProvisioningRequest falla y el escalador automático del clúster lo vuelve a intentar tras un periodo de espera.

Para obtener un ejemplo completo que muestre la integración de Kueue con el escalador automático del clúster y ProvisioningRequest, consulte Configuración de Kueue con el escalador automático de clústeres en AKS.

Recuperación de registros y estado del escalador automático del clúster

Puede recuperar las actualizaciones de registros y estado del escalador automático de clústeres para ayudar a diagnosticar y depurar los eventos del escalador automático. AKS administra el escalador automático del clúster en su nombre y lo ejecuta en el plano de control administrado. Para recopilar los registros del plano de control, cree una configuración de diagnóstico de Azure Monitor para el clúster de AKS en el portal de Azure o use az monitor diagnostic-settings create y habilite la categoría de registro cluster-autoscaler.

  1. Configure una regla de registros de recursos para que envíen los registros del escalador automático de clústeres a Log Analytics siguiendo las instrucciones de Configurar la recopilación de registros de recursos para el plano de control de AKS. Asegúrese de activar la casilla correspondiente a cluster-autoscaler al seleccionar las opciones para Registros.

  2. Seleccione la sección Registros del clúster.

  3. Si la configuración de diagnóstico usa el modo de diagnóstico de Azure, escriba la siguiente consulta en Log Analytics:

    AzureDiagnostics
    | where Category == "cluster-autoscaler"
    

    Si la configuración de diagnóstico usa el modo específico del recurso, escriba la consulta siguiente en su lugar:

    AKSControlPlane
    | where Category == "cluster-autoscaler"
    
  4. Consulte los eventos de escalado vertical no desencadenados del escalador automático de clústeres en la CLI.

    kubectl get events --field-selector source=cluster-autoscaler,reason=NotTriggerScaleUp
    
  5. Consulte los eventos de advertencia del escalador automático de clústeres en la CLI.

    kubectl get events --field-selector source=cluster-autoscaler,type=Warning
    
  6. El escalador automático de clústeres también escribe el estado de mantenimiento en un objeto configmap llamado cluster-autoscaler-status. Puede recuperar este estado mediante el siguiente kubectl comando:

    kubectl get configmap -n kube-system cluster-autoscaler-status -o yaml
    

Para más información, consulte las preguntas más frecuentes sobre el proyecto de GitHub Kubernetes/autoscaler.

Métricas del escalado automático de clústeres

Puede usar las métricas del plano de control (versión preliminar) con el servicio administrado de Azure Monitor para Prometheus para recopilar métricas del escalador automático del clúster. El controlplane-cluster-autoscaler destino de extracción está deshabilitado de forma predeterminada, por lo que debe habilitarlo para recopilar estas métricas.

Las métricas disponibles incluyen cluster_autoscaler_unschedulable_pods_count y cluster_autoscaler_unneeded_nodes_count, que muestran el número de pods que no se pueden programar y los nodos marcados como candidatos para la eliminación. También puede monitorizar si el clúster se puede escalar automáticamente de forma segura con cluster_autoscaler_cluster_safe_to_autoscale y si la reducción de escala se encuentra en un período de espera con cluster_autoscaler_scale_down_in_cooldown.

En este artículo le mostramos cómo escalar automáticamente el número de nodos de AKS. Asimismo, también puede usar el escalado automático horizontal de pods para ajustar automáticamente el número de pods ejecutan la aplicación. Para obtener instrucciones sobre cómo usar el escalado automático horizontal de pods, consulte Escalado de aplicaciones en AKS.

Para ayudar a mejorar aún más el uso de recursos del clúster y liberar CPU y memoria para otros pods, consulte Escalador automático vertical.