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 unresizePolicy
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 | |
---|---|
|
Grupo, versión y tipo de API. |
metadata |
Metadatos de objeto estándar. |
spec |
El comportamiento deseado de |
status |
El estado más reciente observado de |
VerticalPodAutoscalerSpec v1 autoscaling.k8s.io
Campos | |
---|---|
targetRef |
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 |
updatePolicy |
Especifica si se aplican las actualizaciones recomendadas cuando se inicia un Pod y si se aplican durante la vida útil de un Pod. |
resourcePolicy |
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 |
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 | |
---|---|
|
Grupo, versión y tipo de API. |
metadata |
Metadatos de objeto estándar. |
items |
Lista de objetos |
PodUpdatePolicy v1 autoscaling.k8s.io
Campos | |
---|---|
updateMode |
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:
|
minReplicas |
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 |
PodResourcePolicy v1 autoscaling.k8s.io
Campos | |
---|---|
containerPolicies |
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 |
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 |
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 |
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 |
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 |
Especifica el tipo de recomendaciones que calculará (y posiblemente aplicará) el |
VerticalPodAutoscalerRecommenderSelector v1 autoscaling.k8s.io
Campos | |
---|---|
name |
Nombre del recomendador responsable de generar la recomendación de este objeto. |
VerticalPodAutoscalerStatus v1 autoscaling.k8s.io
Campos | |
---|---|
recommendation |
Las solicitudes de CPU y memoria recomendadas más recientemente. |
conditions |
Describe el estado actual del |
RecommendedPodResources v1 autoscaling.k8s.io
Campos | |
---|---|
containerRecommendation |
Una matriz de recomendaciones de recursos para contenedores individuales. |
RecommendedContainerResources v1 autoscaling.k8s.io
Campos | |
---|---|
containerName |
Nombre del contenedor al que se aplica la recomendación. |
target |
Solicitud de CPU y de memoria recomendadas para el contenedor. |
lowerBound |
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 |
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 |
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 |
El tipo de condición que se describe. Los valores posibles son "RecommendationProvided", "LowConfidence", "NoPodsMatched" y "FetchingHistory". |
status |
El estado de la condición. Los valores posibles son True, False y Unknown. |
lastTransitionTime |
La última vez que la condición pasó de un estado a otro. |
reason |
El motivo del último cambio de un estado a otro. |
message |
Cadena legible por humanos que ofrece detalles sobre la última transición de un estado a otro. |
Siguientes pasos
- Consulta cómo escalar las solicitudes y los límites de recursos de los contenedores.
- Consulta las prácticas recomendadas para ejecutar aplicaciones de Kubernetes de coste optimizado en GKE.
- Consulta información sobre la herramienta de adaptación dinámica de clústeres.