Escalar las solicitudes y los límites de recursos de los contenedores

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.

  1. Ve a la página Cargas de trabajo de la Trusted Cloud consola.

    Ve a Cargas de trabajo.

  2. En la lista de cargas de trabajo, haz clic en el nombre de la carga de trabajo que quieras escalar.

  3. Haz clic en 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.

  1. Ve a la página Explorador de métricas de la consola de Trusted Cloud .

    Ir a Explorador de métricas

  2. Haz clic en Configuración.

  3. Despliega el menú Seleccionar una métrica.

  4. En el menú Recurso, selecciona Escalado de Kubernetes.

  5. En el menú Categoría de métrica, selecciona Escalador automático.

  6. En el menú Métrica, selecciona Bytes de solicitud recomendados por réplica y Núcleo de solicitud recomendado por réplica.

  7. Haz clic en Aplicar.

CLI de gcloud

Para ver las solicitudes de recursos sugeridas, debes crear un objeto VerticalPodAutoscaler y una implementación.

  1. 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.

  2. 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 valor containers.name de my-rec-deployment especifica que todos los pods de la implementación pertenecen a VerticalPodAutoscaler.

  3. Aplica el manifiesto al clúster:

    kubectl create -f my-rec-deployment.yaml
    
  4. 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 valor updateMode de Off 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 campo status del recurso. El controlador de autoescalado vertical de pods no actualiza automáticamente las solicitudes de recursos de los contenedores en ejecución.

  5. Aplica el manifiesto al clúster:

    kubectl create -f my-rec-vpa.yaml
    
  6. 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

  1. Ve a la página Cargas de trabajo de la Trusted Cloud consola.

    Ve a Cargas de trabajo.

  2. En la lista de cargas de trabajo, haz clic en el nombre de la carga de trabajo que quieras escalar.

  3. Haz clic en Acciones > Escalar > Editar solicitudes de recursos.

    1. 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.
  4. Haz clic en Aplicar las últimas sugerencias para ver las solicitudes sugeridas de cada contenedor.

  5. Haz clic en Guardar cambios.

  6. 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.

  1. 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.

  2. 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

  1. Ve a la página Google Kubernetes Engine en la consola de Trusted Cloud .

    Ir a Google Kubernetes Engine

  2. En la lista de clústeres, haga clic en el nombre del clúster que quiera modificar.

  3. En la sección Automatización, haz clic en Editar en la opción Autoescalado vertical de pods.

  4. Selecciona la casilla Habilitar autoescalado de pods vertical.

  5. Haz clic en Guardar cambios.

Configurar el autoescalado de pods vertical

  1. Ve a la página Cargas de trabajo de la Trusted Cloud consola.

    Ve a Cargas de trabajo.

  2. 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.

  3. Haz clic en Acciones > Autoescalado > Autoescalado vertical de pods.

  4. 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.
  5. (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.

    1. Haz clic en Añadir política.
    2. Selecciona Automático en Modo de edición de contenedor.
    3. En Recursos controlados, selecciona los recursos en los que quieras que se ajuste automáticamente la escala del contenedor.
    4. 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.
  6. Haz clic en Listo.

  7. 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.

  1. 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.

  2. 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.

  3. Aplica el manifiesto al clúster:

    kubectl create -f my-auto-deployment.yaml
    
  4. 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
    
  5. 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 llamado my-deployment pertenece a este VerticalPodAutoscaler.
    • 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 modo Auto). 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.
  6. Aplica el manifiesto al clúster:

    kubectl create -f my-vpa.yaml
    
  7. 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:

  1. 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.

  2. 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 y upperBound: 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

  1. Ve a la página Google Kubernetes Engine en la consola de Trusted Cloud .

    Ir a Google Kubernetes Engine

  2. En la lista de clústeres, haga clic en el nombre del clúster que quiera modificar.

  3. En la sección Automatización, haz clic en Editar en la opción Autoescalado vertical de pods.

  4. Selecciona la casilla Habilitar autoescalado de pods vertical.

  5. Haz clic en Guardar cambios.

Configurar el autoescalado de pods vertical

  1. Ve a la página Cargas de trabajo de la Trusted Cloud consola.

    Ve a Cargas de trabajo.

  2. En la lista de cargas de trabajo, haz clic en el nombre del Deployment para el que quieras configurar el autoescalado de pods vertical.

  3. Haz clic en Acciones > Autoescalado > Autoescalado vertical de pods.

  4. 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.
  5. Haz clic en Añadir política.

  6. Selecciona el contenedor del que quieras inhabilitar el seguimiento.

  7. En Modo de edición de contenedor, selecciona Desactivado.

  8. Haz clic en Listo.

  9. Haz clic en Guardar.

gcloud

Para inhabilitar el autoescalado de pods vertical en contenedores específicos, sigue estos pasos:

  1. 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 valor mode: "Off" desactiva las recomendaciones del contenedor my-opt-sidecar.

  2. Aplica el manifiesto al clúster:

    kubectl apply -f my-opt-vpa.yaml
    
  3. 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"]
    
  4. Aplica el manifiesto al clúster:

    kubectl apply -f my-opt-deployment.yaml
    
  5. 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:

  1. Ve a la página Cargas de trabajo de la Trusted Cloud consola.

    Ve a Cargas de trabajo.

  2. En la lista de cargas de trabajo, haga clic en el nombre de la carga de trabajo que quiera inspeccionar.

  3. Haz clic en Acciones > Escalar > Editar solicitudes de recursos.

    1. En la sección Ajustar solicitudes y límites de recursos se muestran las solicitudes de CPU y memoria de cada contenedor.

Siguientes pasos