使用 Prometheus 对 GKE 进行白盒应用监控

本文讨论了使用 PrometheusCloud Monitoring 对跨多个 Google Kubernetes Engine (GKE) 命名空间、集群和 Google Cloud 项目的大型复杂应用进行白盒监控的方法。

在生产环境中大规模使用众多微服务颇具挑战性。为应对这一挑战,网站可靠性工程师 (SRE) 依赖来自于众多来源且精确程度不一的数据。您可以使用这些数据来改进服务,从而提供更好的用户体验。您还可以使用这些数据来诊断服务可能出现的问题,例如调试代码部署。虽然 GKE 可以帮助您部署微服务架构,但也需要可扩缩的动态监控系统来高效可靠地运营这些微服务。

借助 Cloud Operations for GKE,您可以使用单个工具同时进行黑盒和白盒监控。应用的白盒监控涉及使用应用内部的指标和信号(如当前内存使用量或请求延迟时间)来检测和预测问题。 黑盒监控使用外部可见行为(例如网页加载时间)作为信号。

DevOps 现状报告确定了可提高软件交付方面表现的功能。本文将帮助您使用以下功能:

Prometheus

Prometheus 是一种开源监控和提醒工具包,受 Google 内部监控系统 Borgmon 的影响。Borg 启发了 Kubernetes 开源项目,Borgmon 则启发了 Prometheus。这些工具能够很好地相互配合。

您可以使用 Prometheus 配置抓取目标,然后根据可配置的时间间隔查询(或抓取)这些目标,进而发现并拉取多组机器中的指标。抓取目标通常是从应用公开的 HTTP 端点,使用明确定义的说明格式且每一行说明一个指标。使用 HTTP 作为抓取目标的默认传输机制,您可以公开来自众多不同语言和端点的指标。

常用编程语言的客户端库可供使用,因此您可以快速向现有应用添加指标端点。许多云原生工具(如 Istioetcd)都可提供 Prometheus 指标。此外,还有许多 Prometheus 导出器可提供常见应用和框架(如 Consul、MySQL 和 Redis)的 Prometheus 指标。

在以下架构图中,从抓取目标收集的指标存储在 Prometheus 的时间序列数据库中。

将指标存储在时间序列数据库中

此数据库针对大型系统中常见的高基数和高吞吐量指标用例进行了优化。存储指标后,您可以使用富查询 (rich query) 语言将指标处理为方便您使用的格式。该语言的语法允许您以原生方式使用基本运算符更多复杂的函数

使用 Prometheus 监控 GKE

在 GKE 中,应用部署在容器组中,这样的容器组称为“pod”。每个 pod 都可以提供多个端口,您可以通过 Kubernetes 服务对这些 pod 进行分组,以实现负载平衡。

当应用使用与 Prometheus 兼容的库时,该库会提供一个额外的端口和端点,默认情况下为 9090/metrics。您可以通过设置 Kubernetes SD 抓取配置,将 Prometheus 配置为自动检测 GKE 中的应用。此配置使 Prometheus 能够查询 Kubernetes API,以发现可能存在的新抓取目标,且无需其他配置。 但是,您可以配置多个抓取目标发现机制:

  • Pod:每个 pod 的目标。
  • 服务:每个服务 IP 和端口组合的目标。
  • 端点:每个端点资源的目标。
  • 节点:每个 GKE 节点的目标。
  • 入站流量:入站流量规范中每个主机的目标。

当 Prometheus 发现目标时,便会抓取这些目标,以获取原始指标数据。 存储数据前,Prometheus 会根据从 GKE API 收到的信息为指标添加标签。例如,Prometheus 可以通过添加标签来丰富其从 pod 抓取的指标,这些标签可以是存储 pod 运行的命名空间、pod 名称的标签以及添加到 pod 中的任何标签。

使用 GKE 集群的相关信息配置 Prometheus 后,您需要向 Kubernetes 资源定义添加注释,以便 Prometheus 开始抓取您的服务、pod 或入站流量。如果您的服务具有此注释,Prometheus 便能够发现抓取目标(端点、pod)。通常使用 prometheus.io/scrape: "true",但您可以配置任何键。

例如,以下是抓取默认端口 (9090) 的服务,但该服务抓取了自定义路径 (/stats):

apiVersion: v1
kind: Service
metadata:
 annotations:
   prometheus.io/scrape: 'true'
   prometheus.io/path: '/stats'
 labels:
   app: demo
 name: demo
spec:
 ports:
 - port: 8080
   protocol: TCP
   targetPort: 8080
 - port: 9090
   protocol: TCP
   targetPort: 9090
 selector:
   app: demo

请参阅另一个配置为抓取 GKE 的 Prometheus 示例。

在下图中,Prometheus 配置为同时抓取 pod 和服务。

配置为抓取 pod 和服务的 Prometheus

使用 OpenCensus 检测应用

如前文所述,使用 Prometheus 监控应用需要您的应用采用正确格式在 HTTP 端点上公开数据。 借助 Prometheus 帮助程序库,您可以高效且符合习惯的方式添加这些端点。

OpenCensus 是一组与供应商无关的库,可用于从应用中导出指标和跟踪记录。OpenCensus 提供以 JavaGoNode.jsPython 语言编写的库,让您可以检测应用以便为包括 Prometheus 在内的各种后端提供指标和跟踪记录。使用 OpenCensus 进行检测的一大优势是,无论使用何种导出器,您的应用都可以公开 zPages,以便直接从服务器快速查看服务器进程的指标。zPages 在开发期间非常有用,或者在生产环境中出现问题时也有助于分析特定进程。

如果希望专注于仅公开指标,您可以使用 Prometheus 客户端库中的功能。

将 Cloud Operations for GKE 与 Prometheus 配对

如需将 Prometheus 服务器部署到集群中,您可以使用 Prometheus 支持的 Cloud Operations for GKE。此服务器会将指标发送到 Cloud Monitoring 作为外部指标。通过结合使用此功能与 Monitoring 的跨项目聚合指标功能,您可以管理多个集群和项目。

创建新的应用和指标时,它们会自动转发到 Cloud Monitoring 并根据数据保留政策保留。如果您使用 Monitoring 的内置功能来集中配置提醒正常运行时间检查,则可以在集群和区域之间关联数据并接收有关问题的通知。

在以下架构图中,Prometheus 在每个集群中运行,使您可以查看 Cloud Monitoring 中的聚合指标。

显示 Prometheus 在每个集群中运行,使您可以查看 Cloud Monitoring 中的聚合指标的架构图

连接现有系统

与大多数客户一样,您可能使用现有监控系统来存储有关运行系统的数据。随着检测代码量和应用数量的增加,将应用检测迁移到新的指标格式或时间序列数据库的费用也会增加。为了降低迁移到 Cloud Monitoring 的复杂性,您可以将 Prometheus 导出器用于其他监控系统,如 Graphite 或 StatsD。然后,您可以使用导出器将指标从现有系统发送到中间导出器进程,Prometheus 可以抓取该进程并将其发送到 Monitoring。

下图举例说明了如何通过 Prometheus 将 Graphite 指标从一组 Compute Engine 实例发送到 Monitoring。

从一组 Compute Engine 实例发送到 Cloud Monitoring 的 Graphite 指标

后续步骤