Avaliação e alertas de regras geridas

O Google Cloud Managed Service for Prometheus suporta a avaliação de regras e os alertas compatíveis com o Prometheus. Este documento descreve como configurar a avaliação de regras geridas.

Avaliação da regra

O Managed Service for Prometheus fornece um componente de avaliação de regras que lhe permite escrever regras em segurança no contexto de um back-end global do Prometheus, impedindo que interfira com os dados de outros utilizadores em organizações maiores. O componente é implementado automaticamente como parte da recolha gerida quando executado em clusters do Kubernetes.

Pode escrever regras e alertas sobre métricas do Managed Service for Prometheus e métricas do Cloud Monitoring. Tem de usar o recurso GlobalRules quando escreve regras para métricas do Cloud Monitoring.

Regras

O avaliador de regras gerido usa o recurso Rules para configurar regras de registo e alerta. Segue-se um exemplo de um recurso de regras:

apiVersion: monitoring.googleapis.com/v1
kind: Rules
metadata:
  namespace: NAMESPACE_NAME
  name: example-rules
spec:
  groups:
  - name: example
    interval: 30s
    rules:
    - record: job:up:sum
      expr: sum without(instance) (up)
    - alert: AlwaysFiring
      expr: vector(1)

O formato do elemento .spec.groups é idêntico à matriz Prometheus rule_group a montante. As regras de alerta e registo definidas em Rules têm âmbito project_id, cluster e namespace do recurso. Por exemplo, a regra job:up:sum no recurso acima consulta efetivamente sum without(instance) (up{project_id="test-project", cluster="test-cluster", namespace="NAMESPACE_NAME"}). Esta garantia assegura que as regras de alerta ou de registo não avaliam acidentalmente métricas de aplicações que pode nem conhecer.

Para aplicar as regras de exemplo ao seu cluster, execute o seguinte comando:

kubectl apply -n NAMESPACE_NAME -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.15.3/examples/rules.yaml

Após alguns minutos, a métrica job:up:sum fica disponível. O alerta AlwaysFiring também começa a ser acionado. Para informações sobre como enviar alertas para um Alertmanager, consulte a configuração do Alertmanager.

Os recursos ClusterRules e GlobalRules fornecem a mesma interface que o recurso Rules, mas aplicam as regras a âmbitos mais amplos. As ClusterRules selecionam dados através das etiquetas project_id e cluster, e as GlobalRules selecionam todos os dados no âmbito das métricas consultadas sem restringir etiquetas.

Para ver a documentação de referência sobre todos os recursos personalizados do Managed Service for Prometheus, consulte a referência da API prometheus-engine/doc/api.

Conversão de regras do Prometheus em regras

O recurso Rules fornece uma interface compatível com as regras do Prometheus para fornecer um caminho de migração simples para incorporar regras existentes na avaliação de regras geridas. Pode incluir as suas regras existentes num recurso Rules. Por exemplo, o seguinte é uma regra do Prometheus:

groups:
- name: example
  interval: 30s
  rules:
  - record: job:up:sum
    expr: sum without(instance) (up)
  - alert: AlwaysFiring
    expr: vector(1)

Segue-se o recurso Rules correspondente, com a regra Prometheus original em negrito:

apiVersion: monitoring.googleapis.com/v1
kind: Rules
metadata:
  namespace: NAMESPACE_NAME
  name: example-rules
spec:
  groups:
  - name: example
    interval: 30s
    rules:
    - record: job:up:sum
      expr: sum without(instance) (up)
    - alert: AlwaysFiring
      expr: vector(1)

ClusterRules

Pode usar o recurso ClusterRules para configurar regras de gravação e alerta que podem avaliar todas as séries cronológicas enviadas para o Managed Service for Prometheus de todos os espaços de nomes num cluster específico. As especificações são idênticas às de Rules. A regra do Prometheus de exemplo anterior torna-se o seguinte recurso ClusterRules:

apiVersion: monitoring.googleapis.com/v1
kind: ClusterRules
metadata:
  name: example-clusterrules
spec:
  groups:
  - name: example
    interval: 30s
    rules:
    - record: job:up:sum
      expr: sum without(instance) (up)
    - alert: AlwaysFiring
      expr: vector(1)

Recomendamos que use recursos ClusterRules apenas em métricas horizontais, como as produzidas por uma malha de serviços. Para métricas de implementações individuais, use recursos de regras para garantir que a avaliação não inclui dados não intencionais.

GlobalRules

Pode usar o recurso GlobalRules para configurar regras de registo e alerta que podem avaliar todas as séries cronológicas enviadas para o Managed Service for Prometheus em todos os projetos num âmbito de métricas. As especificações são idênticas às de Rules. A regra do Prometheus de exemplo anterior torna-se o seguinte recurso GlobalRules:

apiVersion: monitoring.googleapis.com/v1
kind: GlobalRules
metadata:
  name: example-globalrules
spec:
  groups:
  - name: example
    interval: 30s
    rules:
    - record: job:up:sum
      expr: sum without(instance) (up)
    - alert: AlwaysFiring
      expr: vector(1)

Uma vez que as métricas do Cloud Monitoring não estão no âmbito de um espaço de nomes ou de um cluster, tem de usar o recurso GlobalRules quando escreve regras ou alertas para métricas do Cloud Monitoring. A utilização de GlobalRules também é necessária quando são enviados alertas sobre métricas do sistema do Google Kubernetes Engine.

Se a sua regra não preservar as etiquetas project_id ou location, estas assumem por predefinição os valores do cluster.

Para métricas do Managed Service for Prometheus, recomendamos que use GlobalRules apenas para esses casos de utilização raros em que um alerta pode precisar de dados em todos os clusters de uma só vez. Para métricas de implementações individuais, use recursos de regras ou de regras de cluster para maior fiabilidade e para garantir que a avaliação não inclui dados não intencionais. Recomendamos vivamente que preserve as etiquetas cluster e namespace nos resultados da avaliação de regras, a menos que o objetivo da regra seja agregar essas etiquetas. Caso contrário, o desempenho das consultas pode diminuir e pode deparar-se com limites de cardinalidade. A remoção de ambas as etiquetas é fortemente desaconselhada.

Avaliação de regras globais e de vários projetos

Quando implementado no Google Kubernetes Engine, o avaliador de regras usa o Google Cloud projeto associado ao cluster, que o avaliador de regras deteta automaticamente. Para avaliar regras que abrangem projetos, tem de configurar o avaliador de regras que executa o recurso GlobalRules para usar um projeto com um âmbito de métricas de vários projetos. Pode fazê-lo de duas formas:

  • Coloque o recurso GlobalRules num projeto que tenha um âmbito de métricas de vários projetos.
  • Defina o campo queryProjectID no OperatorConfig para usar um projeto com um âmbito de métricas de vários projetos.

Também tem de atualizar as autorizações da conta de serviço usada pelo avaliador de regras (que é normalmente a conta de serviço predefinida no nó) para que a conta de serviço possa ler a partir do projeto de âmbito e escrever em todos os projetos monitorizados no âmbito das métricas.

Se o âmbito das suas métricas contiver todos os seus projetos, as regras são avaliadas globalmente. Para mais informações, consulte o artigo Âmbitos das métricas.

Alertas com métricas do Cloud Monitoring

Pode usar o recurso GlobalRules para enviar alertas sobre Google Cloud métricas do sistema através do PromQL. Para obter instruções sobre como criar uma consulta válida, consulte o artigo PromQL para métricas do Cloud Monitoring.

Configurar regras e alertas com o Terraform

Pode automatizar a criação e a gestão de recursos Rules, ClusterRules e GlobalRules através do kubernetes_manifest tipo de recurso do Terraform ou do kubectl_manifest tipo de recurso do Terraform, que lhe permitem especificar recursos personalizados arbitrários.

Para informações gerais sobre a utilização do Google Cloud com o Terraform, consulte Terraform com o Google Cloud.

Forneça credenciais explicitamente

Quando executado no GKE, o avaliador de regras obtém automaticamente as credenciais do ambiente com base na conta de serviço do nó. Em clusters Kubernetes não GKE, as credenciais têm de ser fornecidas explicitamente através do recurso OperatorConfig no espaço de nomes gmp-public.

  1. Defina o contexto para o projeto de destino:

    gcloud config set project PROJECT_ID
    
  2. Crie uma conta de serviço:

    gcloud iam service-accounts create gmp-test-sa
    

  3. Conceda as autorizações necessárias à conta de serviço:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:gmp-test-sa@PROJECT_ID.iam.gserviceaccount.com \
      --role=roles/monitoring.viewer \
    && \
    gcloud projects add-iam-policy-binding PROJECT_ID\
      --member=serviceAccount:gmp-test-sa@PROJECT_ID.iam.gserviceaccount.com \
      --role=roles/monitoring.metricWriter
    

  4. Crie e transfira uma chave para a conta de serviço:

    gcloud iam service-accounts keys create gmp-test-sa-key.json \
      --iam-account=gmp-test-sa@PROJECT_ID.iam.gserviceaccount.com
    
  5. Adicione o ficheiro de chave como um segredo ao seu cluster não GKE:

    kubectl -n gmp-public create secret generic gmp-test-sa \
      --from-file=key.json=gmp-test-sa-key.json
    

  6. Abra o recurso OperatorConfig para edição:

    kubectl -n gmp-public edit operatorconfig config
    
    1. Adicione o texto apresentado em negrito ao recurso:

      apiVersion: monitoring.googleapis.com/v1
      kind: OperatorConfig
      metadata:
        namespace: gmp-public
        name: config
      rules:
        credentials:
          name: gmp-test-sa
          key: key.json
      
      Certifique-se de que também adiciona estas credenciais à collectionsecção para que a recolha gerida funcione.

    2. Guarde o ficheiro e feche o editor. Após a aplicação da alteração, os pods são recriados e começam a autenticar-se no back-end de métricas com a conta de serviço fornecida.

    Dimensionar a avaliação de regras

    O avaliador de regras é executado como uma implementação de réplica única com pedidos e limites de recursos fixos. Pode reparar que a carga de trabalho sofre interrupções, como a eliminação por falta de memória (OOMKilled) quando avalia um número elevado de regras. Para mitigar esta situação, pode implementar um VerticalPodAutoscaler para dimensionar verticalmente a implementação. Primeiro, certifique-se de que a escala automática vertical de pods está ativada no seu cluster do Kubernetes. Em seguida, aplique um VerticalPodAutoscalerrecurso, como um dos seguintes:

    apiVersion: autoscaling.k8s.io/v1
    kind: VerticalPodAutoscaler
    metadata:
      name: rule-evaluator
      namespace: gmp-system
    spec:
      resourcePolicy:
        containerPolicies:
        - containerName: evaluator
          controlledResources:
            - memory
          maxAllowed:
            memory: 4Gi
          minAllowed:
            memory: 16Mi
          mode: Auto
      targetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: rule-evaluator
      updatePolicy:
        updateMode: Auto
    

    Pode verificar se o redimensionador automático está a funcionar verificando o estado do redimensionador automático:

    kubectl get vpa --namespace gmp-system rule-evaluator
    

    Se o dimensionamento automático estiver a funcionar, indica que calculou as recomendações de recursos para a carga de trabalho na coluna "PROVIDED":

    NAME             MODE   CPU   MEM        PROVIDED   AGE
    rule-evaluator   Auto   2m    11534336   True       30m
    

    Configurações de compressão

    Se tiver muitos recursos de regras, pode ficar sem espaço no ConfigMap. Para corrigir este problema, ative a compressão gzip no recurso OperatorConfig:

      apiVersion: monitoring.googleapis.com/v1
      kind: OperatorConfig
      metadata:
        namespace: gmp-public
        name: config
      features:
        config:
          compression: gzip
    

    Configuração do Alertmanager

    Pode usar o recurso OperatorConfig para configurar o avaliador de regras gerido para enviar alertas para um Alertmanager do Prometheus. Pode enviar alertas para o Alertmanager gerido implementado automaticamente, além de quaisquer Alertmanagers implementados por si.

    Managed Alertmanager

    O Managed Service for Prometheus implementa uma instância gerida do Alertmanager, para a qual os avaliadores de regras são configurados automaticamente para encaminhar alertas. Por predefinição, esta configuração é definida com um segredo do Kubernetes com um nome específico que contém um ficheiro de configuração do Alertmanager.

    Para ativar e configurar os relatórios para a instância do Alertmanager implementada, faça o seguinte:

    1. Crie um ficheiro de configuração local com as definições do Alertmanager (consulte os modelos de configuração de exemplo):

      touch alertmanager.yaml
      
    2. Atualize o ficheiro com as definições do Alertmanager pretendidas e crie um segredo denominado alertmanager no espaço de nomes gmp-public:

      kubectl create secret generic alertmanager \
        -n gmp-public \
        --from-file=alertmanager.yaml
      

    Após alguns momentos, o Managed Service for Prometheus seleciona o novo segredo de configuração e ativa o Alertmanager gerido com as suas definições.

    Personalizar o nome do Secret de configuração

    O Alertmanager gerido também suporta nomes de segredos personalizados para carregar a configuração. Esta capacidade é útil quando tem vários segredos de configuração e quer que a instância do Alertmanager alterne entre as configurações correspondentes. Por exemplo, pode querer alterar os canais de notificação de alerta com base em turnos de disponibilidade rotativos ou pode querer substituir uma configuração experimental do Alertmanager para testar uma nova rota de alerta.

    Para especificar um nome de segredo não predefinido através do recurso OperatorConfig, faça o seguinte:

    1. Crie um segredo a partir do ficheiro de configuração do Alertmanager local:

      kubectl create secret generic SECRET_NAME \
        -n gmp-public \
        --from-file=FILE_NAME
      
    2. Abra o recurso OperatorConfig para edição:

      kubectl -n gmp-public edit operatorconfig config
      
    3. Para ativar os relatórios do Alertmanager geridos, edite o recurso modificando a secção managedAlertmanager, conforme mostrado no texto em negrito seguinte:

      apiVersion: monitoring.googleapis.com/v1
      kind: OperatorConfig
      metadata:
        namespace: gmp-public
        name: config
      managedAlertmanager:
        configSecret:
          name: SECRET_NAME
          key: FILE_NAME
      

    Se precisar de fazer alterações à configuração do Alertmanager, pode editar a configuração deste Alertmanager atualizando o segredo que criou anteriormente.

    Personalizar o URL externo

    Pode configurar o URL externo para o Alertmanager gerido, de modo que as notificações de alerta possam fornecer um link de retorno para a sua IU de alertas. Isto é equivalente a usar a flag --web.external-url do Alertmanager do Prometheus a montante.

    apiVersion: monitoring.googleapis.com/v1
    kind: OperatorConfig
    metadata:
      namespace: gmp-public
      name: config
    managedAlertmanager:
      externalURL: EXTERNAL_URL
    

    Alertmanager implementado automaticamente

    Para configurar o avaliador de regras para um Alertmanager implementado automaticamente, faça o seguinte:

    1. Abra o recurso OperatorConfig para edição:

      kubectl -n gmp-public edit operatorconfig config
      
    2. Configure o recurso para enviar alertas para o seu serviço Alertmanager:

      apiVersion: monitoring.googleapis.com/v1
      kind: OperatorConfig
      metadata:
        namespace: gmp-public
        name: config
      rules:
        alerting:
          alertmanagers:
          - name: SERVICE_NAME
            namespace: SERVICE_NAMESPACE
            port: PORT_NAME
      

    Se o Alertmanager estiver localizado num cluster diferente do avaliador de regras, pode ter de configurar um recurso de pontos finais. Por exemplo, se o seu OperatorConfig indicar que os pontos finais do Alertmanager podem ser encontrados no objeto Endpoints ns=alertmanager/name=alertmanager, pode criar este objeto manualmente ou através de programação e preenchê-lo com IPs acessíveis do outro cluster. A secção de configuração AlertmanagerEndpoints oferece opções de configuração de autorização, se necessário.

    Conservar recursos quando estiver inativo

    Quando não estão configurados recursos Rules, ClusterRules ou GlobalRules, o GKE dimensiona as implementações do avaliador de regras e do Alertmanager para zero, de modo a conservar os recursos do cluster para os clientes que não usam regras nem alertas geridos. Estas implementações são dimensionadas automaticamente quando aplica um novo recurso de regras. Pode forçar a sua expansão aplicando um recurso de regras que não faz nada.