Autoescalado de pods vertical

En esta página se explica cómo puedes analizar y optimizar la asignación de recursos para mejorar la eficiencia de tus cargas de trabajo en Google Kubernetes Engine (GKE) mediante el autoescalado vertical de pods. Al analizar el uso de recursos de tu carga de trabajo a lo largo del tiempo, puedes obtener recomendaciones de optimización y ajustar automáticamente las solicitudes y los límites de CPU y memoria de los contenedores de los pods.

En esta página, se explica cómo funciona el autoescalado vertical de pods, sus ventajas y limitaciones, las prácticas recomendadas para usarlo y las referencias de la API del recurso personalizado VerticalPodAutoscaler y los tipos relacionados.

Esta página está dirigida a operadores y desarrolladores que aprovisionan y configuran recursos en la nube, despliegan cargas de trabajo y gestionan el escalado de aplicaciones. Para obtener más información sobre los roles habituales, consulta Roles y tareas de usuario habituales de GKE.

Antes de leer esta página, familiarízate con las solicitudes y los límites de recursos en Kubernetes.

Si necesitas un escalado rápido en respuesta a un uso repentino de los recursos, utiliza la herramienta de adaptación dinámica horizontal de pods.

Para consultar las prácticas recomendadas de escalado automático, consulta el artículo Prácticas recomendadas para ejecutar aplicaciones de Kubernetes de coste optimizado en GKE.

Cómo funciona el autoescalado de pods vertical

El autoescalado vertical de pods te permite analizar y definir los recursos de CPU y memoria que necesitan los pods. En lugar de tener que configurar solicitudes y límites de CPU y solicitudes y límites de memoria actualizados para los contenedores de tus pods, puedes configurar el autoescalado de pods vertical para que proporcione valores recomendados de solicitudes y límites de CPU y de memoria que puedes usar para actualizar manualmente tus pods. También puedes configurar el autoescalado de pods vertical para que actualice los valores automáticamente.

El autoescalado vertical de pods está habilitado de forma predeterminada en los clústeres de Autopilot.

Modos de autoescalado de pods vertical

Puedes configurar cómo aplica el autoescalado de pods vertical los cambios en los recursos aplicando diferentes modos de actualización.

Modo Auto (Recreate)

En el modo Recreate, el autoescalado vertical de pods expulsa un pod si necesita cambiar las solicitudes de recursos del pod. La expulsión es necesaria porque, debido a las limitaciones de Kubernetes en versiones anteriores a la 1.33, la única forma de modificar las solicitudes de recursos de un pod en ejecución es volver a crearlo.

Para limitar el número de recreaciones de pods, usa un presupuesto de interrupciones de pods. Para asegurarte de que tu clúster pueda gestionar los nuevos tamaños de tus cargas de trabajo, usa Auto Scaler de clústeres y Aprovisionamiento automático de nodos.

El autoescalado vertical de pods notifica a la herramienta de adaptación dinámica del clúster antes de la actualización y proporciona los recursos necesarios para la carga de trabajo redimensionada antes de volver a crearla, lo que minimiza el tiempo de interrupción.

Modo Initial

Con Initial habilitado, el autoescalado vertical de pods solo asigna solicitudes de recursos al crear el pod y nunca las cambia después.

Modo InPlaceOrRecreate

El modo InPlaceOrRecreate tiene como objetivo reducir las interrupciones del servicio intentando actualizar los recursos del pod sin volver a crearlo. Aunque este modo no garantiza que no haya interrupciones, puede ayudar a reducirlas y, al mismo tiempo, aprovechar las ventajas del escalado automático vertical de pods.

Para usar el modo InPlaceOrRecreate, asigna el valor "InPlaceOrRecreate" al campo spec.updatePolicy.updateMode del objeto VerticalPodAutoscaler.

Si el escalado automático vertical de pods determina que no es posible realizar una actualización in situ, vuelve al comportamiento del modo Auto, que expulsa y vuelve a crear el pod para aplicar los cambios.

El modo InPlaceOrRecreate está disponible en la versión 1.34.0-gke.1709000 de Kubernetes y en versiones posteriores.

Para obtener más información sobre el comportamiento y las limitaciones actuales del modo InPlaceOrRecreate, consulta el anuncio de Kubernetes sobre las actualizaciones in situ.

Ventajas

El autoescalado vertical de pods ofrece las siguientes ventajas:

  • Si defines las solicitudes y los límites de recursos adecuados para tus cargas de trabajo, mejorarás la estabilidad y la rentabilidad. Si los tamaños de los recursos de tu pod son inferiores a los que requieren tus cargas de trabajo, tu aplicación puede limitarse o fallar debido a errores de falta de memoria. Si los tamaños de los recursos son demasiado grandes, se desperdician y, por lo tanto, las facturas son más elevadas.
  • Los nodos de clúster se usan de forma eficiente porque los pods utilizan exactamente lo que necesitan.
  • Los pods se programan en nodos que tienen los recursos adecuados disponibles.
  • No tienes que realizar tareas de creación de comparativas que consuman mucho tiempo para determinar los valores correctos de las solicitudes de CPU y memoria.
  • Se reduce el tiempo de mantenimiento, ya que el autoescalador puede ajustar las solicitudes de CPU y memoria a lo largo del tiempo sin que tengas que hacer nada.

El autoescalado vertical de pods de GKE ofrece las siguientes ventajas con respecto al autoescalador de código abierto de Kubernetes:

  • Tiene en cuenta el tamaño máximo de los nodos y las cuotas de recursos al determinar el objetivo de la recomendación.
  • Notifica a la herramienta de ajuste automático de escala de clústeres para que ajuste la capacidad del clúster.
  • Usa datos históricos y proporciona métricas recogidas antes de habilitar Vertical Pod Autoscaler.
  • Ejecuta pods de autoescalado vertical de pods como procesos del plano de control en lugar de como implementaciones en tus nodos de trabajo.

Limitaciones

  • Para usar el autoescalado vertical de pods con el autoescalado horizontal de pods, usa el autoescalado de pods multidimensional. También puedes usar el autoescalado vertical de pods con el autoescalado horizontal de pods en métricas personalizadas y externas.
  • El autoescalado vertical de pods no está listo para usarse con cargas de trabajo basadas en JVM debido a la visibilidad limitada del uso real de memoria de la carga de trabajo.
  • El autoescalado de pods vertical tiene un ajuste predeterminado de dos réplicas mínimas para que los despliegues sustituyan los pods por valores de recursos revisados. En la versión 1.22 de GKE y posteriores, puedes anular este ajuste especificando un valor para minReplicas en el campo PodUpdatePolicy.
  • Si usas el modo de actualización InPlaceOrRecreate del autoescalado de pods vertical y no es posible realizar una actualización in situ (por ejemplo, cuando se escala el pod por encima de la capacidad del nodo), el autoescalado de pods vertical expulsa y vuelve a crear el pod para aplicar la recomendación. El desalojo y la recreación se producen incluso en los pods que tienen un resizePolicy definido en su especificación para evitar recreaciones.

Prácticas recomendadas

  • Para evitar interrupciones en las actualizaciones de clústeres, te recomendamos que mantengas el número de objetos VerticalPodAutoscaler por clúster por debajo de 1000.
  • El autoescalado vertical de pods funciona mejor con cargas de trabajo homogéneas de larga duración.

Referencia de la API

Esta es la referencia de la API v1. Te recomendamos encarecidamente que uses esta versión de la API.

VerticalPodAutoscaler v1 autoscaling.k8s.io

Campos

TypeMeta

Grupo, versión y tipo de API.

metadata

ObjectMeta

Metadatos de objeto estándar.

spec

VerticalPodAutoscalerSpec

El comportamiento deseado de VerticalPodAutoscaler.

status

VerticalPodAutoscalerStatus

El estado más reciente observado de VerticalPodAutoscaler.

VerticalPodAutoscalerSpec v1 autoscaling.k8s.io

Campos
targetRef

CrossVersionObjectReference

Referencia al controlador que gestiona el conjunto de pods que debe controlar el escalador automático. Por ejemplo, una implementación o un StatefulSet. Puedes apuntar un VerticalPodAutoscaler a cualquier controlador que tenga un subrecurso Scale. Normalmente, VerticalPodAutoscaler obtiene el conjunto de pods de ScaleStatus del controlador. En algunos controladores conocidos, como DaemonSet, VerticalPodAutoscaler obtiene el conjunto de pods de la especificación del controlador.

updatePolicy

PodUpdatePolicy

Especifica si se aplican las actualizaciones recomendadas cuando se inicia un Pod y si se aplican durante la vida útil de un Pod.

resourcePolicy

PodResourcePolicy

Especifica las políticas sobre cómo se ajustan las solicitudes de CPU y memoria de los contenedores individuales. La política de recursos se puede usar para definir restricciones en las recomendaciones de contenedores concretos. Si no se especifica, el autoescalador calcula los recursos recomendados para todos los contenedores del pod, sin restricciones adicionales.

recommenders

VerticalPodAutoscalerRecommenderSelector array

Recomendador responsable de generar recomendaciones para este objeto VPA. Déjalo en blanco para usar el recomendador predeterminado proporcionado por GKE. De lo contrario, la lista puede contener exactamente una entrada para un recomendador alternativo proporcionado por el usuario. Compatible desde GKE 1.22.

VerticalPodAutoscalerList v1 autoscaling.k8s.io

Campos

TypeMeta

Grupo, versión y tipo de API.

metadata

ObjectMeta

Metadatos de objeto estándar.

items

VerticalPodAutoscaler array

Lista de objetos VerticalPodAutoscaler.

PodUpdatePolicy v1 autoscaling.k8s.io

Campos
updateMode

string

Especifica si se aplican las actualizaciones recomendadas cuando se inicia un Pod y si se aplican durante la vida útil de un Pod. Los valores posibles son los siguientes:

  • "Off": se generan actualizaciones recomendadas, pero no se aplican automáticamente al pod.
  • "Initial": las actualizaciones recomendadas solo se aplican cuando se inicia un Pod por primera vez. Las actualizaciones que se produzcan mientras el Pod ya esté en funcionamiento no se aplicarán automáticamente.
  • "Recreate": las actualizaciones recomendadas se aplican volviendo a crear el pod. El pod se termina y se crea uno nuevo con la configuración actualizada.
  • "Auto": el valor predeterminado que aplica el modo "Recreate".
  • "InPlaceOrRecreate": se aplican las actualizaciones recomendadas sin volver a crear el pod, si es posible.
minReplicas

int32

El número mínimo de réplicas que deben estar activas para intentar expulsar el pod (pendiente de otras comprobaciones, como el presupuesto de interrupción de pods). Solo se permiten valores positivos. El valor predeterminado es 2. Compatible desde GKE 1.22.

PodResourcePolicy v1 autoscaling.k8s.io

Campos
containerPolicies

ContainerResourcePolicy array

Una matriz de políticas de recursos para contenedores individuales. Puede haber como máximo una entrada por cada contenedor con nombre y, opcionalmente, una entrada comodín con `containerName = '*'`, que gestiona todos los contenedores que no tienen políticas individuales.

ContainerResourcePolicy v1 autoscaling.k8s.io

Campos
containerName

string

El nombre del contenedor al que se aplica la política. Si no se especifica, la política se utiliza como política predeterminada.

mode

ContainerScalingMode

Especifica si las actualizaciones recomendadas se aplican al contenedor cuando se inicia y si se aplican durante la vida útil del contenedor. Los valores posibles son "Off" y "Auto". Si no especifica ningún valor, se usará "Automático" de forma predeterminada.

minAllowed

ResourceList

Especifica la solicitud mínima de CPU y de memoria permitida para el contenedor. De forma predeterminada, no se aplica ningún mínimo.

maxAllowed

ResourceList

Especifica la solicitud máxima de CPU y de memoria permitida para el contenedor. De forma predeterminada, no se aplica ningún máximo.

ControlledResources

[]ResourceName

Especifica el tipo de recomendaciones que calculará (y posiblemente aplicará) el VerticalPodAutoscaler. Si está vacío, se usa el valor predeterminado [ResourceCPU, ResourceMemory].

VerticalPodAutoscalerRecommenderSelector v1 autoscaling.k8s.io

Campos
name

string

Nombre del recomendador responsable de generar la recomendación de este objeto.

VerticalPodAutoscalerStatus v1 autoscaling.k8s.io

Campos
recommendation

RecommendedPodResources

Las solicitudes de CPU y memoria recomendadas más recientemente.

conditions

VerticalPodAutoscalerCondition array

Describe el estado actual del VerticalPodAutoscaler.

RecommendedPodResources v1 autoscaling.k8s.io

Campos
containerRecommendation

RecommendedContainerResources array

Una matriz de recomendaciones de recursos para contenedores individuales.

RecommendedContainerResources v1 autoscaling.k8s.io

Campos
containerName

string

Nombre del contenedor al que se aplica la recomendación.

target

ResourceList

Solicitud de CPU y de memoria recomendadas para el contenedor.

lowerBound

ResourceList

Solicitud mínima de CPU y memoria recomendada para el contenedor. No se garantiza que esta cantidad sea suficiente para que la aplicación sea estable. Si se ejecuta con solicitudes de CPU y memoria más pequeñas, es probable que se vea afectado el rendimiento o la disponibilidad.

upperBound

ResourceList

La solicitud de CPU y de memoria máxima recomendada para el contenedor. Es probable que las solicitudes de CPU y memoria que superen estos valores se desperdicien.

uncappedTarget

ResourceList

La recomendación de recursos más reciente calculada por el escalador automático, basada en el uso real de los recursos, sin tener en cuenta la ContainerResourcePolicy. Si el uso real de recursos provoca que el objetivo incumpla la política ContainerResourcePolicy, puede que sea diferente de la recomendación acotada. Este campo no afecta a la asignación real de recursos. Se usa únicamente como indicación de estado.

VerticalPodAutoscalerCondition v1 autoscaling.k8s.io

Campos
type

VerticalPodAutoscalerConditionType

El tipo de condición que se describe. Los valores posibles son "RecommendationProvided", "LowConfidence", "NoPodsMatched" y "FetchingHistory".

status

ConditionStatus

El estado de la condición. Los valores posibles son True, False y Unknown.

lastTransitionTime

Time

La última vez que la condición pasó de un estado a otro.

reason

string

El motivo del último cambio de un estado a otro.

message

string

Cadena legible por humanos que ofrece detalles sobre la última transición de un estado a otro.

Siguientes pasos