使用 Prometheus

Prometheus 是一款监控工具,通常与 Kubernetes 一同使用。如果您为 GKE 配置了 Cloud 操作并包括 Prometheus 支持,则可以从集群中导出使用 Prometheus 公开格式服务生成指标,并且该指标在 Cloud Monitoring 中作为外部指标可见。

本页面介绍如何使用 Cloud Operations for GKE 来配置和使用 Prometheus。集成的源代码已公开发布。

准备工作

您无法使用带有 Prometheus 的旧版 Logging 和 Monitoring 来配置集群。如需详细了解旧版 Logging 和 Monitoring,请参阅旧版 Logging 和 Monitoring 方法指南

本页面不包含有关安装 Prometheus 服务器或使用 Cloud Operations for GKE 创建 GKE 集群的说明。

在安装 Stackdriver 收集器之前,请仔细查看以下要求:

安装收集器

如需部署 Stackdriver 收集器,请执行以下操作:

  1. 根据名称和控制器类型确定要更新的对象。仅支持 deploymentstatefulset 控制器类型。

  2. 设置以下环境变量:

    • KUBE_NAMESPACE:运行脚本的命名空间
    • KUBE_CLUSTER:辅助信息文件的集群名称参数。
    • GCP_REGION:辅助信息文件的 Google Cloud 区域参数。
    • GCP_PROJECT:辅助信息文件的 Google Cloud 项目参数。
    • DATA_DIR:辅助信息文件的数据目录。该目录包含您的 Prometheus 服务器写入的共享卷。在后续说明中,此变量设置为值 /data
    • DATA_VOLUME:包含 Prometheus 数据的 DATA_DIR 中的共享卷的名称。在后续说明中,此变量设置为 data-volume
    • SIDECAR_IMAGE_TAG:Prometheus Sidecar 的 Docker 映像版本。 您可以在 Container Registry 中找到最新版本。
  3. 执行以下脚本,并提供在此过程的初始步骤中指定的两个参数:

    #!/bin/sh
    
    set -e
    set -u
    
    CLEAN_UP_ORPHANED_REPLICA_SETS='--clean-up-orphaned-replica-sets'
    usage() {
      echo -e "Usage: $0 <deployment|statefulset> <name> [${CLEAN_UP_ORPHANED_REPLICA_SETS}]\n"
    }
    
    if [  $# -le 1 ]; then
      usage
      exit 1
    fi
    
    SHOULD_CLEAN_UP=${3:-}
    
    # Override to use a different Docker image name for the sidecar.
    export SIDECAR_IMAGE_NAME=${SIDECAR_IMAGE_NAME:-'gcr.io/stackdriver-prometheus/stackdriver-prometheus-sidecar'}
    
    kubectl -n "${KUBE_NAMESPACE}" patch "$1" "$2" --type strategic --patch "
    spec:
      template:
        spec:
          containers:
          - name: sidecar
            image: ${SIDECAR_IMAGE_NAME}:${SIDECAR_IMAGE_TAG}
            imagePullPolicy: Always
            args:
            - \"--stackdriver.project-id=${GCP_PROJECT}\"
            - \"--prometheus.wal-directory=${DATA_DIR}/wal\"
            - \"--stackdriver.kubernetes.location=${GCP_REGION}\"
            - \"--stackdriver.kubernetes.cluster-name=${KUBE_CLUSTER}\"
            #- \"--stackdriver.generic.location=${GCP_REGION}\"
            #- \"--stackdriver.generic.namespace=${KUBE_CLUSTER}\"
            ports:
            - name: sidecar
              containerPort: 9091
            volumeMounts:
            - name: ${DATA_VOLUME}
              mountPath: ${DATA_DIR}
    "
    if [[ "${SHOULD_CLEAN_UP}" == "${CLEAN_UP_ORPHANED_REPLICA_SETS}" ]]; then
      # Delete the replica sets from the old deployment. If the Prometheus Server is
      # a deployment that does not have `revisionHistoryLimit` set to 0, this is
      # useful to avoid PVC conflicts between the old replica set and the new one
      # that prevents the pod from entering a RUNNING state.
      kubectl -n "${KUBE_NAMESPACE}" get rs | grep "$2-" | awk '{print $1}' | xargs kubectl delete -n "${KUBE_NAMESPACE}" rs
    fi
    

脚本成功执行后,Stackdriver 收集器将作为 sidecar 添加到在第 1 步中找到的对象的 pod。脚本中被注释掉的两行与从 GKE 集群收集指标数据无关。但是,若您要填充通用 MonitoredResource,这两行是相关的。

您必须执行其他步骤才能永久更改配置。后续部分将介绍这些步骤。

验证安装

如需验证 Stackdriver 收集器是否安装,请运行以下命令:

kubectl -n "${KUBE_NAMESPACE}" get <deployment|statefulset> <name> -o=go-template='{{$output := "stackdriver-prometheus-sidecar does not exists."}}{{range .spec.template.spec.containers}}{{if eq .name "stackdriver-prometheus-sidecar"}}{{$output = (print "stackdriver-prometheus-sidecar exists. Image: " .image)}}{{end}}{{end}}{{printf $output}}{{"\n"}}'

  • 成功安装 Prometheus Sidecar 后,脚本输出会列出容器注册表中使用的映像。在以下示例中,映像版本为 0.3.4。在安装过程中,版本可能会有所不同:

    stackdriver-prometheus-sidecar exists. Image: gcr.io/stackdriver-prometheus/stackdriver-prometheus-sidecar:0.4.3
    
  • 否则,脚本的输出会显示以下内容:

    stackdriver-prometheus-sidecar does not exist.
    

如需确定工作负载是否最新并且可用,请运行以下命令:

kubectl -n "${KUBE_NAMESPACE}" get <deployment|statefulset> <name>

将配置更改永久化

验证收集器已成功安装后,更新集群配置使更改永久化:

  1. 将 Prometheus 服务器配置为写入共享卷。在以下示例步骤中,假设 DATA_DIR 设置为 /dataDATA_VOLUME 设置为 data-volume

    1. 确保 Prometheus Pod 中有一个共享卷:

      volumes:
        - name: data-volume
          emptyDir: {}
      
    2. 让 Prometheus 将卷装载到 /data 下:

      volumeMounts:
      - name: data-volume
        mountPath: /data
      
    3. 通过将以下内容添加到其容器 args 中,指示 Prometheus 服务器向 /data 中的共享卷写入数据:

      --storage.tsdb.path=/data
      
  2. 使用您用于管理工作负载配置的工具,将配置重新应用到集群,并将 Stackdriver 收集器容器作为 sidecar 添加到新配置中:

    - name: sidecar
      image: gcr.io/stackdriver-prometheus/stackdriver-prometheus-sidecar:[SIDECAR_IMAGE_TAG]
      args:
      - "--stackdriver.project-id=[GCP_PROJECT]"
      - "--prometheus.wal-directory=/data/wal"
      - "--prometheus.api-address=[API_ADDRESS]"
      - "--stackdriver.kubernetes.location=[GCP_REGION]"
      - "--stackdriver.kubernetes.cluster-name=[KUBE_CLUSTER]"
      ports:
      - name: sidecar
        containerPort: 9091
      volumeMounts:
      - name: data-volume
        mountPath: /data
    

    在上面的表达式中,[API_ADDRESS] 是指 Prometheus 的 API 地址,通常为 http://127.0.0.1:9090

如需了解收集器的其他配置详情,请参阅 Stackdriver Prometheus Sidecar 文档

查看指标

Prometheus 配置为将指标作为外部指标导出到 Google Cloud 的运维套件。

要查看这些指标:

  1. 在 Cloud Console 中,选择 Monitoring

    转到“监控”

  2. 在 Monitoring 导航窗格中,点击 Metrics Explorer

  3. “查找资源类型和指标”菜单中:

    • 选择 Kubernetes 容器k8s_container)作为资源类型
    • 对于指标字段,请选择带有前缀 external/prometheus/ 的指标。 例如,您可以选择 external/prometheus/go_memstats_alloc_bytes

    在以下示例中,添加了一个过滤条件以显示特定集群的指标。若您在一个工作区中有多个集群,按集群名称过滤非常有用:

    示例 Kubernetes 容器的 Prometheus 指标。

管理由 Prometheus 派生的指标所产生的费用

通常,Prometheus 会收集应用导出的所有指标,并且默认情况下,Stackdriver 收集器会将这些指标发送到 Cloud Monitoring。此集合包含由您的应用所依赖的库导出的指标。例如,Prometheus 客户端库会导出许多关于应用环境的指标。

您可以在 Stackdriver 收集器中配置过滤条件,以选择将哪些指标提取到 Cloud Monitoring 中。例如,要仅导入由 kubernetes-podskubernetes-service-endpoints 生成的这些指标,请在启动 Stackdriver-prometheus-sidecar 时添加以下 --include 语句:

 --include={job=~"kubernetes-pods|kubernetes-service-endpoints"}

如需了解详情,请参阅 Stackdriver Prometheus 辅助信息文件文档

您还可以估算这些指标对帐单的影响

Prometheus 集成问题

Cloud Monitoring 中没有显示数据。

如果您在完成安装步骤后,Cloud Monitoring 中没有显示任何数据,请在收集器日志中搜索错误消息。

如果日志未包含任何明显的失败消息,请通过将 --log.level=debug 标志传递给收集器,启用调试日志记录。您必须重启收集器使日志记录更改生效。 重启收集器后,在收集器日志中搜索错误消息。

若要验证数据是否已发送到 Cloud Monitoring,您可以使用 --stackdriver.store-in-files-directory 命令行参数向文件发送请求,然后检查此目录中的文件。

没有权限

如果您看到 Monitoring API 的“没有权限”错误,请查看准备工作中所述的要求。 请确保您的服务帐号具有正确的权限。如果您使用 Workload Identity,请务必在 KSA 和 GSA 之间创建关系

我正在使用记录规则,但 Cloud Monitoring 中未显示指标。

在使用记录角色时,尽可能将原始指标提取到 Cloud Monitoring 中,并使用 Cloud Monitoring 功能在创建图表或信息中心时聚合数据。

如果无法提取原始指标,请在收集器的配置中添加 static_metadata 条目。此选项要求您保留 jobinstance 标签。例如,当前配置有效:

  • 您的 Prometheus 服务器配置:

    groups:
    - name: my-groups
      rules:
      - record: backlog_avg_10m
        expr: avg_over_time(backlog_k8s[10m])
      - record: backlog_k8s
        expr: sum(total_lag) by (app, job, instance)
    
  • 您的 Prometheus 收集器配置:

    static_metadata:
      - metric: backlog_avg_10m
        type: gauge
    

不支持更改或移除 jobinstance 标签的记录规则。

我的指标缺少 jobinstance Prometheus 标签。

Stackdriver Prometheus 收集器利用众所周知的 Prometheus 标签为您的 Kubernetes 对象构建 Cloud Monitoring MonitoredResource。在您更改标签描述符时,收集器无法将指标写入 Monitoring。

我在日志中看到“duplicate time series”或“out-of-order writes”错误。

如果两次将指标数据写入相同的时间序列,则会导致这些错误。当您的 Prometheus 端点两次使用单个 Cloud Monitoring 所监控的资源中的相同指标时,就会发生这种情况。

例如,一个 Kubernetes 容器可能会在多个端口发送 Prometheus 指标。由于 Monitoring k8s_container 监控的资源不会根据端口区分资源,因此 Monitoring 检测到的结果是您将两个点写入相同的时间序列。要避免这种情况,请在 Prometheus 中添加用于区分时间序列的指标标签。例如,您可以使用标签 __meta_kubernetes_pod_annotation_prometheus_io_port,因为它在容器重启过程中保持不变。

我在日志中看到“metric kind must be X, but is Y”错误。

这些错误是由更改现有指标描述符的 Prometheus 指标类型引起的。Cloud Monitoring 指标分类严格,并且不支持在仪表盘、计数器等之间更改指标类型。

若要更改指标的类型,您必须删除相应的指标描述符并创建新的描述符。删除指标描述符会导致无法访问现有时间序列数据。

我确定之前看过 Prometheus 指标类型,但现在找不到了!

Prometheus 已预先配置为将指标作为外部指标导出到 Cloud Monitoring。导出数据时,Monitoring 会为外部指标创建适当的指标描述符。 如果系统至少 24 个月没有写入该指标类型的数据,则指标描述符可能会被删除。

无法保证未使用的指标描述符在 24 个月后会被删除,但 Monitoring 保留删除过去 24 个月中未使用的任何 Prometheus 指标描述符的权利。

弃用政策

Prometheus 与 Cloud Monitoring 的集成受代理弃用政策的约束。