Escala solicitudes y límites de recursos de contenedor


En esta página, se explica cómo puedes analizar y ajustar las solicitudes de CPU y las solicitudes de memoria de un contenedor en un clúster de Google Kubernetes Engine (GKE) mediante el Ajuste de escala automático vertical de Pods.

Puedes escalar los recursos de contenedor de forma manual a través de la consola de Google Cloud, analizar los recursos con un objeto VerticalPodAutoscaler o configurar el ajuste de escala automático mediante el ajuste de escala automático vertical de Pods.

Antes de comenzar

Antes de comenzar, asegúrate de haber realizado las siguientes tareas:

  • Habilita la API de Kubernetes Engine de Google.
  • Habilitar la API de Kubernetes Engine de Google
  • Si deseas usar Google Cloud CLI para esta tarea, instala y, luego, inicializa gcloud CLI. Si ya instalaste gcloud CLI, ejecuta gcloud components update para obtener la versión más reciente.

Analiza las solicitudes de recursos

El escalador automático vertical de Pods analiza tus contenedores de forma automática y proporciona solicitudes de recursos sugeridas. Puedes ver estas solicitudes de recursos con la consola de Gppgñe Cloud, Cloud Monitoring o Google Cloud CLI.

Consola

Para ver las solicitudes de recursos sugeridas en la consola de Google Cloud, debes tener implementada una carga de trabajo existente que tenga al menos 24 horas. Es posible que algunas sugerencias no estén disponibles o no sean relevantes para ciertas cargas de trabajo, como las que se crearon en las últimas 24 horas, los Pods independientes y las apps escritas en Java.

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

    Ir a Cargas de trabajo

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

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

    En la sección Analiza datos de uso de recursos, se muestran datos históricos de uso que el controlador del escalador automático vertical de Pods analizó para crear las solicitudes de recursos sugeridas en la sección Ajusta las solicitudes y límites de recursos.

Cloud Monitoring

Para ver las solicitudes de recursos sugeridas en Cloud Monitoring, debes tener una carga de trabajo existente implementada.

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

    Ir al Explorador de métricas

  2. Haz clic en Configuración.

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

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

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

  6. En el menú Métrica, selecciona Recomendado por bytes de solicitudes de réplica y Recomendado por núcleo de solicitud de réplica.

  7. Haga clic en Aplicar.

CLI de gcloud

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

  1. En el caso de los clústeres estándar, habilita el ajuste de escala automático vertical de Pods en tu clúster. En el caso de los clústeres Autopilot, Ajuste de escala automático vertical de Pods está habilitado de forma predeterminada.

    gcloud container clusters update CLUSTER_NAME --enable-vertical-pod-autoscaling
    

    Reemplaza CLUSTER_NAME por el nombre del clúster.

  2. Guarda el siguiente 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
    

    En este manifiesto, se describe una Deployment que no tiene solicitudes de CPU ni de memoria. El valor containers.name de my-rec-deployment especifica que todos los Pods en la implementación pertenecen a VerticalPodAutoscaler.

  3. Aplica el manifiesto al clúster:

    kubectl create -f my-rec-deployment.yaml
    
  4. Guarda el siguiente 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"
    

    En este manifiesto, se describe un VerticalPodAutoscaler. El valor updateMode de Off significa que, cuando se crean los pods, el controlador del escalador automático 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 del escalador automático vertical de Pods no actualiza de forma automática las solicitudes de recursos para ejecutar contenedores.

  5. Aplica el manifiesto al clúster:

    kubectl create -f my-rec-vpa.yaml
    
  6. Después de un tiempo, observa VerticalPodAutoscaler:

    kubectl get vpa my-rec-vpa --output yaml
    

    El resultado es similar a este:

    ...
      recommendation:
        containerRecommendations:
        - containerName: my-rec-container
          lowerBound:
            cpu: 25m
            memory: 262144k
          target:
            cpu: 25m
            memory: 262144k
          upperBound:
            cpu: 7931m
            memory: 8291500k
    ...
    

    El resultado muestra recomendaciones para requisitos de CPU y memoria.

Configura las solicitudes de recursos de Pods de forma manual

Puedes configurar las solicitudes de recursos de Pods de forma manual con Google Cloud CLI o la consola de Google Cloud.

Consola

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

    Ir a Cargas de trabajo

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

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

    1. En la sección Ajusta las solicitudes y límites de recursos, se muestran las solicitudes actuales de CPU y memoria para cada contenedor, así como las solicitudes de CPU y memoria sugeridas.
  4. Haz clic en Aplicar las sugerencias más recientes para ver las solicitudes sugeridas de cada contenedor.

  5. Haz clic en Save Changes.

  6. Haz clic en Confirmar.

gcloud

Para configurar las solicitudes de recursos de un Pod, configura los valores requests.cpu y memory.cpu en tu manifiesto de Deployment. En este ejemplo, modificas de forma manual la implementación creada en Analiza las solicitudes de recursos con solicitudes de recursos sugeridos.

  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 una implementación que tiene dos Pods. Cada Pod tiene un contenedor que requiere 25 millicores de CPU y 256 MiB de memoria.

  2. Aplica el manifiesto al clúster:

    kubectl apply -f my-adjusted-deployment.yaml
    

También puedes aplicar los cambios de forma manual si sigues estos pasos:

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

    Ir a Cargas de trabajo

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

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

  4. Configura tus solicitudes de contenedor.

  5. Haz clic en Obtener equivalente de YAML.

  6. Haz clic en Descargar Workload o copia y pega el manifiesto en un archivo llamado resource-adjusted.yaml.

  7. Aplica el manifiesto al clúster:

    kubectl create -f resource-adjusted.yaml
    

Establece solicitudes de recursos de Pods de forma automática

El Ajuste de escala automático vertical de Pods usa el objeto VerticalPodAutoscaler para configurar de forma automática las solicitudes de recursos en los Pods cuando updateMode es Auto. Puedes configurar un VerticalPodAutoscaler con la CLI de gcloud o la consola de Google Cloud.

Consola

Para configurar las solicitudes de recursos de forma automática, debes tener habilitado un clúster con la función de ajuste de escala automático vertical de Pods. Los clústeres de Autopilot tienen la función de ajuste de escala automático vertical de Pods habilitada de forma predeterminada.

Habilita el ajuste de escala automático vertical de Pods

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

    Ir a Google Kubernetes Engine

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

  3. En la sección Automatización, haz clic en Editar en la opción Ajuste de escala automático vertical de Pods.

  4. Selecciona la casilla de verificación Habilitar Ajuste de escala automático vertical de Pods.

  5. Haga clic en Guardar cambios.

Configura el ajuste de escala automático vertical de Pods

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

    Ir a Cargas de trabajo

  2. En la lista de cargas de trabajo, haz clic en el nombre de la implementación para la que deseas configurar el ajuste de escala automático vertical de Pods.

  3. Haz clic en Acciones > Ajustar escala automáticamente > Ajuste de escala automático vertical de Pods.

  4. Elige un modo de ajuste de escala automático:

    • Modo automático: Ajuste de escala automático vertical de Pods actualiza las solicitudes de CPU y memoria durante la vida útil de un Pod.
    • Modo inicial: Ajuste de escala automático vertical de Pods asigna solicitudes de recursos solo durante la creación del Pod y nunca las cambia más adelante.
  5. Configura políticas de contenedores (opcional). Esta opción te permite asegurarte de que la recomendación nunca se configure por encima o por debajo de una solicitud de recursos especificada.

    1. Haz clic en Agregar política.
    2. Selecciona Automático para Editar modo de contenedor.
    3. En Recursos controlados, selecciona los recursos en los que deseas escalar de forma automática el contenedor.
    4. Haz clic en Agregar regla a fin de establecer uno o más rangos mínimos o máximos para las solicitudes de recursos del contenedor:
      • Mín. memoria permitida: La cantidad mínima de memoria que el contenedor siempre debe tener, en MiB.
      • Mínimo CPU permitida: la cantidad mínima de CPU que el contenedor siempre debe tener, en mCPU.
      • Cantidad máxima de memoria permitida: la cantidad máxima de memoria que el contenedor siempre debe tener, en MiB.
      • Cantidad máxima de CPU permitida: La cantidad máxima de CPU que el contenedor siempre debe tener, en mCPU.
  6. Haga clic en Listo.

  7. Haz clic en Guardar.

gcloud

Para configurar las solicitudes de recursos de forma automática, debes usar un clúster que tenga habilitada la función de ajuste de escala automático vertical de Pods. Los clústeres de Autopilot tienen la función habilitada de forma predeterminada.

  1. En el caso de los clústeres estándar, habilita el ajuste de escala automático vertical de Pods en tu clúster:

    gcloud container clusters update CLUSTER_NAME --enable-vertical-pod-autoscaling
    

    Reemplaza CLUSTER_NAME por el nombre del clúster.

  2. Guarda el siguiente 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.1
            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 una implementación que tiene dos Pods. Cada pod tiene un contenedor que requiere 100 millicores de CPU y 50 MiB de memoria.

  3. Aplica el manifiesto al clúster:

    kubectl create -f my-auto-deployment.yaml
    
  4. Enumera los pods en ejecución:

    kubectl get pods
    

    En el resultado se muestran los nombres de los Pods en 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 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: "Auto"
    

    En este manifiesto, se describe un VerticalPodAutoscaler con las siguientes propiedades:

    • targetRef.name: Especifica que cualquier Pod que esté controlado por una implementación llamada my-deployment pertenece a este VerticalPodAutoscaler.
    • updateMode: Auto: Especifica que el controlador del escalador automático vertical de Pods puede borrar un Pod, ajustar las solicitudes de CPU y memoria y, luego, iniciar un Pod nuevo.

    También puedes configurar el ajuste de escala automático vertical de Pods para asignar solicitudes de recursos solo en el momento de la creación del Pod mediante updateMode: "Initial".

  6. Aplica el manifiesto al clúster:

    kubectl create -f my-vpa.yaml
    
  7. Espera unos minutos y vuelve a visualizar los Pods en ejecución:

    kubectl get pods
    

    El resultado muestra que los nombres de los Pods cambiaron:

    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 cambiaron, espera un poco más y, luego, vuelve a ver los Pods en ejecución.

Obtén información sobre un escalador automático vertical de Pods

Para ver los detalles de un escalador automático vertical de Pods, haz lo siguiente:

  1. Obtén información detallada sobre uno de los Pods en ejecución:

    kubectl get pod POD_NAME --output yaml
    

    Reemplaza POD_NAME por el nombre de uno de los Pods que recuperaste en el paso anterior.

    El resultado es similar a este:

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

    Este resultado muestra que el controlador del escalador automático vertical de Pods tiene una solicitud de memoria de 262,144,000 y una solicitud de CPU de 510 millicores de CPU.

  2. Obtén información detallada sobre VerticalPodAutoscaler:

    kubectl get vpa my-vpa --output yaml
    

    El resultado es similar a este:

    ...
      recommendation:
        containerRecommendations:
        - containerName: my-container
          lowerBound:
            cpu: 536m
            memory: 262144k
          target:
            cpu: 587m
            memory: 262144k
          upperBound:
            cpu: 27854m
            memory: "545693548"
    

    En esta salida, se muestran recomendaciones para las solicitudes de CPU y memoria y se incluyen las siguientes propiedades:

    • target: Especifica que, para que el contenedor se ejecute de manera óptima, debe solicitar 587 millicores de CPU y 26,2144 KB de memoria.
    • lowerBound y upperBound: El ajuste de escala automático vertical de Pods usa estas propiedades para decidir si debe borrar un Pod y reemplazarlo por uno nuevo. Si un Pod tiene solicitudes menores que el límite inferior (lower bound) o mayores que el límite superior (upper bound), el escalador automático vertical de Pods borra el Pod y lo reemplaza por un Pod que cumpla con el atributo de destino.

Inhabilita contenedores específicos

Puedes inhabilitar contenedores específicos del ajuste de escala automático vertical de Pods mediante la CLI de gcloud o la consola de Google Cloud.

Consola

Para inhabilitar contenedores específicos del ajuste de escala automático vertical de Pods, debes tener un clúster con la función de ajuste de escala automático vertical de Pods habilitada. Los clústeres de Autopilot tienen la función de ajuste de escala automático vertical de Pods habilitada de forma predeterminada.

Habilita el ajuste de escala automático vertical de Pods

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

    Ir a Google Kubernetes Engine

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

  3. En la sección Automatización, haz clic en Editar en la opción Ajuste de escala automático vertical de Pods.

  4. Selecciona la casilla de verificación Habilitar Ajuste de escala automático vertical de Pods.

  5. Haga clic en Guardar cambios.

Configura el ajuste de escala automático vertical de Pods

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

    Ir a Cargas de trabajo

  2. En la lista de cargas de trabajo, haz clic en el nombre de la implementación para la que deseas configurar el ajuste de escala automático vertical de Pods.

  3. Haz clic en Acciones > Ajustar escala automáticamente > Ajuste de escala automático vertical de Pods.

  4. Elige un modo de ajuste de escala automático:

    • Modo automático: Ajuste de escala automático vertical de Pods actualiza las solicitudes de CPU y memoria durante la vida útil de un Pod.
    • Modo inicial: Ajuste de escala automático vertical de Pods asigna solicitudes de recursos solo durante la creación del Pod y nunca las cambia más adelante.
  5. Haz clic en Agregar política.

  6. Selecciona el contenedor que deseas inhabilitar.

  7. En Editar modo de contenedor, selecciona Desactivar.

  8. Haga clic en Listo.

  9. Haz clic en Guardar.

gcloud

Para inhabilitar contenedores específicos del ajuste de escala automático vertical de Pods, sigue estos pasos:

  1. Guarda el siguiente 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: "Auto"
      resourcePolicy:
        containerPolicies:
        - containerName: my-opt-sidecar
          mode: "Off"
    

    En este manifiesto, se 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 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 el escalador automático vertical de Pods:

    kubectl get vpa my-opt-vpa --output yaml
    

    El resultado muestra recomendaciones para requisitos 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.

    El escalador automático vertical de Pods nunca actualiza los recursos en los contenedores inhabilitados. Si esperas unos minutos, el pod se vuelve a crear, pero solo un contenedor tiene solicitudes de recursos actualizadas.

¿Qué sigue?