Escalonamento manual

Nesta página, descrevemos como escalonar seu serviço manualmente. Também fornecemos instruções para um caso de uso comum: mudar a contagem de instâncias com base em uma programação usando jobs do Cloud Scheduler e a API Cloud Run Admin.

Visão geral

O escalonamento manual permite definir uma contagem de instâncias específica, independentemente do tráfego ou da utilização, e sem exigir a reimplantação. Tudo isso oferece a opção de gravar sua própria lógica de escalonamento usando um sistema externo. Para conferir um exemplo, consulte Escalonamento baseado em programação.

Por padrão, o Cloud Run é escalonado automaticamente para um número máximo especificado ou padrão de instâncias, dependendo do tráfego, da CPU ou das suas metas de utilização de CPU ou simultaneidade personalizadas. No entanto, para alguns casos de uso, talvez você queira definir um número específico de instâncias usando o escalonamento manual.

Configurações mínimas e máximas no nível da revisão e escalonamento manual

Se você definir o serviço para escalonamento manual, todas as configurações mínimas no nível da revisão e máximas de instâncias serão ignoradas.

Divisão de tráfego para escalonamento manual

A lista a seguir descreve como as instâncias são alocadas ao dividir o tráfego no escalonamento manual. Isso inclui o comportamento de revisões somente com tags de tráfego.

  • Durante uma divisão de tráfego, cada revisão recebe instâncias proporcionalmente, com base na divisão de tráfego, semelhante a divisão de tráfego com instâncias mínimas no nível de serviço.

  • Se o número de revisões que recebem tráfego exceder a contagem de instâncias manuais, algumas das revisões não terão instâncias. O tráfego enviado a essas revisões receberá o mesmo erro que se as revisões estivessem desativadas.

  • Para todas as revisões que recebem tráfego em uma divisão de tráfego, as instâncias mínimas e máximas no nível da revisão são desativadas.

  • Se uma revisão estiver ativa apenas devido a tags de tráfego:

    • Se as instâncias mínimas no nível da revisão estiverem definidas, o número especificado de instâncias será iniciado, mas não será contabilizado na contagem total de instâncias manuais do serviço. A revisão não será escalonada automaticamente.
    • Se as instâncias mínimas no nível da revisão não estiverem definidas, a revisão será escalonada para, no máximo, uma instância, em resposta ao tráfego enviado ao URL da tag.

Comportamento de faturamento usando o escalonamento manual

Ao usar o escalonamento manual, o comportamento de faturamento é semelhante ao comportamento ao usar o recurso de instâncias mínimas.

Ou seja, com o escalonamento manual e o faturamento baseado em instâncias, as instâncias inativas escalonadas manualmente são faturadas como instâncias ativas.

Se você usar o escalonamento manual com o faturamento baseado em solicitações, as instâncias inativas escalonadas manualmente serão faturadas como instâncias mínimas inativas. Para detalhes completos de faturamento, consulte a página de preços.

Funções exigidas

Para receber as permissões necessárias para implantar os serviços do Cloud Run, peça ao administrador para conceder a você os seguintes papéis do IAM:

Para uma lista de papéis e permissões do IAM associados ao Cloud Run, consulte Papéis do IAM do Cloud Run e Permissões do IAM do Cloud Run. Se o serviço do Cloud Run interage com Google Cloud APIs, como as bibliotecas de cliente do Cloud, consulte o guia de configuração de identidade de serviço. Para mais informações sobre como conceder papéis, consulte permissões de implantação e gerenciar acesso.

Configurar o escalonamento manual

É possível configurar o modo de escalonamento usando o Google Cloud console, a Google Cloud CLI, arquivo YAML ou a API ao criar um serviço ou atualizar uma revisão:

Console

  1. Noconsole, acesse a página Serviços do Cloud Run: Google Cloud

    Acessar o Cloud Run

  2. Se você estiver configurando um novo serviço, clique em Implantar contêiner para mostrar o formulário Criar serviço. Se você estiver configurando um serviço atual, clique nele para exibir o painel de detalhes e, em seguida, clique no ícone de caneta ao lado de Escalonamento no canto superior direito do painel de detalhes.

  3. Localize o formulário Escalonamento de serviço (para um novo serviço) ou o formulário Editar escalonamento para um serviço atual.

    imagem

    No campo Número de instâncias, especifique o número de instâncias de contêiner do serviço.

  4. Clique em Criar para um novo serviço ou em Salvar para um serviço atual.

gcloud

Para especificar o escalonamento de um novo serviço, use o comando de implantação:

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

Substitua:

  • SERVICE: o nome do serviço.
  • INSTANCE_COUNT: o número de instâncias do serviço. Isso define o serviço para escalonamento manual. Especifique um valor de 0 para desativar o serviço. Especifique um valor de auto para usar o comportamento de escalonamento automático padrão do Cloud Run.
  • IMAGE_URL: uma referência à imagem de contêiner, por exemplo, us-docker.pkg.dev/cloudrun/container/hello:latest. Se você usa o Artifact Registry, o repositório REPO_NAME já precisará ter sido criado. O URL segue o formato de LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG .

Especifique o escalonamento de um serviço atual usando o seguinte comando de atualização:

gcloud run services update SERVICE \
   --scaling=INSTANCE_COUNT

YAML

  1. Se você estiver criando um novo serviço, pule esta etapa. Se você estiver atualizando um serviço existente, faça o download da configuração YAML correspondente:

    gcloud run services describe SERVICE --format export > service.yaml
  2. Atualize os atributos scalingMode e manualInstanceCount:

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

    Substitua:

    • SERVICE: o nome do serviço do Cloud Run
    • MODE: manual para escalonamento manual ou automatic para o comportamento de escalonamento automático padrão do Cloud Run.
    • INSTANCE_COUNT: o número de instâncias que você está escalonando manualmente para o serviço. Especifique um valor de 0 para desativar o serviço.
  3. Crie ou atualize o serviço usando o seguinte comando:

    gcloud run services replace service.yaml

API REST

Para atualizar o número de instâncias de um determinado serviço no escalonamento manual, envie uma solicitação HTTP PATCH para o endpoint service da API Cloud Run Admin.

Por exemplo, usando 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

Substitua:

  • ACCESS_TOKEN: um token de acesso válido para uma conta que tem as permissões do IAM para atualizar um serviço. Por exemplo, se você fez login em gcloud, é possível recuperar um token de acesso usando gcloud auth print-access-token. Em uma instância de contêiner do Cloud Run, é possível recuperar um token de acesso por meio do servidor de metadados da instância de contêiner.
  • MANUAL_INSTANCE_COUNT: o número de instâncias do serviço. Isso define o serviço para escalonamento manual. Especifique um valor de 0 para desativar o serviço.
  • SERVICE: o nome do serviço.
  • REGION: a Google Cloud região em que o serviço está implantado.
  • PROJECT_ID: o Google Cloud ID do projeto.

Para mudar o modo de escalonamento de manual para automático, envie uma solicitação PATCH para o endpoint service da API Cloud Run Admin e defina o campo scalingMode como AUTOMATIC.

Por exemplo, execute o seguinte comando curl:

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

Terraform

Para saber como aplicar ou remover uma configuração do Terraform, consulte Comandos básicos do Terraform.

Adicione o seguinte a um google_cloud_run_v2_service recurso na configuração do 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"
  }
}

Substitua:

  • SERVICE_NAME: o nome do serviço do Cloud Run.
  • REGION: a Google Cloud região. Por exemplo, europe-west1.
  • IMAGE_URL: uma referência à imagem de contêiner, por exemplo, us-docker.pkg.dev/cloudrun/container/hello:latest. Se você usa o Artifact Registry, o repositório REPO_NAME já precisará ter sido criado. O URL segue o formato de LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG .
  • INSTANCE_COUNT: o número de instâncias que você está escalonando manualmente para o serviço. Esse número de instâncias é dividido entre todas as revisões com tráfego especificado com base na porcentagem de tráfego que elas estão recebendo.

Conferir a configuração de escalonamento do serviço

Para conferir as instâncias de configuração de escalonamento do serviço do Cloud Run:

Console

  1. Noconsole, acesse a página Serviços do Cloud Run: Google Cloud

    Acessar o Cloud Run

  2. Clique no serviço de seu interesse para abrir o painel Detalhes do serviço.

  3. A configuração de escalonamento atual é mostrada no canto superior direito do painel de detalhes do serviço, após o rótulo Escalonamento, ao lado do ícone de caneta.

gcloud

Use o comando a seguir para conferir a configuração de escalonamento atual do serviço:

gcloud run services describe SERVICE

Substitua SERVICE pelo nome do serviço.

Procure o campo Scaling: Manual (Instances: ) perto da parte de cima do texto retornado do describe.

YAML

Use o comando a seguir para fazer o download da configuração YAML do serviço:

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

A configuração de escalonamento está contida nos scalingMode e manualInstanceCount atributos.

Desativar um serviço

Quando você desativa um serviço, todas as solicitações em processamento podem ser concluídas. No entanto, todas as outras solicitações para o URL do serviço falharão com um erro Service unavailable ou Service disabled.

As solicitações para revisões de serviço que estão ativas apenas devido a tags de tráfego não são afetadas porque essas revisões não estão desativadas.

Para desativar um serviço, defina o escalonamento como zero. É possível desativar um serviço usando o Google Cloud console, a Google Cloud CLI, o arquivo YAML ou a API:

Console

  1. Noconsole, acesse a página Serviços do Cloud Run: Google Cloud

    Acessar o Cloud Run

  2. Clique no serviço que você quer desativar para mostrar o painel de detalhes e, em seguida, clique no ícone de caneta ao lado de Escalonamento no canto superior direito do painel de detalhes.

  3. Localize o formulário Editar escalonamento e selecione Escalonamento manual.

    imagem

    No campo Número de instâncias, insira o valor 0 (zero).

  4. Clique em Salvar.

gcloud

Para desativar um serviço, use o comando a seguir para definir o escalonamento como zero:

gcloud run services update SERVICE --scaling=0

Substitua SERVICE pelo nome do serviço.

YAML

  1. Faça o download da configuração YAML do serviço:

    gcloud run services describe SERVICE --format export > service.yaml
  2. Defina o atributo manualInstanceCount como zero (0):

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

    Substitua SERVICE pelo nome do serviço do Cloud Run.

  3. Crie ou atualize o serviço usando o seguinte comando:

    gcloud run services replace service.yaml

API REST

Para desativar um serviço, envie uma solicitação HTTP PATCH para o endpoint service da API Cloud Run Admin.

Por exemplo, usando 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

Substitua:

  • ACCESS_TOKEN: um token de acesso válido para uma conta que tem as permissões do IAM para atualizar um serviço. Por exemplo, se você fez login em gcloud, é possível recuperar um token de acesso usando gcloud auth print-access-token. Em uma instância de contêiner do Cloud Run, é possível recuperar um token de acesso por meio do servidor de metadados da instância de contêiner.
  • SERVICE: o nome do serviço.
  • REGION: a Google Cloud região em que o serviço está implantado.
  • PROJECT_ID: o Google Cloud ID do projeto.

Terraform

Para desativar um serviço, defina o atributo manual_instance_count como zero (0):

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"
  }
}

Substitua:

  • SERVICE_NAME: o nome do serviço do Cloud Run.
  • REGION: a Google Cloud região. Por exemplo, europe-west1.
  • IMAGE_URL: uma referência à imagem de contêiner, por exemplo, us-docker.pkg.dev/cloudrun/container/hello:latest. Se você usa o Artifact Registry, o repositório REPO_NAME já precisará ter sido criado. O URL segue o formato de LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG

Exemplo de escalonamento baseado em programação

Um caso de uso comum do escalonamento manual é mudar a contagem de instâncias com base em uma programação predefinida. Neste exemplo, usamos o Cloud Scheduler para programar dois jobs, cada um dos quais invoca a API Cloud Run Admin para escalonar o número de instâncias. O primeiro job do Cloud Scheduler define o serviço para escalonar manualmente para um número especificado de instâncias durante o horário de funcionamento (9h às 17h, de segunda a sexta-feira). O segundo job define o serviço para reduzir escala vertical para um número especificado de instâncias durante o horário de folga.

Neste exemplo, usamos o guia de início rápido do Cloud Run para simplificar, mas você pode usar um serviço de sua escolha.

Para configurar o escalonamento manual baseado em programação:

  1. Implante o serviço usando o seguinte comando:

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

    Substitua:

    • SERVICE: o nome do serviço do Cloud Run.
    • REGION: a região em que o serviço do Cloud Run está implantado.
    • PROJECT_ID: o Google Cloud ID do projeto.
  2. Configure o serviço para escalonamento manual para 10 instâncias usando o seguinte comando:

    gcloud run services update SERVICE \
       --region=REGION \
       --scaling=10
  3. Crie um job do Cloud Scheduler que seja escalonado manualmente para um número especificado de instâncias de serviço durante o horário de funcionamento:

    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":INSTANCE_COUNT}}' \
      --oauth-service-account-email=PROJECT_NUMBER-compute@developer.gserviceaccount.com

    Substitua:

    • REGION: a região em que o serviço do Cloud Run está implantado.
    • PROJECT_ID: o Google Cloud ID do projeto.
    • INSTANCE_COUNT: o número de instâncias para o qual você quer escalonar, por exemplo, 10.
    • PROJECT_NUMBER: o Google Cloud número do projeto.

    Esse comando cria um job do Cloud Scheduler que faz uma chamada HTTP para a API Cloud Run Admin, definindo o número de instâncias para o número especificado. O exemplo usa a conta de serviço padrão do Compute Engine PROJECT_NUMBER-compute@developer.gserviceaccount.com para os jobs do Cloud Scheduler. É possível usar qualquer conta de serviço que tenha permissões para atualizar os serviços do Cloud Run.

  4. Crie um job do Cloud Scheduler que reduza manualmente as instâncias de serviço durante o horário de folga:

    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":INSTANCE_COUNT}}' \
      --oauth-service-account-email=PROJECT_NUMBER-compute@developer.gserviceaccount.com

    Substitua:

    • REGION: a região em que o serviço do Cloud Run está implantado.
    • PROJECT_ID: o Google Cloud ID do projeto.
    • INSTANCE_COUNT: o número de instâncias para o qual você quer escalonar. Para desativar o serviço, defina como 0.
    • PROJECT_NUMBER: o Google Cloud número do projeto.

    Esse comando cria um job do Cloud Scheduler que faz uma chamada HTTP para a API Cloud Run Admin, definindo instâncias de escalonamento manual para o número de instâncias especificado. Definir as instâncias como zero desativa o serviço, mas não os jobs do Cloud Scheduler. Esses jobs continuam sendo executados e vão redefinir (e reativar) o serviço para um número maior de instâncias conforme programado.