En esta página se explica cómo analizar y ajustar las solicitudes de CPU y las solicitudes de memoria de un contenedor de un clúster de Google Kubernetes Engine (GKE) mediante el autoescalado vertical de pods.
Puedes escalar los recursos de contenedor manualmente a través de la Trusted Cloud consola,
analizar los recursos con un objeto VerticalPodAutoscaler
o
configurar el escalado automático con el autoescalado de pods vertical.
Antes de empezar
Antes de empezar, asegúrate de que has realizado las siguientes tareas:
- Habilita la API de Google Kubernetes Engine. Habilitar la API de Google Kubernetes Engine
- Si quieres usar Google Cloud CLI para esta tarea, instálala y, a continuación, inicialízala. Si ya has instalado la gcloud CLI, obtén la versión más reciente ejecutando
gcloud components update
.
Analizar las solicitudes de recursos
El autoescalador vertical de pods analiza automáticamente tus contenedores y proporciona solicitudes de recursos sugeridas. Puedes ver estas solicitudes de recursos mediante laTrusted Cloud consola, Cloud Monitoring o Google Cloud CLI.
Consola
Para ver las solicitudes de recursos sugeridas en la consola Trusted Cloud , debes tener una carga de trabajo desplegada que tenga al menos 24 horas. Es posible que algunas sugerencias no estén disponibles o no sean relevantes para determinadas cargas de trabajo, como las que se hayan creado en las últimas 24 horas, los pods independientes y las aplicaciones escritas en Java.
Ve a la página Cargas de trabajo de la Trusted Cloud consola.
En la lista de cargas de trabajo, haz clic en el nombre de la carga de trabajo que quieras escalar.
Haz clic en list Acciones > Escalar > Editar solicitudes de recursos.
En la sección Analizar datos de utilización de recursos se muestran los datos de uso históricos que ha analizado el controlador de autoescalado de pods vertical para crear las solicitudes de recursos sugeridas en la sección Ajustar solicitudes y límites de recursos.
Cloud Monitoring
Para ver las solicitudes de recursos sugeridas en Cloud Monitoring, debes tener una carga de trabajo desplegada.
Ve a la página Explorador de métricas de la consola de Trusted Cloud .
Haz clic en Configuración.
Despliega el menú Seleccionar una métrica.
En el menú Recurso, selecciona Escalado de Kubernetes.
En el menú Categoría de métrica, selecciona Escalador automático.
En el menú Métrica, selecciona Bytes de solicitud recomendados por réplica y Núcleo de solicitud recomendado por réplica.
Haz clic en Aplicar.
CLI de gcloud
Para ver las solicitudes de recursos sugeridas, debes crear un objeto VerticalPodAutoscaler
y una implementación.
En los clústeres estándar, habilita el autoescalado vertical de pods en tu clúster. En los clústeres de Autopilot, el autoescalado vertical de pods está habilitado de forma predeterminada.
gcloud container clusters update CLUSTER_NAME --enable-vertical-pod-autoscaling
Sustituye
CLUSTER_NAME
por el nombre de tu clúster.Guarda el siguiente archivo de manifiesto como
my-rec-deployment.yaml
:apiVersion: apps/v1 kind: Deployment metadata: name: my-rec-deployment spec: replicas: 2 selector: matchLabels: app: my-rec-deployment template: metadata: labels: app: my-rec-deployment spec: containers: - name: my-rec-container image: nginx
Este manifiesto describe un
Deployment
que no tiene solicitudes de CPU ni de memoria. El valorcontainers.name
demy-rec-deployment
especifica que todos los pods de la implementación pertenecen aVerticalPodAutoscaler
.Aplica el manifiesto al clúster:
kubectl create -f my-rec-deployment.yaml
Guarda el siguiente archivo de manifiesto como
my-rec-vpa.yaml
:apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: my-rec-vpa spec: targetRef: apiVersion: "apps/v1" kind: Deployment name: my-rec-deployment updatePolicy: updateMode: "Off"
Este archivo de manifiesto describe un
VerticalPodAutoscaler
. El valorupdateMode
deOff
significa que, cuando se crean los pods, el controlador de autoescalado vertical de pods analiza las necesidades de CPU y memoria de los contenedores y registra esas recomendaciones en el campostatus
del recurso. El controlador de autoescalado vertical de pods no actualiza automáticamente las solicitudes de recursos de los contenedores en ejecución.Aplica el manifiesto al clúster:
kubectl create -f my-rec-vpa.yaml
Después de un tiempo, consulta el
VerticalPodAutoscaler
:kubectl get vpa my-rec-vpa --output yaml
El resultado debería ser similar al siguiente:
... recommendation: containerRecommendations: - containerName: my-rec-container lowerBound: cpu: 25m memory: 262144k target: cpu: 25m memory: 262144k upperBound: cpu: 7931m memory: 8291500k ...
En esta salida se muestran recomendaciones para las solicitudes de CPU y memoria.
Definir manualmente las solicitudes de recursos de los pods
Puedes definir manualmente las solicitudes de recursos de los pods mediante la Trusted Cloud consola o kubectl. Siga estas prácticas recomendadas para definir las solicitudes y los límites de recursos de los contenedores:
- Memoria: asigna la misma cantidad de memoria a la solicitud y al límite.
- CPU: en la solicitud, especifica la CPU mínima necesaria para asegurar el correcto funcionamiento, de acuerdo con tus propios SLOs. Define un límite de CPU ilimitado.
Consola
Ve a la página Cargas de trabajo de la Trusted Cloud consola.
En la lista de cargas de trabajo, haz clic en el nombre de la carga de trabajo que quieras escalar.
Haz clic en list Acciones > Escalar > Editar solicitudes de recursos.
- En la sección Ajustar solicitudes y límites de recursos se muestran las solicitudes de CPU y memoria actuales de cada contenedor, así como las solicitudes de CPU y memoria sugeridas.
Haz clic en Aplicar las últimas sugerencias para ver las solicitudes sugeridas de cada contenedor.
Haz clic en Guardar cambios.
Haz clic en Confirmar.
kubectl
Escalar verticalmente tu carga de trabajo con las mínimas interrupciones
A partir de la versión 1.33 de Kubernetes, puedes usar el comando kubectl patch
para escalar verticalmente tu carga de trabajo. Para ello, actualiza los recursos asignados a un contenedor sin tener que volver a crear el pod. Para obtener más información, incluidas las limitaciones, consulta la documentación de Kubernetes sobre cómo cambiar el tamaño de los recursos de CPU y memoria.
Para usar el comando kubectl patch
, especifica la solicitud de recursos actualizada con la marca --patch
. Por ejemplo, para escalar my-app
a 800 mCPUs, ejecuta el siguiente comando:
kubectl patch pod my-app --subresource resize --patch \
'{"spec":{"containers":[{"name":"pause", "resources":{"requests":{"cpu":"800m"}, "limits":{"cpu":"800m"}}}]}}'
Escalar verticalmente tu carga de trabajo
Para definir solicitudes de recursos para un pod, define los valores requests.cpu y memory.cpu en el manifiesto de la implementación. En este ejemplo, se modifica manualmente el despliegue creado en Analizar solicitudes de recursos con las solicitudes de recursos sugeridas.
Guarda el siguiente manifiesto de ejemplo como
my-adjusted-deployment.yaml
:apiVersion: apps/v1 kind: Deployment metadata: name: my-rec-deployment spec: replicas: 2 selector: matchLabels: app: my-rec-deployment template: metadata: labels: app: my-rec-deployment spec: containers: - name: my-rec-container image: nginx resources: requests: cpu: 25m memory: 256Mi
Este manifiesto describe un Deployment que tiene dos pods. Cada pod tiene un contenedor que solicita 25 milicpus y 256 MiB de memoria.
Aplica el manifiesto al clúster:
kubectl apply -f my-adjusted-deployment.yaml
Definir automáticamente las solicitudes de recursos de los pods
El autoescalado vertical de pods usa el objeto VerticalPodAutoscaler
para definir automáticamente las solicitudes de recursos en los pods cuando el updateMode
es Auto
. Puedes configurar un VerticalPodAutoscaler
con la CLI de gcloud o con la consola deTrusted Cloud .
Consola
Para definir las solicitudes de recursos automáticamente, debes tener un clúster con la función de autoescalado vertical de pods habilitada. Los clústeres de Autopilot tienen la función de autoescalado vertical de pods habilitada de forma predeterminada.
Habilitar el autoescalado de pods vertical
Ve a la página Google Kubernetes Engine en la consola de Trusted Cloud .
En la lista de clústeres, haga clic en el nombre del clúster que quiera modificar.
En la sección Automatización, haz clic en edit Editar en la opción Autoescalado vertical de pods.
Selecciona la casilla Habilitar autoescalado de pods vertical.
Haz clic en Guardar cambios.
Configurar el autoescalado de pods vertical
Ve a la página Cargas de trabajo de la Trusted Cloud consola.
En la lista de cargas de trabajo, haz clic en el nombre del Deployment para el que quieras configurar el escalado automático vertical de pods.
Haz clic en list Acciones > Autoescalado > Autoescalado vertical de pods.
Elige un modo de autoescalado:
- Modo automático: el autoescalado vertical de pods actualiza las solicitudes de CPU y de memoria durante el ciclo de vida de un pod.
- Modo inicial: el autoescalado vertical de pods asigna solicitudes de recursos solo cuando se crea el pod y nunca las cambia después.
(Opcional) Define políticas de contenedores. Esta opción te permite asegurarte de que la recomendación nunca se establezca por encima o por debajo de una solicitud de recursos específica.
- Haz clic en expand_more Añadir política.
- Selecciona Automático en Modo de edición de contenedor.
- En Recursos controlados, selecciona los recursos en los que quieras que se ajuste automáticamente la escala del contenedor.
- Haga clic en Añadir regla para definir uno o varios intervalos mínimos o máximos para las solicitudes de recursos del contenedor:
- Memoria mínima permitida: la cantidad mínima de memoria que debe tener siempre el contenedor, en MiB.
- CPU mínima permitida: la cantidad mínima de CPU que el contenedor siempre debe tener, en mCPU.
- Memoria máxima permitida: la cantidad máxima de memoria que debe tener siempre el contenedor, en MiB.
- CPU máxima permitida: la cantidad máxima de CPU que el contenedor debe tener siempre, en mCPU.
Haz clic en Listo.
Haz clic en Guardar.
gcloud
Para definir las solicitudes de recursos automáticamente, debes usar un clúster que tenga habilitada la función de autoescalado vertical de pods. Los clústeres de Autopilot tienen esta función habilitada de forma predeterminada.
En los clústeres estándar, habilita el autoescalado vertical de pods en tu clúster:
gcloud container clusters update CLUSTER_NAME --enable-vertical-pod-autoscaling
Sustituye
CLUSTER_NAME
por el nombre de tu clúster.Guarda el siguiente archivo de manifiesto como
my-auto-deployment.yaml
:apiVersion: apps/v1 kind: Deployment metadata: name: my-auto-deployment spec: replicas: 2 selector: matchLabels: app: my-auto-deployment template: metadata: labels: app: my-auto-deployment spec: containers: - name: my-container image: registry.k8s.io/ubuntu-slim:0.14 resources: requests: cpu: 100m memory: 50Mi command: ["/bin/sh"] args: ["-c", "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done"]
Este manifiesto describe un Deployment que tiene dos pods. Cada pod tiene un contenedor que solicita 100 milicpus y 50 MiB de memoria.
Aplica el manifiesto al clúster:
kubectl create -f my-auto-deployment.yaml
Lista los pods en ejecución:
kubectl get pods
El resultado muestra los nombres de los pods de
my-deployment
:NAME READY STATUS RESTARTS AGE my-auto-deployment-cbcdd49fb-d6bf9 1/1 Running 0 8s my-auto-deployment-cbcdd49fb-th288 1/1 Running 0 8s
Guarda el siguiente archivo de manifiesto como
my-vpa.yaml
:apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: my-vpa spec: targetRef: apiVersion: "apps/v1" kind: Deployment name: my-auto-deployment updatePolicy: updateMode: "Recreate"
Este manifiesto describe un
VerticalPodAutoscaler
con las siguientes propiedades:targetRef.name
: especifica que cualquier Pod controlado por un Deployment llamadomy-deployment
pertenece a esteVerticalPodAutoscaler
.updateMode: "Recreate"
: especifica que el controlador de la herramienta de adaptación dinámica vertical de pods puede eliminar un pod, ajustar las solicitudes de CPU y de memoria y, a continuación, iniciar un nuevo pod. Este es el comportamiento predeterminado si no se especifica ningún modo (también se denomina modoAuto
). También puedes cambiar el modo de actualización a uno de los siguientes valores:updateMode: "Initial"
: el autoescalado vertical de pods asigna solicitudes de recursos solo en el momento de la creación del pod.updateMode: "InPlaceOrRecreate"
(Vista previa): el autoescalado vertical de pods intenta actualizar los recursos sin volver a crear el pod, pero recurre a la recreación si es necesario.
Aplica el manifiesto al clúster:
kubectl create -f my-vpa.yaml
Espera unos minutos y vuelve a ver los pods en ejecución:
kubectl get pods
La salida muestra que los nombres de los pods han cambiado:
NAME READY STATUS RESTARTS AGE my-auto-deployment-89dc45f48-5bzqp 1/1 Running 0 8s my-auto-deployment-89dc45f48-scm66 1/1 Running 0 8s
Si los nombres de los pods no han cambiado, espera un poco más y vuelve a ver los pods en ejecución.
Ver información sobre un autoescalador de pods vertical
Para ver los detalles de un autoescalador de pods vertical, haz lo siguiente:
Obtén información detallada sobre uno de tus pods en ejecución:
kubectl get pod POD_NAME --output yaml
Sustituye
POD_NAME
por el nombre de uno de tus pods que has obtenido en el paso anterior.El resultado debería ser similar al siguiente:
apiVersion: v1 kind: Pod metadata: annotations: vpaUpdates: 'Pod resources updated by my-vpa: container 0: cpu capped to node capacity, memory capped to node capacity, cpu request, memory request' ... spec: containers: ... resources: requests: cpu: 510m memory: 262144k ...
En este resultado se muestra que el controlador de autoescalado vertical de pods tiene una solicitud de memoria de 262144 k y una solicitud de CPU de 510 milicpus.
Obtén información detallada sobre
VerticalPodAutoscaler
:kubectl get vpa my-vpa --output yaml
El resultado debería ser similar al siguiente:
... recommendation: containerRecommendations: - containerName: my-container lowerBound: cpu: 536m memory: 262144k target: cpu: 587m memory: 262144k upperBound: cpu: 27854m memory: "545693548"
En este resultado se muestran recomendaciones para las solicitudes de CPU y memoria, y se incluyen las siguientes propiedades:
target
: especifica que, para que el contenedor funcione de forma óptima,debe solicitar 587 milicpus y 262.144 kilobytes de memoria.lowerBound
yupperBound
: el autoescalado vertical de pods usa estas propiedades para decidir si debe eliminar un pod y sustituirlo por otro. Si un pod tiene solicitudes inferiores al límite inferior o superiores al límite superior, la herramienta de adaptación dinámica vertical de pods elimina el pod y lo sustituye por otro que cumpla el atributo objetivo.
Inhabilitar contenedores específicos
Puedes inhabilitar el autoescalado de pods vertical en contenedores específicos mediante la CLI de gcloud o la Trusted Cloud consola.
Consola
Para inhabilitar el autoescalado vertical de pods en contenedores específicos, debes tener un clúster con la función de autoescalado vertical de pods habilitada. Los clústeres de Autopilot tienen habilitada de forma predeterminada la función de autoescalado vertical de pods.
Habilitar el autoescalado de pods vertical
Ve a la página Google Kubernetes Engine en la consola de Trusted Cloud .
En la lista de clústeres, haga clic en el nombre del clúster que quiera modificar.
En la sección Automatización, haz clic en edit Editar en la opción Autoescalado vertical de pods.
Selecciona la casilla Habilitar autoescalado de pods vertical.
Haz clic en Guardar cambios.
Configurar el autoescalado de pods vertical
Ve a la página Cargas de trabajo de la Trusted Cloud consola.
En la lista de cargas de trabajo, haz clic en el nombre del Deployment para el que quieras configurar el autoescalado de pods vertical.
Haz clic en list Acciones > Autoescalado > Autoescalado vertical de pods.
Elige un modo de autoescalado:
- Modo automático: el autoescalado vertical de pods actualiza las solicitudes de CPU y de memoria durante el ciclo de vida de un pod.
- Modo inicial: el autoescalado vertical de pods asigna solicitudes de recursos solo cuando se crea el pod y nunca las cambia después.
Haz clic en expand_more Añadir política.
Selecciona el contenedor del que quieras inhabilitar el seguimiento.
En Modo de edición de contenedor, selecciona Desactivado.
Haz clic en Listo.
Haz clic en Guardar.
gcloud
Para inhabilitar el autoescalado de pods vertical en contenedores específicos, sigue estos pasos:
Guarda el siguiente archivo de manifiesto como
my-opt-vpa.yaml
:apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: my-opt-vpa spec: targetRef: apiVersion: "apps/v1" kind: Deployment name: my-opt-deployment updatePolicy: updateMode: "Recreate" resourcePolicy: containerPolicies: - containerName: my-opt-sidecar mode: "Off"
Este archivo de manifiesto describe un
VerticalPodAutoscaler
. El valormode: "Off"
desactiva las recomendaciones del contenedormy-opt-sidecar
.Aplica el manifiesto al clúster:
kubectl apply -f my-opt-vpa.yaml
Guarda el siguiente archivo de manifiesto como
my-opt-deployment.yaml
:apiVersion: apps/v1 kind: Deployment metadata: name: my-opt-deployment spec: replicas: 1 selector: matchLabels: app: my-opt-deployment template: metadata: labels: app: my-opt-deployment spec: containers: - name: my-opt-container image: nginx - name: my-opt-sidecar image: busybox command: ["sh","-c","while true; do echo Doing sidecar stuff!; sleep 60; done"]
Aplica el manifiesto al clúster:
kubectl apply -f my-opt-deployment.yaml
Después de un tiempo, consulta la herramienta de adaptación dinámica vertical de pods:
kubectl get vpa my-opt-vpa --output yaml
El resultado muestra recomendaciones para las solicitudes de CPU y memoria:
... recommendation: containerRecommendations: - containerName: my-opt-container ...
En este resultado, solo hay recomendaciones para un contenedor. No hay recomendaciones para
my-opt-sidecar
.La herramienta de adaptación dinámica vertical de pods nunca actualiza los recursos de los contenedores que no se han incluido. Si esperas unos minutos, el pod se volverá a crear, pero solo un contenedor tendrá solicitudes de recursos actualizadas.
Identificar cargas de trabajo sin solicitudes ni límites de recursos
Puede que quieras identificar las cargas de trabajo que no tienen configuradas solicitudes ni límites de recursos, ya que GKE recomienda definir solicitudes y límites de recursos para todas las cargas de trabajo como práctica recomendada para evitar que los pods se terminen de forma abrupta cuando los recursos de los nodos estén bajo presión y para mejorar la precisión de la asignación de costes. Definir pods BestEffort o pods con memoria Burstable puede provocar problemas de fiabilidad cuando un nodo experimenta presión de memoria. Siga estas prácticas recomendadas para definir las solicitudes y los límites de recursos de los contenedores:
- Memoria: asigna la misma cantidad de memoria a la solicitud y al límite.
- CPU: en la solicitud, especifica la CPU mínima necesaria para asegurar el correcto funcionamiento, de acuerdo con tus propios SLOs. Define un límite de CPU ilimitado.
GKE genera estadísticas y recomendaciones para las cargas de trabajo que se ejecutan sin solicitudes ni límites de recursos.
En la siguiente tabla se describen los escenarios de configuración de recursos que detecta GKE y los criterios de cada escenario.
Subtipo de estadística | Falta el escenario de configuración | Detalles |
---|---|---|
REQUEST_OR_LIMIT_NOT_SET |
No se ha configurado ninguna solicitud ni límite de memoria.
(MEMORY_REQUEST_AND_LIMIT_NOT_SET )
|
Los pods se están ejecutando sin que se hayan definido solicitudes ni límites de memoria para sus contenedores. GKE no puede limitar el uso de memoria y puede terminar de forma abrupta estos pods si un nodo experimenta presión de memoria, lo que puede provocar problemas de fiabilidad. |
REQUEST_OR_LIMIT_NOT_SET |
No se han configurado límites de memoria.
(MEMORY_LIMIT_NOT_SET )
|
Los pods se ejecutan sin límites de memoria definidos para sus contenedores. GKE no puede limitar el uso de memoria y puede terminar de forma abrupta esos pods si un nodo experimenta presión de memoria y el uso de memoria de los pods supera las solicitudes, lo que puede provocar problemas de fiabilidad. Debes definir la misma cantidad de memoria para las solicitudes y los límites para evitar que los pods usen más memoria de la solicitada. |
REQUEST_OR_LIMIT_NOT_SET |
No se ha configurado ninguna solicitud ni límite de CPU.
(CPU_REQUEST_AND_LIMIT_NOT_SET )
|
Los pods se ejecutan sin solicitudes ni límites de CPU definidos para los contenedores. De esta forma, aumentan las probabilidades de que se agoten los recursos de los nodos, es más probable que se limite el uso de los pods cuando la utilización de la CPU de los nodos se acerque a su límite y pueden producirse problemas de rendimiento. |
Para obtener más información sobre estas estadísticas, sigue las instrucciones para ver estadísticas y recomendaciones.
Comprobar manualmente las solicitudes y los límites de recursos
Puede que quieras revisar manualmente qué solicitudes y límites de recursos faltan y deben especificarse para una carga de trabajo determinada, de modo que puedas actualizar la configuración según lo recomendado.
Para revisar o actualizar la configuración de las solicitudes y los límites de recursos de una carga de trabajo específica, haz lo siguiente:
Ve a la página Cargas de trabajo de la Trusted Cloud consola.
En la lista de cargas de trabajo, haga clic en el nombre de la carga de trabajo que quiera inspeccionar.
Haz clic en list Acciones > Escalar > Editar solicitudes de recursos.
- En la sección Ajustar solicitudes y límites de recursos se muestran las solicitudes de CPU y memoria de cada contenedor.
Siguientes pasos
- Consulta más información sobre el autoescalado vertical de pods.
- Consulta las prácticas recomendadas para ejecutar aplicaciones de Kubernetes de coste optimizado en GKE.
- Consulta cómo optimizar el uso de GKE con estadísticas y recomendaciones.