El ajuste de escala automático vertical de Pods automatiza la configuración de las solicitudes y los límites de recursos de CPU y memoria para los contenedores dentro de los Pods de Kubernetes. El ajuste de escala automático vertical de Pods analiza el uso de recursos histórico y actual para proporcionar recomendaciones, que puede mostrar o aplicar automáticamente actualizando los Pods. Esta función mejora la estabilidad y la rentabilidad ajustando el tamaño de las asignaciones de recursos.
Antes de comenzar
Antes de configurar el ajuste de escala automático vertical de Pods, asegúrate de cumplir con los siguientes requisitos previos:
- Tienes un clúster de metal desnudo en ejecución.
- Tienes acceso de
kubectlal clúster. - El servidor de métricas está disponible en el clúster. Los clústeres de Bare Metal incluyen Metrics Server de forma predeterminada.
Habilitar el Ajuste de escala automático vertical de Pods
Habilita el ajuste de escala automático vertical de Pods en tu clúster de metal desnudo configurando una anotación de vista previa y la especificación del clúster:
Agrega o actualiza la anotación de versión preliminar en el recurso personalizado de Cluster.
Edita el recurso personalizado de Cluster directamente o modifica el archivo de configuración del clúster y usa
bmctl update.metadata: annotations: preview.baremetal.cluster.gke.io/vertical-pod-autoscaler: enableModifica el
specdel recurso personalizado Cluster para incluir el campoverticalPodAutoscalingy especificar los modosenableUpdateryenableMemorySaver:apiVersion: baremetal.cluster.gke.io/v1 kind: Cluster metadata: name: cluster1 namespace: cluster-cluster1 annotations: preview.baremetal.cluster.gke.io/vertical-pod-autoscaler: enable spec: # ... other cluster spec fields verticalPodAutoscaling: enableUpdater: true # Set to true for automated updates enableMemorySaver: true # Set to true to reduce recommender memory usageSi modificaste el archivo de configuración del clúster, aplica los cambios con el siguiente comando:
bmctl update cluster -c CLUSTER_NAME --kubeconfig KUBECONFIGReemplaza lo siguiente:
CLUSTER_NAME: El nombre de tu clúster.KUBECONFIG: Es la ruta de acceso del archivo kubeconfig del clúster.
Crea un recurso personalizado VerticalPodAutoscaler
Después de habilitar el ajuste de escala automático vertical de Pods en tu clúster, define un recurso personalizado VerticalPodAutoscaler para segmentar cargas de trabajo específicas:
Define un recurso
VerticalPodAutoscaleren el mismo espacio de nombres que la carga de trabajo de destino.Este recurso personalizado especifica a qué Pods se dirige con
targetRefy cualquier política de recursos.apiVersion: "autoscaling.k8s.io/v1" kind: VerticalPodAutoscaler metadata: name: hamster-vpa spec: targetRef: apiVersion: "apps/v1" kind: Deployment name: hamster resourcePolicy: containerPolicies: - containerName: '*' minAllowed: cpu: 100m memory: 50Mi maxAllowed: cpu: 1 memory: 500Mi controlledResources: ["cpu", "memory"]Aplica el manifiesto
VerticalPodAutoscalercon el siguiente comando:kubectl apply -f VPA_MANIFEST \ --kubeconfig KUBECONFIGReemplaza lo siguiente:
VPA_MANIFEST: Es la ruta de acceso al archivo de manifiestoVerticalPodAutoscaler.KUBECONFIG: Es la ruta del archivo kubeconfig del clúster.
Información sobre los modos de ajuste de escala automático vertical de Pods
El ajuste de escala automático vertical de Pods opera en diferentes modos que controlan cómo aplica las recomendaciones de recursos.
Modo de recomendación
En el modo de recomendación, el ajuste de escala automático vertical de Pods instala el componente de recomendación. Este componente analiza el uso de recursos y publica valores recomendados para las solicitudes y los límites de CPU y memoria en la sección de estado de los recursos personalizados VerticalPodAutoscaler que creas.
Para ver las recomendaciones de límites y solicitudes de recursos, usa el siguiente comando:
kubectl describe vpa VPA_NAME \
--kubeconfig KUBECONFIG \
-n CLUSTER_NAMESPACE
Replace the following:
* `VPA_NAME`: the name of the `VerticalPodAutoscaler`
that's targeting the workloads for which you are considering resource
adjustments.
* `KUBECONFIG`: the path of the cluster kubeconfig
file.
* `CLUSTER_NAMESPACE`: the name of the cluster that's
running vertical Pod autoscaling.
La respuesta debe contener una sección Status similar a la siguiente muestra:
Status:
Conditions:
Last Transition Time: 2025-08-04T23:53:32Z
Status: True
Type: RecommendationProvided
Recommendation:
Container Recommendations:
Container Name: hamster
Lower Bound:
Cpu: 100m
Memory: 262144k
Target:
Cpu: 587m
Memory: 262144k
Uncapped Target:
Cpu: 587m
Memory: 262144k
Upper Bound:
Cpu: 1
Memory: 500Mi
En este modo, los Pods no se actualizan automáticamente. Usa estas recomendaciones para actualizar manualmente las configuraciones de Pod. Este es el comportamiento predeterminado si enableUpdater no está configurado o es false.
Modo de actualización automática
Cuando configuras enableUpdater
enableUpdater en true, los controladores del ciclo de vida de equipos físicos implementan los componentes del actualizador y del controlador de admisión del ajuste de escala automático vertical de Pods, además del recomendador. El actualizador supervisa los Pods cuyas solicitudes de recursos actuales se desvían significativamente de las recomendaciones.
La política de actualización en el recurso VerticalPodAutoscaler especifica cómo el actualizador aplica las recomendaciones. De forma predeterminada, el modo de actualización es Auto, que indica que el actualizador asigna la configuración de recursos actualizada en la creación del Pod. En el siguiente ejemplo de VerticalPodAutoscaler, se muestra cómo establecer el modo de actualización en Initial:
apiVersion: "autoscaling.k8s.io/v1"
kind: VerticalPodAutoscaler
metadata:
name: hamster-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: hamster
resourcePolicy:
updatePolicy:
updateMode: "Initial"
...
El actualizador admite los siguientes cinco modos:
Auto: El actualizador expulsa el Pod. El controlador de admisión intercepta la solicitud de creación del Pod nuevo y la modifica para que use los valores recomendados de CPU y memoria que proporciona el recomendador. La actualización de recursos requiere la recreación del Pod, lo que puede causar interrupciones. Usa presupuestos de interrupción de Pods, que el actualizador respeta, para administrar el proceso de expulsión. Este modo equivale aRecreate.Recreate: El actualizador expulsa los Pods y asigna solicitudes y límites de recursos recomendados cuando se vuelve a crear el Pod.InPlaceOrRecreate(alfa): El actualizador intenta realizar actualizaciones locales con el mayor esfuerzo posible, pero puede recurrir a la recreación del Pod si no es posible realizar actualizaciones locales. Para obtener más información, consulta la documentación sobre el cambio de tamaño del pod in situ.Initial: El actualizador solo asigna solicitudes de recursos en la creación del Pod y nunca las cambia más adelante.Off: El actualizador no cambia automáticamente los requisitos de recursos de los Pods. Las recomendaciones se calculan y se pueden inspeccionar en el objetoVerticalPodAutoscaler.
Para obtener más información sobre el recurso personalizado VerticalPodAutoscaler, usa kubectl para recuperar la definición del recurso personalizado verticalpodautoscalercheckpoints.autoscaling.k8s.io que está instalada en el clúster de la versión 1.33.0 o posterior.
En el siguiente ejemplo, se muestra cómo podrían aparecer las recomendaciones de recursos en la sección Status del contenedor hamster. En la muestra, también se muestra un ejemplo de un evento de desalojo de Pod, que se produce cuando el actualizador desalojó un Pod antes de asignar automáticamente la configuración de recursos recomendada al Pod recreado:
Spec:
Resource Policy:
Container Policies:
Container Name: *
Controlled Resources:
cpu
memory
Max Allowed:
Cpu: 1
Memory: 500Mi
Min Allowed:
Cpu: 100m
Memory: 50Mi
Target Ref:
API Version: apps/v1
Kind: Deployment
Name: hamster
Update Policy:
Update Mode: Auto
Status:
Conditions:
Last Transition Time: 2025-08-04T23:53:32Z
Status: True
Type: RecommendationProvided
Recommendation:
Container Recommendations:
Container Name: hamster
Lower Bound:
Cpu: 100m
Memory: 262144k
Target:
Cpu: 587m
Memory: 262144k
Uncapped Target:
Cpu: 587m
Memory: 262144k
Upper Bound:
Cpu: 1
Memory: 500Mi
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal EvictedPod 49s vpa-updater VPA Updater evicted Pod hamster-7cb59fb657-lkrk4 to apply resource recommendation.
Modo de Ahorro de memoria
El modo de ahorro de memoria reduce la utilización de memoria del componente de recomendación del ajuste de escala automático vertical de Pods. Cuando configuras enableMemorySaver en true, el recomendador solo hace un seguimiento de las agregaciones y las calcula para los Pods que tienen un recurso personalizado VerticalPodAutoscaler coincidente.
La desventaja es que, cuando creas un recurso personalizado VerticalPodAutoscaler nuevo para una carga de trabajo existente, el recomendador tarda un tiempo (hasta 24 horas) en recopilar el historial suficiente para proporcionar recomendaciones precisas. Este modo está false de forma predeterminada para la mayoría de los tipos de clústeres, pero se establece en true para los clústeres perimetrales.
Usa Prometheus como proveedor de historial persistente
De forma predeterminada, el componente de recomendaciones mantiene en la memoria el historial de consumo de recursos de las cargas de trabajo que se ejecutan en el clúster y, periódicamente, guarda su estado en un recurso personalizado VerticalPodAutoscalerCheckpoint en etcd para proporcionar resistencia ante los reinicios.
A partir de la versión 1.34 de Google Distributed Cloud, puedes usar tu propia instancia de Prometheus como proveedor de historial persistente para los datos de consumo de recursos, es decir, las métricas de uso de CPU y memoria. Cuando se habilita esta integración, el recomendador puede consultar el servidor de Prometheus al inicio o reinicio para recuperar datos históricos a largo plazo sobre el uso de recursos de todos los Pods administrados. Recuperar estos datos permite que el sistema de recomendación cree de inmediato su estado interno con un conjunto de datos enriquecido, lo que genera recomendaciones más fundamentadas y precisas desde el principio.
Usar Prometheus como proveedor de historial persistente ofrece las siguientes ventajas:
Optimización del uso de recursos: Genera recomendaciones precisas y fundamentadas desde el principio para que puedas optimizar el uso de los recursos del clúster.
Prevención de errores de memoria insuficiente (OOM): Prometheus elimina la necesidad de almacenar el estado interno del recomendador en
VerticalPodAutoscalerCheckpointrecursos personalizados (CR), lo que hace que el uso de la memoria de ETCD sea más eficiente. Cuando se reinicia el componente del recomendador, se pierden los datos históricos en la memoria. Cuando usas Prometheus como proveedor de historial, el recomendador recupera las métricas históricas de Prometheus cuando se reinicia, lo que elimina la necesidad del CR deVerticalPodAutoscalerCheckpointy ahorra memoria de ETCD.
Puedes habilitar y, luego, inhabilitar el uso de Prometheus como proveedor de historial persistente en cualquier momento.
Requisitos previos para usar Prometheus con el ajuste de escala automático vertical de Pods
Para usar tu propia instancia de Prometheus como proveedor de historial para el ajuste de escala automático vertical de Pods, debes configurarla para que extraiga las métricas necesarias, lo que implica los siguientes pasos:
Si es necesario, implementa el operador de Prometheus en el clúster para el que deseas usarlo como proveedor de historial persistente para el ajuste de escala automático vertical de Pods. Para obtener más información, consulta Cómo implementar y configurar el operador de Prometheus en Kubernetes.
Configura los permisos para recopilar métricas.
Para permitir que Prometheus extraiga métricas de cAdvisor con un archivo de configuración, debes otorgar permisos adicionales a la cuenta de servicio que usa el servidor de Prometheus. Crea o actualiza un objeto
ClusterRoleque contenga estas reglas y asegúrate de que esté vinculado a la cuenta de servicio de Prometheus correcta con un objetoClusterRoleBinding:apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: prometheus-role labels: app: prometheus-server rules: - apiGroups: [""] resources: - nodes verbs: - get - list - watch - apiGroups: [""] resources: - nodes/proxy - nodes/metrics verbs: - get --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: prometheus-binding labels: app: prometheus-server subjects: - kind: ServiceAccount name: prometheus-server # Service account being used by prometheus namespace: prometheus # Service account's namespace roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: prometheus-role # Name of the ClusterRole created aboveActualiza el archivo de configuración de Prometheus para recopilar las siguientes métricas de cAdvisor:
container_cpu_usage_seconds_totalcontainer_memory_working_set_bytes
Las siguientes líneas definen los detalles de la extracción para las métricas de cAdvisor:
- job_name: 'kubernetes-cadvisor' scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token kubernetes_sd_configs: - role: node relabel_configs: - action: labelmap regex: __meta_kubernetes_node_label_(.+) - target_label: __address__ replacement: kubernetes.default.svc:443 - source_labels: [__meta_kubernetes_node_name] regex: (.+) target_label: __metrics_path__ replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor metric_relabel_configs: # Keep only the metrics VPA uses to save disk space - source_labels: [__name__] regex: (container_cpu_usage_seconds_total|container_memory_working_set_bytes) action: keepActualiza el archivo de configuración de Prometheus para recopilar la siguiente métrica del servicio
kube-state-metrics:kube_pod_labels
Implementa un servicio
kube-state-metricsen tu clúster.Puedes usar los siguientes comandos de Helm para instalar el nuevo servicio:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo updateCrea un archivo
ksm-values.yamlcon el siguiente contenido:fullnameOverride: vpa-kube-state-metrics metricAllowlist: - kube_pod_labels metricLabelsAllowlist: - "pods=[*]"Instala un gráfico de Helm basado en el archivo de valores del paso anterior:
helm install vpa-ksm prometheus-community/kube-state-metrics \ -f ksm-values.yaml --namespace kube-systemAgrega las siguientes líneas al archivo de configuración de Prometheus para recopilar la métrica
kube_pod_labelsdel serviciokube-state-metricsinstalado:- job_name: 'kube-state-metrics' static_configs: - targets: ['vpa-kube-state-metrics.kube-system.svc.cluster.local:8080'] metric_relabel_configs: - source_labels: [ __name__ ] regex: 'kube_pod_labels' action: keep
Habilita y usa Prometheus
El ajuste de escala automático vertical de Pods admite la autenticación básica y la autenticación basada en tokens de portador para conectarse a Prometheus. Cuando usas la autenticación, debes crear un Secret que contenga las credenciales necesarias en el espacio de nombres del clúster. El controlador reenvía este Secret al clúster de destino y lo activa como un volumen o una variable de entorno en el Pod del recomendador. También puedes usar Prometheus sin autenticación.
Para habilitar y usar tu propia instancia de Prometheus con el ajuste de escala automático vertical de Pods, debes configurar la sección verticalPodAutoscaling en la especificación del clúster con detalles para conectarte a tu instancia de Prometheus.
A continuación, se muestra un ejemplo de la configuración en la especificación del clúster para usar con un token de portador:
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: cluster1
namespace: cluster-cluster1
annotations:
preview.baremetal.cluster.gke.io/vertical-pod-autoscaler: enable
spec:
# ... other existing cluster configurations ...
verticalPodAutoscaling:
# ... other vertical Pod autoscaling configurations ...
# Add this new section to configure the vpa to use prometheus using bearer token authentication as history provider
prometheus:
url: "http://prometheus.prometheus.monitoring.svc.cluster.local:9090"
auth:
bearerTokenAuth:
name: prom-bearer-creds
key: bearertoken
Para habilitar Prometheus para usarlo con el ajuste de escala automático vertical de Pods, haz lo siguiente:
Asegúrate de que tu instancia de Prometheus esté configurada para recuperar las métricas requeridas, como se describe en Requisitos previos para usar Prometheus con el ajuste de escala automático vertical de Pods.
Actualiza el recurso personalizado Cluster
specpara que el campoverticalPodAutoscaling.prometheusespecifique la configuración de conexión de tu servidor de Prometheus.Agrega
urla la secciónprometheusy configúralo con el nombre de dominio completamente calificado (FQDN) para conectarte a Prometheus desde el clúster:spec: # ... other existing cluster configurations ... verticalPodAutoscaling: # ... other vpa configurations ... # Add this new section to configure the vpa to use prometheus as history provider prometheus: # Required: The URL of the Prometheus server url: "http://prometheus.prometheus.svc.cluster.local:9090"Especifica los detalles de la conexión:
El ajuste de escala automático vertical de Pods admite los siguientes tres métodos de conexión:
- Sin autenticación
- Autenticación básica (nombre de usuario y contraseña)
Autenticación con token del portador
Sin autenticación
Si tu instancia de Prometheus no requiere autenticación, ya terminaste. La sección
prometheusdebe incluir solo un campourl.Autenticación básica
Sigue estos pasos para especificar la autenticación básica para Prometheus:
Crea un secreto que contenga un nombre de usuario y una contraseña en la sección
stringDatay la anotaciónbaremetal.cluster.gke.io/mark-source: "true".En el siguiente ejemplo, se muestra un objeto Secret que admite la autenticación básica:
apiVersion: v1 kind: Secret metadata: name: prom-basic-creds namespace: <cluster-namespace> annotations: baremetal.cluster.gke.io/mark-source: "true" type: Opaque stringData: username: admin password: pwdLa anotación es necesaria para garantizar que el secreto de origen y el secreto del clúster de destino estén siempre sincronizados. El Secret se actualiza cuando se actualiza el Secret de origen.
Actualiza la sección
prometheus.auth.basicAuthde la especificación del clúster para hacer referencia al nombre de usuario y la contraseña del campodataen el secreto.En el siguiente ejemplo, se muestra una sección
basicAuthque hace referencia al nombre de usuario y la contraseña del Secret del paso anterior:# ... other vpa configurations ... prometheus: url: "http://prometheus.prometheus.svc.cluster.local:9090" auth: basicAuth: usernameRef: name: prom-basic-creds key: username passwordRef: name: prom-basic-creds key: passwordEl nombre de usuario y la contraseña deben estar en el mismo secreto. Las claves deben ser válidas y provenir del campo
datadel secreto.
La instancia de Prometheus debería comenzar a funcionar como proveedor de historial para el ajuste de escala automático vertical de Pods cuando se actualice el recurso personalizado del clúster.
Autenticación con token del portador
Sigue estos pasos para especificar la autenticación con token de portador para Prometheus:
Crea un secreto que contenga un token de portador en la sección
stringDatay la anotaciónbaremetal.cluster.gke.io/mark-source: "true".En el siguiente ejemplo, se muestra un Secret que admite la autenticación con token de portador:
apiVersion: v1 kind: Secret metadata: name: prom-bearer-creds namespace: <cluster-namespace> annotations: baremetal.cluster.gke.io/mark-source: "true" type: Opaque stringData: bearertoken: "SAMPLE_TOKEN"La anotación es necesaria para garantizar que el secreto de origen y el secreto del clúster de destino estén siempre sincronizados. El Secret se actualiza cuando se actualiza el Secret de origen.
Actualiza la sección
prometheus.auth.bearerTokenAuthde la especificación del clúster para hacer referencia al token de portador del campodataen el secreto.En el siguiente ejemplo, se muestra una sección
bearerTokenAuthque hace referencia al token de portador en el Secret del paso anterior:# ... other vertical Pod autoscaling configurations ... prometheus: url: "http://prometheus.prometheus.svc.cluster.local:9090" auth: bearerTokenAuth: name: prom-bearer-creds key: bearertokenLa clave debe ser una clave válida del campo
datadel secreto.
La instancia de Prometheus debería comenzar a funcionar como proveedor de historial para el ajuste de escala automático vertical de Pods cuando se actualice el recurso personalizado del clúster.
Inhabilita el uso de Prometheus
Para inhabilitar el uso de Prometheus con el ajuste de escala automático vertical de Pods, quita la sección prometheus de la sección verticalPodAutoscaling del recurso personalizado Cluster.
Inhabilita el ajuste de escala automático vertical de Pods
Inhabilita el ajuste de escala automático vertical de Pods quitando sus recursos personalizados y su configuración del clúster:
Borra los recursos personalizados de
VerticalPodAutoscalerque hayas creado.Modifica el recurso personalizado Cluster y quita toda la sección
verticalPodAutoscalingdespec.Puedes editar el recurso personalizado de Cluster directamente o modificar el archivo de configuración del clúster y usar
bmctl update.Quita la anotación
preview.baremetal.cluster.gke.io/vertical-pod-autoscalerdel recurso personalizado Cluster.
Limitaciones
Ten en cuenta las siguientes limitaciones cuando uses el ajuste de escala automático vertical de Pods:
- El ajuste de escala automático vertical de Pods aún no está listo para usarse con cargas de trabajo basadas en JVM debido a la visibilidad limitada del uso real de la memoria de la carga de trabajo.
- El actualizador requiere un mínimo de dos réplicas de Pod para que los Deployments reemplacen los Pods con valores de recursos revisados.
- El actualizador no actualiza rápidamente los Pods que se encuentran en un bucle de fallas debido a errores de memoria insuficiente (OOM).
- La política de actualización
InPlaceOrRecreatepara Pods es una función alfa dentro del ajuste de escala automático vertical de Pods. Intenta realizar actualizaciones en el lugar con el mejor esfuerzo, pero puede recurrir a la recreación del Pod si no es posible realizar actualizaciones en el lugar.
¿Qué sigue?
- Explora los presupuestos de interrupción de Pods.