自部署的规则评估和提醒

Google Cloud Managed Service for Prometheus 支持与 Prometheus 兼容的规则评估和提醒。本文档介绍如何设置自部署规则评估,包括独立的规则评估器组件。

仅当您要针对全局数据存储区执行规则和提醒时,才需要遵循以下说明。

针对自部署集合的规则评估

部署适 Managed Service for Prometheus 后,您可以使用 Prometheus 配置文件的 rule_files 字段在本地评估已部署的每个实例中的规则。但是,规则的最长查询时段受服务器保留本地数据的时长限制。

大多数规则仅在最近几分钟的数据内执行,因此在每个本地服务器上运行规则通常是有效的策略。在这种情况下,无需进一步设置。

但是,有时根据全局指标后端评估规则会很有用,例如当规则的所有数据没有全部存储在给定 Prometheus 实例上时。对于这些情况,Managed Service for Prometheus 还提供了规则评估器组件。

须知事项

本部分介绍本文档中描述的任务所需的配置。

配置您的环境

为避免重复输入您的项目 ID 或集群名称,请执行以下配置:

  • 按如下方式配置命令行工具:

    • 配置 gcloud CLI 以引用您的 Google Cloud 项目的 ID:

      gcloud config set project PROJECT_ID
      
    • 配置 kubectl CLI 以使用集群:

      kubectl config set-cluster CLUSTER_NAME
      

    如需详细了解这些工具,请参阅以下内容:

设置命名空间

为您在示例应用中创建的资源创建 NAMESPACE_NAME Kubernetes 命名空间:

kubectl create ns NAMESPACE_NAME

验证服务账号凭据

如果您的 Kubernetes 集群已启用 Workload Identity Federation for GKE,则可以跳过此部分。

在 GKE 上运行时,Managed Service for Prometheus 会自动根据 Compute Engine 默认服务账号从环境中检索凭据。默认情况下,默认服务账号具有必要的权限 monitoring.metricWritermonitoring.viewer。如果您未使用 Workload Identity Federation for GKE,并且之前从默认节点服务账号中移除了任一角色,则必须重新添加这些缺少的权限,然后才能继续。

如果您不在 GKE 上运行,请参阅明确提供凭据

为 Workload Identity Federation for GKE 配置服务账号

如果您的 Kubernetes 集群未启用 Workload Identity Federation for GKE,则可以跳过此部分。

Managed Service for Prometheus 使用 Cloud Monitoring API 捕获指标数据。如果您的集群使用的是 Workload Identity Federation for GKE,则必须向您的 Kubernetes 服务账号授予 Monitoring API 权限。本节介绍以下内容:

创建和绑定服务账号

此步骤显示在 Managed Service for Prometheus 文档中的多个位置。如果您在执行先前的任务时已经执行此步骤,则无需重复执行。请直接跳到向服务账号授权

以下命令序列会创建 gmp-test-sa 服务账号并将其绑定到 NAMESPACE_NAME 命名空间中的默认 Kubernetes 服务账号:

gcloud config set project PROJECT_ID \
&&
gcloud iam service-accounts create gmp-test-sa \
&&
gcloud iam service-accounts add-iam-policy-binding \
  --role roles/iam.workloadIdentityUser \
  --member "serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE_NAME/default]" \
  gmp-test-sa@PROJECT_ID.iam.gserviceaccount.com \
&&
kubectl annotate serviceaccount \
  --namespace NAMESPACE_NAME \
  default \
  iam.gke.io/gcp-service-account=gmp-test-sa@PROJECT_ID.iam.gserviceaccount.com

如果您使用的是其他 GKE 命名空间或服务账号,请适当调整命令。

向服务账号授权

相关权限组已收集到多个角色中,您可以将这些角色授予主账号(在此示例中为 Google Cloud 服务账号)。如需详细了解 Monitoring 角色,请参阅访问权限控制

以下命令会向 Google Cloud 服务账号 gmp-test-sa 授予读写指标数据所需的 Monitoring API 角色。

如果您在执行先前的任务时已经为 Google Cloud 服务账号授予了特定角色,则无需再次执行此操作。

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

调试 Workload Identity Federation for GKE 配置

如果您在使 Workload Identity Federation for GKE 正常工作时遇到问题,请参阅验证 Workload Identity Federation for GKE 设置的文档和 Workload Identity Federation for GKE 故障排除指南

由于拼写错误和部分复制粘贴是配置 Workload Identity Federation for GKE 时最常见的错误来源,因此我们强烈建议使用这些说明中代码示例中嵌入的可编辑变量和可点击复制粘贴图标。

生产环境中的 Workload Identity Federation for GKE

本文档中描述的示例将 Google Cloud 服务账号绑定到默认 Kubernetes 服务账号,并授予 Google Cloud 服务账号使用 Monitoring API 所需的所有权限。

在生产环境中,您可能需要使用更精细的方法,其中每个组件对应一个服务账号,并且每个服务账号都具有最小的权限。如需详细了解如何为工作负载身份管理配置服务账号,请参阅使用 Workload Identity Federation for GKE

部署独立规则评估器

Managed Service for Prometheus 规则评估器会根据 Managed Service for Prometheus HTTP API 评估 Prometheus 提醒和记录规则,并将结果写回 Monarch。它接受与 Prometheus 相同的配置文件格式和规则文件格式。这些标志也几乎相同。

  1. 创建预配置规则评估器的示例部署,以评估提醒和记录规则:

    kubectl apply -n NAMESPACE_NAME -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.13.0/manifests/rule-evaluator.yaml
    
  2. 验证规则评估器的 pod 是否已成功部署:

    kubectl -n NAMESPACE_NAME get pod
    

    如果部署成功,您将会看到如下所示的输出:

    NAME                              READY   STATUS    RESTARTS   AGE
    ...
    rule-evaluator-64475b696c-95z29   2/2     Running   0          1m
    

验证规则评估器成功部署后,您可以调整已安装的清单来执行以下操作:

  • 添加自定义规则文件。
  • 配置规则评估器,以使用配置文件的 alertmanager_config 字段将提醒发送到自部署的 Prometheus Alertmanager

如果您的 Alertmanager 与规则评估器位于不同的集群中,您可能需要设置 Endpoints 资源。例如,如果您的 OperatorConfig 指定可以在 Endpoints 对象 ns=alertmanager/name=alertmanager 中找到 Alertmanager 端点,则可以手动或以编程方式创建此对象,并使用其他集群中的可访问 IP 填充此对象。

明确提供凭据

在 GKE 上运行时,规则评估器会根据节点的服务账号或 Workload Identity Federation for GKE 设置自动从环境中检索凭据。在非 GKE Kubernetes 集群中,必须使用标志或 GOOGLE_APPLICATION_CREDENTIALS 环境变量将凭据明确提供给规则评估器。

  1. 将上下文设置为目标项目:

    gcloud config set project PROJECT_ID
    
  2. 创建服务账号:

    gcloud iam service-accounts create gmp-test-sa
    

    此步骤会创建您可能已在 Workload Identity Federation for GKE 说明中创建的服务账号。

  3. 向服务账号授予所需权限:

    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. 创建并下载服务账号的密钥:

    gcloud iam service-accounts keys create gmp-test-sa-key.json \
      --iam-account=gmp-test-sa@PROJECT_ID.iam.gserviceaccount.com
    
  5. 将密钥文件作为 Secret 添加到非 GKE 集群:

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

  6. 打开规则评估器 Deployment 资源进行修改:

    kubectl -n NAMESPACE_NAME edit deploy rule-evaluator
    
    1. 将粗体显示的文本添加到资源:

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        namespace: NAMESPACE_NAME
        name: rule-evaluator
      spec:
        template
          containers:
          - name: evaluator
            args:
            - --query.credentials-file=/gmp/key.json
            - --export.credentials-file=/gmp/key.json
      ...
            volumeMounts:
            - name: gmp-sa
              mountPath: /gmp
              readOnly: true
      ...
          volumes:
          - name: gmp-sa
            secret:
              secretName: gmp-test-sa
      ...
      

    2. 保存该文件并关闭编辑器。应用更改后,系统会重新创建 pod 并使用给定服务账号向指标后端进行身份验证。

    或者,您可以使用 GOOGLE_APPLICATION_CREDENTIALS 环境变量来设置密钥文件路径,而不是使用本示例中设置的标志。

    多项目和全局规则评估

    我们建议您在每个 Google Cloud 项目和区域中运行一个规则评估器实例,而不是运行一个实例来针对多个项目和区域进行评估。但是,在需要的场景中,我们也支持多项目规则评估。

    部署在 Google Kubernetes Engine 上时,规则评估器会使用其自动检测的与集群关联的 Google Cloud 项目。 如需评估跨项目的规则,您可以使用 --query.project-id 标志并指定具有多项目指标范围的项目,从而替换查询的项目。如果您的指标范围包含所有项目,则您的规则进行全局评估。如需了解详情,请参阅指标范围

    您还必须更新规则评估器使用的服务账号的权限,以便服务账号可以从范围限定项目中读取数据,以及写入指标范围内所有受监控的项目。

    编写规则时保留标签

    对于评估器向 Managed Service for Prometheus 写入的数据,评估器支持与 Managed Service for Prometheus 服务器二进制文件相同的 --export.* 标志和基于 external_labels 的配置。我们强烈建议您编写规则,以便针对聚合级别适当保留 project_idlocationclusternamespace 标签,否则查询性能可能会下降,并且您可能遇到基数限制。

    project_idlocation 标签是必需的。如果缺少这些标签,规则评估结果中的值会根据规则评估器的配置设置。缺少的 clusternamespace 标签不会被赋予值。

    自我可观测性

    规则评估器使用 --web.listen-address 标志在可配置端口上发出 Prometheus 指标。

    例如,如果 Pod rule-evaluator-64475b696c-95z29 在端口 9092 上公开这些指标,则可以使用 kubectl 手动查看这些指标:

    # Port forward the metrics endpoint.
    kubectl port-forward rule-evaluator-64475b696c-95z29 9092
    # Then query in a separate terminal.
    curl localhost:9092/metrics
    

    您可以将 Prometheus 堆栈配置为收集这些数据,以便了解规则评估器的性能。

    高可用性部署

    规则评估程序可以在高可用性设置中运行,方法与文档中介绍的 Prometheus 服务器的方法相同

    使用 Cloud Monitoring 指标进行提醒

    您可以使用 PromQL 配置规则评估器以针对 Google Cloud 系统指标发出提醒。有关如何创建有效查询的说明,请参阅 PromQL for Cloud Monitoring 指标