本站总访问量 GKE的Prometheus - Jerry的小站

Jerry Gao

上帝就是真理,真理就是上帝

概述

Prometheus

Prometheus是一个云原生计算基金会项目,是一个系统和服务监控系统。它以给定的时间间隔从配置的目标收集指标,评估规则表达式,显示结果,并可以在观察到指定条件时触发警报。Prometheus是Kubeernetes的事实标准。Prometheus仓库地址:https://github.com/prometheus/prometheus。

Architecture overview 体系结构概述

Prometheus包含以下组件:

  • Prometheus Server:
    • 数据搜集:定期从配置的位置抓取指标
    • 数据存储:存储抓取到的指标数据
    • 查询:提供PromQL
    • 规则提醒或警报:对指标数据进行规则评估,生成新的时间序列或触发告警
  • Exporters:这些是外部进程,用于将现有的第三方服务和应用程序指标转换为Prometheus可以抓取的格式。例如,node_exporter用于提取操作系统级指标。
  • Pushgateway:用于短暂的批处理作业。由于 Prometheus 本质上是一个抓取模型,因此 Pushgateway 允许短暂的任务推送指标,以便 Prometheus 可以随后抓取
    • Prometheus Pushgateway仓库。允许临时和批处理作业向 Prometheus 公开其指标,这些类型的作业可能存在的时间不够长,无法抓取,因此他们可以将其指标推送到 Pushgateway,然后,Pushgateway将这些指标公开给Prometheus。
  • AlertManager:管理警报。当 Prometheus 检测到某些条件满足预先配置的规则时,它会向 AlertManager 发送警报,然后 AlertManager 负责通知或采取其他操作。
  • Client Libraries:允许用户在其应用程序中集成和导出自定义指标。

Google Cloud Managed Service for Prometheus

Google Cloud Managed Service for Prometheus是Google对于Prometheus的托管服务,它托管指标的完全托管的收集、存储和查询服务。它建立在Monarch之上,Monarch是一个全球可扩展数据存储服务,为Google的所有应用程序监控提供支持。在标准 Prometheus 部署中,数据收集、查询评估、规则和提醒评估,以及数据存储都在单个 Prometheus 服务器中处理。Managed Service for Prometheus 将这些功能的责任拆分为多个组件:

  • 数据收集由代管式收集器、自行部署的收集器、OpenTelemetry 收集器或 Ops Agent 处理,这些收集器或代理会爬取本地导出器,并将收集到的数据转发到 Monarch。这些收集器可用于 Kubernetes 和传统工作负载,并且可以在任何地方运行,包括其他云和本地部署。
  • 查询评估由 Monarch 处理,它会在所有 Google Cloud 区域和多达 1,000 个 Google Cloud 项目中执行查询并联合结果。
  • 规则和提醒评估由本地运行和本地配置的规则评估器组件处理,这些组件针对全局 Monarch 数据存储区执行规则和提醒,并将所有触发的提醒转发到 Prometheus AlertManager
  • 数据存储由 Monarch 处理,它会将所有 Prometheus 数据存储 24 个月,不产生额外费用。

Grafana 连接到全局 Monarch 数据存储区,而不是连接到各个 Prometheus 服务器。

部署

代管式搜集器

以下默认已经启用了 Cloud Monitoring APIGoogle Cloud 项目创建了GKE集群并在本地设置好了gcloud和kubectl工具

启用代管式搜集器

启用代管式收集会在集群中安装以下组件:

  • gmp-operator Deployment,用于为 Managed Service for Prometheus 部署 Kubernetes Operator。
  • rule-evaluator Deployment,用于配置并运行提醒和记录规则。
  • collector DaemonSet,用于从与收集器所在节点上运行的 Pod 爬取指标来横向扩缩收集。
  • alertmanager StatefulSet,配置为向首选通知渠道发送触发的提醒。

在GKE 1.25 版或更高版本的 GKE Autopilot 集群和GKE 1.27 版或更高版本的 GKE Standard 集群,代管式搜集器是默认启用的。

1
gcloud container clusters update CLUSTER_NAME --enable-managed-prometheus --zone ZONE/REGION

配置PodMonitoring资源

假设有一个在metrics 端口上发出 example_requests_total 计数器指标和 example_random_numbers 直方图指标的应用:

1
2
3
4
5
6
7
8
9
10
11
apiVersion: monitoring.googleapis.com/v1
kind: PodMonitoring
metadata:
name: prom-example
spec:
selector:
matchLabels:
app: prom-example
endpoints:
- port: metrics
interval: 30s
启用目标状态

启用目标状态可以检查资源的目标状态,通过如下启动:

1
2
3
4
5
6
7
8
apiVersion: monitoring.googleapis.com/v1
kind: OperatorConfig
metadata:
namespace: gmp-public
name: config
features:
targetStatus:
enabled: true

查询应用注入的指标

参见 https://cloud.google.com/stackdriver/docs/managed-prometheus/query?hl=zh-cn#gmp-in-monitoring

配置Prometheus和Grafana

部署Prometheus前端页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend
spec:
replicas: 2
selector:
matchLabels:
app: frontend
template:
metadata:
labels:
app: frontend
spec:
automountServiceAccountToken: true
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/arch
operator: In
values:
- arm64
- amd64
- key: kubernetes.io/os
operator: In
values:
- linux
containers:
- name: frontend
env:
- name: AUTH_USERNAME
value: AUTH_USERNAME
- name: AUTH_PASSWORD
value: AUTH_PASSWORD
image: gke.gcr.io/prometheus-engine/frontend:v0.7.0-gke.0
args:
- "--web.listen-address=:9090"
- "--query.project-id=$PROJECT_ID"
ports:
- name: web
containerPort: 9090
readinessProbe:
httpGet:
path: /-/ready
port: web
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- all
privileged: false
runAsGroup: 1000
runAsNonRoot: true
runAsUser: 1000
livenessProbe:
httpGet:
path: /-/healthy
port: web
---
apiVersion: v1
kind: Service
metadata:
name: frontend
spec:
clusterIP: None
selector:
app: frontend
ports:
- name: web
port: 9090

修改上述AUTH_USERNAME,AUTH_PASSWORD,然后将$PROJECT_ID修改为字面量,如果不知道可以通过gcloud projects list查看。

Grafana页面

1
2
kubectl -n monitor apply -f  https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/beb779d32f4dd531a3faad9f2916617b8d9baefd/examples/grafana.yaml
kubectl -n monitor port-forward svc/grafana 3000

然后可以在本地访问http://localhost:3000,即可看到Grafana页面。

参考文档

评论