Veja eventos do redimensionador automático horizontal de pods

Esta página fornece informações sobre eventos de decisão emitidos pelo Horizontal Pod Autoscaler no Google Kubernetes Engine (GKE). Ao analisar estes eventos, pode obter estatísticas sobre a forma como o controlador de escala automática horizontal de pods gere o dimensionamento da carga de trabalho e compreender o processo de tomada de decisões por detrás das respetivas ações.

O Horizontal Pod Autoscaler emite eventos de decisão, que são armazenados como entradas de registo no Cloud Logging.

Antes de começar

Certifique-se de que cumpre os seguintes pré-requisitos:

Selecione ou crie um projeto

Pode usar um projeto existente ou criar um novo para este tutorial.

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

  6. Ative as APIs

    Enable the GKE, and Cloud Logging APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

    Configure o Cloud Shell

    Neste tutorial, vai usar a Cloud Shell para executar comandos gcloud e kubectl. O Cloud Shell é um ambiente de shell para gerir recursos alojados no Google Cloud. Vem pré-instalado com a CLI gcloud do Google Cloud e a ferramenta de linha de comandos kubectl.

    In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    É aberta uma sessão do Cloud Shell num frame na parte inferior da consola.

    Antes de executar comandos neste tutorial, certifique-se de que o projeto predefinido está definido como o ID do projeto onde quer implementar a app de exemplo. Se ainda não estiver definido, execute o seguinte comando no Cloud Shell:

    gcloud config set project PROJECT_ID
    

    Substitua PROJECT_ID pelo seu ID do projeto.

    Funções e autorizações necessárias

    Para receber as autorizações de que precisa para ativar a geração de registos e para aceder e processar registos, peça ao seu administrador para lhe conceder as seguintes funções de IAM no projeto:

    Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.

    Também pode conseguir as autorizações necessárias através de funções personalizadas ou outras funções predefinidas.

    Requisitos

    • O cluster do GKE tem de ter a versão 1.31.5-gke.1090000 ou posterior, ou 1.32.1-gke.1260000 ou posterior.
    • Ative o Cloud Logging no seu cluster do GKE. Aplicam-se os preços do Cloud Logging.

    Ative os eventos de decisão do redimensionador automático horizontal de pods

    Para criar um novo cluster com os registos de decisões KCP_HPA ativados, execute o seguinte comando:

    gcloud container clusters create CLUSTER_NAME \
        --location=LOCATION \
        --project=PROJECT_ID \
        --logging=SYSTEM,KCP_HPA
    

    Para ativar os registos de decisões KCP_HPA num cluster existente, execute o seguinte comando:

    gcloud container clusters update CLUSTER_NAME \
        --location=LOCATION \
        --project=PROJECT_ID \
        --logging=SYSTEM,KCP_HPA
    

    Substitua o seguinte:

    • CLUSTER_NAME: nome do cluster que quer criar ou atualizar.
    • PROJECT_ID: o ID do seu Google Cloud projeto.
    • LOCATION: calcule as regiões ou as zonas para o seu cluster.

    Estes comandos permitem exportar os registos gerados pelo KCP_HPA e guardá-los no destino logName="projects/PROJECT_ID/logs/container.googleapis.com%2Fhpa-controller" no Cloud Logging.

    Obtenha a configuração de registo atualizada do cluster e reveja a lista de registos para se certificar de que o registo KCP_HPA está ativado:

    gcloud container clusters describe CLUSTER_NAME \
        --location=LOCATION \
        --flatten=loggingConfig \
        --format='csv[delimiter=",",no-heading](componentConfig.enableComponents)'
    

    O resultado é semelhante ao seguinte:

    SYSTEM_COMPONENTS,APISERVER,CONTROLLER_MANAGER,SCHEDULER,KCP_HPA
    

    Desative os eventos de decisão do redimensionador automático horizontal de pods

    Atualize um cluster para remover o componente KCP_HPA da flag --logging:

    gcloud container clusters update CLUSTER_NAME \
        --location=LOCATION \
        --project=PROJECT_ID \
        --logging=SYSTEM
    

    Substitua o seguinte:

    • CLUSTER_NAME: nome do cluster que quer criar ou atualizar.
    • PROJECT_ID: o ID do seu Google Cloud projeto.
    • LOCATION: calcule as regiões ou as zonas para o seu cluster.

    Este comando desativa a exportação dos registos gerados pelo KCP_HPA. Não pode obtê-los através do filtro logName="projects/PROJECT_ID/logs/container.googleapis.com%2Fhpa-controller" no Cloud Logging.

    Obtenha a configuração de registo atualizada do cluster e reveja a lista de registos para se certificar de que o registo KCP_HPA está desativado:

    gcloud container clusters describe CLUSTER_NAME \
        --location=LOCATION \
        --flatten=loggingConfig \
        --format='csv[delimiter=",",no-heading](componentConfig.enableComponents)'
    

    O resultado é semelhante ao seguinte:

    SYSTEM_COMPONENTS,APISERVER,CONTROLLER_MANAGER,SCHEDULER
    

    Tipos de registos

    Os eventos de decisão para o Horizontal Pod Autoscaler são armazenados no Cloud Logging, na localização logName="projects/PROJECT_ID/logs/container.googleapis.com%2Fhpa-controller" que se encontra no contentor _Default no mesmo projeto que o seu cluster do GKE. Todos os eventos registados estão no formato JSON e podem ser encontrados no campo jsonPayload de uma entrada de registo.

    Certifique-se de que compreende as necessidades de armazenamento dos potenciais volumes de registos, além de quaisquer implicações de desempenho ou custos. Os exemplos seguintes explicam a frequência com que o redimensionador automático horizontal de pods gera cada tipo de evento de decisão:

    • Recomendação atómica: o Horizontal Pod Autoscaler gera um evento de recomendação atómico a cada 15 segundos para cada métrica que está a ser monitorizada por cada objeto HPA no seu cluster. Por exemplo, se tiver dois objetos HPA no cluster e cada objeto HPA monitorizar três métricas, são registadas seis recomendações atómicas a cada 15 segundos.

    • Recomendação final: o redimensionador automático horizontal de pods gera um evento de recomendação final a cada 15 segundos para cada objeto HPA no seu cluster. Por exemplo, se tiver dois objetos HPA no cluster, são registadas duas recomendações finais a cada 15 segundos.

    No total, com dois objetos HPA que monitorizam três métricas cada, o seu registo KCP_HPA vai receber oito entradas de eventos de decisão no total a cada 15 segundos.

    Recomendação atómica

    Um registo de recomendações atómico descreve uma recomendação com base numa métrica individual especificada no seu Horizontal Pod Autoscaler.

    Um registo atómico inclui os seguintes campos:

    Campo Descrição
    start_time Indica quando o HPA começou a calcular uma recomendação.
    hpa O nome do objeto HPA associado à recomendação.
    pod_count Indica o número total de pods associados ao HPA quando faz a recomendação. Este número também inclui grupos de anúncios prontos, não prontos e ignorados.
    metric Fornece informações sobre a especificação e o estado da métrica usada para a recomendação. O campo metric contém os seguintes subcampos:
    • index: índice da métrica na matriz Spec metrics.
    • type: tipo de métrica com valores do MetricSourceType (por exemplo, recurso, externo).
    • spec: nome da métrica e um objetivo definido nessa métrica.
    • status: Condições de estado relativamente à escalabilidade e às limitações de escalamento.
    • newest_sample_time: indicação de tempo da amostra de métricas mais recente.
    • newest_sample_age_seconds: idade da amostra mais recente, medida em segundos, desde o início do cálculo da recomendação. Um valor negativo significa que a amostra de métricas é anterior ao início do cálculo.
    summary O campo de resumo contém informações sobre o resultado da recomendação, incluindo o número de réplicas sugerido. Se não for possível propor uma recomendação, é apresentada uma mensagem de erro. O campo summary contém os seguintes subcampos:
    • dampening: O HPA aplica a atenuação à recomendação e à respetiva direção para tentar reduzir a magnitude de uma potencial expansão. O amortecimento pode ocorrer das seguintes formas:
      • up: uma direção de redução significa que o HPA assume que os pods com métricas em falta têm uma utilização de 100% da métrica.
      • down: uma direção de amortecimento significa que o HPA assume que os pods com métricas em falta ou os pods não preparados consomem 0% de utilização da métrica.
      • none: não é aplicada nenhuma redução.
    • override: mensagem que indica um motivo quando a recomendação proposta pelo HPA não é aplicada (por exemplo, devido à tolerância); ou none se não ocorrer nenhuma substituição.
    • result: resultado da recomendação. Propõe um número recomendado de réplicas ou apresenta uma mensagem de erro se não for possível calcular a recomendação.

    Exemplo de registo de recomendação atómica:

    {
      "insertId": "xiu4bty9k5b279wu",
      "jsonPayload": {
        "instance": {
          "vm_name": "my-unique-vm-identifier",
          "zone": "us-central1-a"
        },
        "atomicRecommendation": {
          "startTime": "2025-02-06T20:07:00.573419526Z",
          "hpa": "gke-managed-cim/kube-state-metrics",
          "metric": {
            "newestSampleAgeSeconds": -39.573419526,
            "status": {
              "averageValue": "25849856"
            },
            "newestSampleTime": "2025-02-06T20:06:21Z",
            "type": "Resource",
            "spec": {
              "target": {
                "averageValue": "400Mi"
              },
              "name": "memory"
            }
          },
          "podCount": {
            "ready": 1,
            "total": 1
          },
          "summary": {
            "override": "none",
            "replicas": 1,
            "dampening": "none"
          }
        }
      },
      "resource": {
        "type": "k8s_control_plane_component",
        "labels": {
          "project_id": "my-project-id",
          "cluster_name": "my-cluster",
          "location": "us-central1-a",
          "component_location": "us-central1-a",
          "component_name": "hpa-controller"
        }
      },
      "timestamp": "2025-02-06T20:07:00.593777835Z",
      "severity": "INFO",
      "labels": {
        "compute.googleapis.com/resource_name": "my-unique-vm-identifier"
      },
      "logName": "projects/my-project-id/logs/container.googleapis.com%2Fhpa-controller",
      "sourceLocation": {
        "file": "event_logger.go",
        "line": "61"
      },
      "receiveTimestamp": "2025-02-06T20:07:05.284753647Z"
    }
    

    Recomendação final

    Um registo de recomendações final descreve uma recomendação consolidada proposta pelo HorizontalPodAutoscaler. O Horizontal Pod Autoscaler combina todas as recomendações atómicas de diferentes métricas para criar uma recomendação final e aciona as recomendações finais. A ativação significa que o HPA indica à implementação que ajuste o número de réplicas para corresponder ao valor recomendado. Se a recomendação final sugerir um número diferente de pods do número de pods em execução, o Horizontal Pod Autoscaler aciona um evento de aumento ou redução da escala para ajustar a implementação em conformidade.

    Um registo de recomendações finais inclui os seguintes campos:

    Campo Descrição
    start_time Indica quando o HPA começou a calcular uma recomendação.
    hpa O nome do objeto HPA associado à recomendação.
    target_ref Indica o objeto ScaleTargetRef da HPA associado a uma recomendação.
    configured_size O último número de réplicas registado antes de o HPA calcular e aplicar esta recomendação.
    top_level_override Indica um motivo se a recomendação proposta pela HPA não for aplicada (por exemplo, devido à tolerância) ou none se não ocorrer nenhuma substituição.
    top_level_limit Indica um motivo se a recomendação proposta pelo HPA tiver de ser ajustada (por exemplo, devido ao número de réplicas definidas pelos campos MinReplicas ou MaxReplicas na especificação do HPA).
    leading_metric_index O índice da métrica principal na matriz Spec metrics é a métrica cuja recomendação atómica associada é usada como a recomendação final.
    normalization Fornece um resumo da estabilização e da limitação da seguinte forma, se estiver presente:

    stabilization: descreve o estado da estabilização, se tiver sido aplicada. A estabilização é usada para restringir a variação do número de réplicas quando as métricas usadas para o escalamento continuam a flutuar. O campo stabilization é composto pelos seguintes subcampos:

    • replicas: número de réplicas após a estabilização.
    • reason: tipo de estabilização aplicado: scaleUp ou scaleDown.
    • stabilization_window: período de tempo de estabilização associado, em segundos.
    • replicas_before_stabilization: número de réplicas recomendado antes da estabilização.

    limitation: descreve como as limitações de escalabilidade são processadas, caso sejam aplicadas. Este comportamento modifica as recomendações propostas pelo HPA com base nas limitações existentes. O campo limitation é composto pelos seguintes subcampos:

    • replicas: número de réplicas após a limitação.
    • reason: motivo pelo qual não é possível dimensionar além da quantidade mínima ou máxima de réplicas.
    • scaling_policy: a política de escalabilidade aplicada.
    • selectPolicy: especifica como é selecionada uma política quando é feita uma expansão numa determinada direção. MaxChange corresponde a MaxChangePolicySelect; MinChange corresponde a MinChangePolicySelect. Se o ajuste de escala estiver desativado, o campo selectPolicy não é apresentado.
    • replicas_before_limitation: número de réplicas recomendado antes da limitação.
    replicas Número de réplicas recomendado.
    actuation_error Uma mensagem de erro associada à falha, se a ativação falhou.
    actuation_time Data/hora da ativação em caso de êxito.
    actuation_latency_seconds Tempo decorrido, em segundos, desde o início do cálculo da recomendação até à conclusão da ação.

    Exemplo de registo de recomendação final:

    {
      "insertId": "qzyv7alfv1sm19ns",
      "jsonPayload": {
        "finalRecommendation": {
          "actuationTime": "2025-02-06T20:06:57.487786873Z",
          "targetRef": {
            "name": "kube-state-metrics",
            "kind": "StatefulSet",
            "apiVersion": "apps/v1"
          },
          "topLevelLimit": "none",
          "hpa": "gke-managed-cim/kube-state-metrics",
          "topLevelOverride": "noRecommendation",
          "replicas": 1,
          "configuredSize": 1,
          "actuationLatencySeconds": 0.003722451,
          "startTime": "2025-02-06T20:06:57.484064422Z"
        },
        "instance": {
          "vm_name": "my-unique-vm-identifier",
          "zone": "us-central1-a"
        }
      },
      "resource": {
        "type": "k8s_control_plane_component",
        "labels": {
          "cluster_name": "my-cluster",
          "component_location": "us-central1-a",
          "component_name": "hpa-controller",
          "location": "us-central1-a",
          "project_id": "my-project-id"
        }
      },
      "timestamp": "2025-02-06T20:06:57.488193527Z",
      "severity": "INFO",
      "labels": {
        "compute.googleapis.com/resource_name": "my-unique-vm-identifier"
      },
      "logName": "projects/my-project-id/logs/container.googleapis.com%2Fhpa-controller",
      "sourceLocation": {
        "file": "event_logger.go",
        "line": "61"
      },
      "receiveTimestamp": "2025-02-06T20:06:57.844898727Z"
    }
    

    Resolução de problemas

    Esta secção descreve problemas e passos de resolução relacionados com eventos do Horizontal Pod Autoscaler.

    Sem eventos

    Se não vir eventos de decisão do Horizontal Pod Autoscaler, certifique-se de que fez tudo o seguinte:

    • Ativou o Cloud Logging para o cluster.
    • Ativou os registos KCP_HPA para o cluster.
    • Implementou, pelo menos, um objeto hpa configurado corretamente no seu cluster.

    Para ver a configuração do objeto hpa, execute o seguinte comando:

      kubectl describe hpa $HPA_NAME
    

    Se continuar a não ver registos de KCP_HPA, contacte o Google Cloud apoio técnico.

    O que se segue?