Escalado manual

En esta página se describe cómo escalar manualmente tu servicio. También se proporcionan instrucciones para un caso práctico habitual: cambiar el número de instancias según una programación mediante tareas de Cloud Scheduler y la API Admin de Cloud Run.

Información general

De forma predeterminada, Cloud Run escala automáticamente hasta un número máximo de instancias especificado o predeterminado en función del tráfico y del uso de la CPU. Sin embargo, en algunos casos prácticos, puede que quieras definir un número específico de instancias mediante el escalado manual.

El escalado manual te permite definir un número específico de instancias, independientemente del tráfico o la utilización, y sin necesidad de volver a implementar. Todo esto te da la opción de escribir tu propia lógica de escalado mediante un sistema externo. Consulta un ejemplo de esto en Escalar en función de una programación.

Ajustes mínimos y máximos a nivel de revisión y escalado manual

Si configura el escalado manual de su servicio, se ignorarán los ajustes de instancias mínimas y máximas a nivel de revisión.

Divisiones del tráfico para el escalado manual

En la siguiente lista se describe cómo se asignan las instancias al dividir el tráfico con el escalado manual. Esto incluye el comportamiento de las revisiones solo de etiquetas de tráfico.

  • Durante una división del tráfico, a cada revisión se le asignan instancias de forma proporcional, según la división del tráfico, de forma similar a la división del tráfico con instancias mínimas a nivel de servicio.

  • Si el número de revisiones que reciben tráfico supera el número de instancias manual, algunas de las revisiones no tendrán instancias. El tráfico enviado a esas revisiones recibirá el mismo error que si las revisiones estuvieran inhabilitadas.

  • En todas las revisiones que reciban tráfico en una división de tráfico, se inhabilitarán las instancias mínimas y máximas a nivel de revisión.

  • Si una revisión está activa solo debido a las etiquetas de tráfico:

    • Si se define un número mínimo de instancias a nivel de revisión, se iniciará el número de instancias especificado, pero no se tendrá en cuenta en el número total de instancias manuales del servicio. La revisión no se escalará automáticamente.
    • Si no se define el número mínimo de instancias a nivel de revisión, la revisión se amplía a una instancia como máximo en respuesta al tráfico enviado a la URL de la etiqueta.

Comportamiento de facturación con el escalado manual

Cuando usas el escalado manual, el comportamiento de facturación es similar al que se produce cuando usas la función instancias mínimas.

Es decir, con el escalado manual y la facturación basada en instancias, las instancias inactivas escaladas manualmente se facturan como instancias activas.

Si usas el escalado manual con la facturación basada en solicitudes, las instancias inactivas escaladas manualmente se facturan como instancias mínimas inactivas. Para obtener información completa sobre la facturación, consulta la página de precios.

Roles obligatorios

Para obtener los permisos que necesitas para desplegar servicios de Cloud Run, pide a tu administrador que te conceda los siguientes roles de gestión de identidades y accesos:

Para ver una lista de los roles y permisos de gestión de identidades y accesos asociados a Cloud Run, consulta los artículos sobre roles de gestión de identidades y accesos de Cloud Run y permisos de gestión de identidades y accesos de Cloud Run. Si tu servicio de Cloud Run interactúa con APIs, como las bibliotecas de cliente de Cloud, consulta la guía de configuración de la identidad del servicio.Google Cloud Para obtener más información sobre cómo conceder roles, consulta los artículos sobre permisos de implementación y gestión del acceso.

Configurar el escalado

Puedes configurar el modo de escalado mediante la consola Google Cloud , la CLI de Google Cloud, un archivo YAML o una API al crear o actualizar un servicio:

Consola

  1. En la Google Cloud consola, ve a Cloud Run:

    Ir a Cloud Run

  2. Si vas a configurar un servicio nuevo, selecciona Servicios en el menú y haz clic en Implementar contenedor para que se muestre el formulario Crear servicio. Si va a configurar un servicio, haga clic en él para que se muestre el panel de detalles y, a continuación, haga clic en el icono del lápiz situado junto a Escalado en la parte superior derecha del panel de detalles.

  3. Busca el formulario Escalado de servicio (para un servicio nuevo) o el formulario Editar escalado (para un servicio que ya tengas).

    imagen

    En el campo Número de instancias, especifica el número de instancias de contenedor del servicio.

  4. Haga clic en Crear para crear un servicio o en Guardar para guardar un servicio.

gcloud

Para especificar el escalado de un nuevo servicio, usa el comando deploy:

gcloud run deploy SERVICE \
    --scaling=INSTANCE_COUNT \
    --image IMAGE_URL

Haz los cambios siguientes:

  • SERVICE: el nombre de tu servicio.
  • INSTANCE_COUNT: el número de instancias del servicio. De esta forma, el servicio se configura para que se escale manualmente. Especifica el valor 0 para inhabilitar el servicio. Especifica el valor auto para usar el comportamiento de autoescalado predeterminado de Cloud Run.
  • IMAGE_URL: una referencia a la imagen del contenedor, por ejemplo, us-docker.pkg.dev/cloudrun/container/hello:latest. Si usas Artifact Registry, el repositorio REPO_NAME ya debe estar creado. La URL sigue el formato LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG .

Especifica el escalado de un servicio que ya tengas con el siguiente comando update:

gcloud run services update SERVICE \
   --scaling=INSTANCE_COUNT

YAML

  1. Si va a crear un servicio, puede saltarse este paso. Si va a actualizar un servicio, descargue su configuración YAML:

    gcloud run services describe SERVICE --format export > service.yaml
  2. Actualiza los atributos scalingMode y manualInstanceCount:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
      annotations:
      run.googleapis.com/scalingMode: MODE
      run.googleapis.com/manualInstanceCount: INSTANCE_COUNT

    Haz los cambios siguientes:

    • SERVICE: el nombre de tu servicio de Cloud Run
    • MODE: manual para el escalado manual o automatic para el comportamiento de escalado automático predeterminado de Cloud Run.
    • INSTANCE_COUNT: el número de instancias que estás escalando manualmente para el servicio. Especifica el valor 0 para inhabilitar el servicio.
  3. Crea o actualiza el servicio con el siguiente comando:

    gcloud run services replace service.yaml

API REST

Para actualizar las instancias mínimas a nivel de servicio de un servicio concreto, envía una solicitud HTTP PATCH al endpoint service de la API Admin de Cloud Run.

Por ejemplo, si usas curl:

    curl -H "Content-Type: application/json" \
    -H "Authorization: Bearer ACCESS_TOKEN" \
    -X PATCH \
    -d '{"scaling":{"manualInstanceCount":MANUAL_INSTANCE_COUNT }}' \
    https://run.googleapis.com/v2/projects/PROJECT_ID/locations/REGION/services/SERVICE?update_mask=scaling.manualInstanceCount

Haz los cambios siguientes:

  • ACCESS_TOKEN: un token de acceso válido para una cuenta que tenga los permisos de gestión de identidades y accesos para actualizar un servicio. Por ejemplo, si has iniciado sesión en gcloud, puedes obtener un token de acceso mediante gcloud auth print-access-token. Desde una instancia de contenedor de Cloud Run, puedes obtener un token de acceso mediante el servidor de metadatos de la instancia de contenedor.
  • MANUAL_INSTANCE_COUNT: el número de instancias del servicio. De esta forma, el servicio se configura para que se escale manualmente. Especifica el valor 0 para inhabilitar el servicio.
  • SERVICE: el nombre del servicio.
  • REGION: la Google Cloud región en la que se ha implementado el servicio.
  • PROJECT_ID: el ID del proyecto. Google Cloud

Terraform

Para saber cómo aplicar o quitar una configuración de Terraform, consulta Comandos básicos de Terraform.

Añade lo siguiente a un recurso google_cloud_run_v2_service en tu configuración de Terraform:
resource "google_cloud_run_v2_service" "default" {
  name     = "SERVICE_NAME"
  location = "REGION"

  template {
    containers {
      image = "IMAGE_URL"
    }
  }
  scaling {
    scaling_mode = "MANUAL"
    manual_instance_count = "INSTANCE_COUNT"
  }
}

Haz los cambios siguientes:

  • SERVICE_NAME: el nombre de tu servicio de Cloud Run.
  • REGION: la Google Cloud región. Por ejemplo, europe-west1.
  • IMAGE_URL: una referencia a la imagen del contenedor, por ejemplo, us-docker.pkg.dev/cloudrun/container/hello:latest. Si usas Artifact Registry, el repositorio REPO_NAME ya debe estar creado. La URL sigue el formato LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG .
  • INSTANCE_COUNT: el número de instancias que estás escalando manualmente para el servicio. Este número de instancias se divide entre todas las revisiones con el tráfico especificado en función del porcentaje de tráfico que reciben.

Ver la configuración de escalado de un servicio

Para ver las instancias de configuración de escalado de tu servicio de Cloud Run, sigue estos pasos:

Consola

  1. En la Google Cloud consola, ve a Cloud Run:

    Ir a Cloud Run

  2. Haz clic en el servicio que te interese para abrir el panel Detalles del servicio.

  3. El ajuste de escalado actual se muestra en la parte superior derecha del panel de detalles del servicio, después de la etiqueta Escalado, junto al icono del lápiz.

gcloud

Usa el siguiente comando para ver la configuración de escalado actual del servicio:

gcloud run services describe SERVICE

Sustituye SERVICE por el nombre de tu servicio.

Busca el campo Scaling: Manual (Instances: ) cerca de la parte superior del texto devuelto por describe.

YAML

Usa el siguiente comando para descargar la configuración YAML del servicio:

gcloud run services describe SERVICE --format export > service.yaml

La configuración del escalado se incluye en los atributos scalingMode y manualInstanceCount.

Inhabilitar un servicio

Cuando inhabilita un servicio, se permite que se completen las solicitudes que se estén procesando en ese momento. Sin embargo, las solicitudes posteriores a la URL del servicio fallarán con un error Service unavailable o Service disabled.

Las solicitudes de revisiones de servicios que solo están activas debido a las etiquetas de tráfico no se ven afectadas porque esas revisiones no están inhabilitadas.

Para inhabilitar un servicio, debes definir el escalado en cero. Puedes inhabilitar un servicio mediante la Google Cloud consola, la CLI de Google Cloud, un archivo YAML o una API:

Consola

  1. En la Google Cloud consola, ve a Cloud Run:

    Ir a Cloud Run

  2. Haga clic en el servicio que quiera inhabilitar para que se muestre su panel de detalles y, a continuación, haga clic en el icono de lápiz situado junto a Escalado en la parte superior derecha del panel de detalles.

  3. Busca el formulario Editar escalado y selecciona Escalado manual.

    imagen

    En el campo Número de instancias, introduce el valor 0 (cero).

  4. Haz clic en Guardar.

gcloud

Para inhabilitar un servicio, usa el siguiente comando para definir el escalado en cero:

gcloud run services update SERVICE --scaling=0

Sustituye SERVICE por el nombre de tu servicio.

YAML

  1. Descarga la configuración YAML de tu servicio:

    gcloud run services describe SERVICE --format export > service.yaml
  2. Asigna el valor cero (0) al atributo manualInstanceCount:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
      annotations:
      run.googleapis.com/scalingMode: manual
      run.googleapis.com/manualInstanceCount: `0`

    Sustituye SERVICE por el nombre de tu servicio de Cloud Run.

  3. Crea o actualiza el servicio con el siguiente comando:

    gcloud run services replace service.yaml

API REST

Para inhabilitar un servicio, envía una solicitud HTTP PATCH al endpoint service de la API Cloud Run Admin.

Por ejemplo, si usas curl:

    curl -H "Content-Type: application/json" \
    -H "Authorization: Bearer ACCESS_TOKEN" \
    -X PATCH \
    -d '{"scaling":{"manualInstanceCount":0 }}' \
    https://run.googleapis.com/v2/projects/PROJECT_ID/locations/REGION/services/SERVICE?update_mask=scaling.manualInstanceCount

Haz los cambios siguientes:

Terraform

Para inhabilitar un servicio, asigna el valor cero (0) al atributo manual_instance_count:

resource "google_cloud_run_v2_service" "default" {
  name     = "SERVICE_NAME"
  location = "REGION"

  template {
    containers {
      image = "IMAGE_URL"
    }
  }
  scaling {
    scaling_mode = "MANUAL"
    manual_instance_count = "0"
  }
}

Haz los cambios siguientes:

  • SERVICE_NAME: el nombre de tu servicio de Cloud Run.
  • REGION: la Google Cloud región. Por ejemplo, europe-west1.
  • IMAGE_URL: una referencia a la imagen del contenedor, por ejemplo, us-docker.pkg.dev/cloudrun/container/hello:latest. Si usas Artifact Registry, el repositorio REPO_NAME ya debe estar creado. La URL sigue el formato LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG

Ejemplo de escalado basado en programaciones

Un caso de uso habitual del escalado manual es cambiar el número de instancias según un horario predefinido. En este ejemplo, usamos Cloud Scheduler para programar dos trabajos. Cada uno de ellos invoca la API Admin de Cloud Run para escalar el número de instancias. El primer trabajo configura el servicio para que se escale manualmente a 10 instancias durante el horario de oficina (de 9:00 a 17:00, de lunes a viernes). El segundo trabajo configura el servicio para que se reduzca a cero instancias durante las horas de descanso.

Ten en cuenta que, al definir las instancias en cero, tal como se muestra en el ejemplo, se inhabilita el servicio, pero no las tareas de Cloud Scheduler. Esas tareas seguirán ejecutándose y restablecerán (y volverán a habilitar) el servicio a 10 instancias según lo programado.

En este ejemplo, usamos la guía de inicio rápido de Cloud Run para simplificar el proceso, pero puedes usar el servicio que quieras.

Para configurar el escalado manual basado en una programación, sigue estos pasos:

  1. Implementa tu servicio con el siguiente comando:

    gcloud run deploy SERVICE \
       --image=us-docker.pkg.dev/cloudrun/container/hello \
       --region=REGION \
       --project PROJECT_ID

    Haz los cambios siguientes:

    • REGION: la región en la que se despliega el servicio de Cloud Run.
    • SERVICE: el nombre del servicio de Cloud Run.
  2. Configura tu servicio para que se escale manualmente a 10 instancias con el siguiente comando:

    gcloud run services update SERVICE \
       --region=REGION \
       --scaling=10
  3. Crea una tarea de Cloud Scheduler que escale manualmente las instancias del servicio a 10 instancias durante el horario de apertura:

    gcloud scheduler jobs create http hello-start-instances \
      --location=REGION \
      --schedule="0 9 * * MON-FRI" \
      --time-zone=America/Los_Angeles \
      --uri=https://run.googleapis.com/v2/projects/PROJECT_ID/
      locations/REGION/services/hello?update_mask=launchStage,scaling.manualInstanceCount \
      --headers=Content-Type=application/json,X-HTTP-Method-Override=PATCH \
      --http-method=PUT \
      --message-body='{"scaling":{"manualInstanceCount":10}}' \
      --oauth-service-account-email=PROJECT_NUMBER-compute@developer.gserviceaccount.com

    Este comando crea un trabajo de Cloud Scheduler que hace una llamada HTTP a la API Admin de Cloud Run y define el número de instancias en 10. En el ejemplo se usa la cuenta de servicio predeterminada de Compute Engine PROJECT_NUMBER-compute@developer.gserviceaccount.com para los trabajos de Cloud Scheduler. Puedes usar cualquier cuenta de servicio que tenga permisos para actualizar servicios de Cloud Run.

  4. Crea una tarea de Cloud Scheduler que escale manualmente las instancias del servicio a cero durante las horas de inactividad para inhabilitar el servicio:

    gcloud scheduler jobs create http hello-stop-instances \
      --location=REGION \
      --schedule="0 17 * * MON-FRI" \
      --time-zone=America/Los_Angeles \
      --uri=https://run.googleapis.com/v2/projects/PROJECT_ID/
      locations/REGION/services/hello?update_mask=launchStage,scaling.manualInstanceCount \
      --headers=Content-Type=application/json,X-HTTP-Method-Override=PATCH \
      --http-method=PUT \
      --message-body='{"scaling":{"manualInstanceCount":0}}' \
      --oauth-service-account-email=PROJECT_NUMBER-compute@developer.gserviceaccount.com

    Este comando crea un trabajo de Cloud Scheduler que hace una llamada HTTP a la API Admin de Cloud Run y establece en cero las instancias de escalado manual. De esta forma, se inhabilita el servicio, pero no las tareas de Cloud Scheduler, que seguirán ejecutándose y restableciendo (y volviendo a habilitar) el servicio a 10 instancias según lo programado.