指标真的在流动的 Prometheus
本实验在真正的 Prometheus 上运行
VM 中实际运行着 Prometheus、Alertmanager 和 node-exporter。 node-exporter 会提供真实指标,因此 PromQL 处理的是真实数据,规则会被 实际评估,告警也会真正触发并发送至 Alertmanager。
PCA 课程其他实验使用的模拟集群中 并没有 Prometheus 本身。 之前能做的只有练习编写查询。
不使用 kube-prometheus-stack。 如果由 Operator 代写配置,
就没有机会接触 prometheus.yml,而 PCA 考查的正是这个文件。
首次启动大约需要 3 分钟。
已准备的内容
Prometheus http://127.0.0.1:30090 설정은 /etc/prometheus/prometheus.yml
Alertmanager http://127.0.0.1:30093
규칙 /etc/prometheus/rules/rules.yml
대상 node-exporter(데몬셋) · demo-app · Prometheus 자신
질의 도구 promq 'up'
目标
从抓取配置开始,亲手连接整条路径,直至告警到达 Alertmanager。
为什么重要
使用 Prometheus 时,最常遇到的障碍并不是语法。
- 配置已修改,却没有生效。 ConfigMap 卷由 kubelet 定期同步,不会立即更新(约 60 秒)。如果在传播完成前执行
reload,读取的仍是旧配置,而reload依然会返回 200。 - 收不到告警。 常见情况是规则已经触发,但因为没有配置
alerting.alertmanagers,所以无处发送。 up == 0告警没有触发。 目标一旦消失,up时间序列本身也会消失。只有在目标仍然存在但没有响应时,up == 0才为真。
最后一点尤其重要。原以为‘服务宕机就会收到告警’,但在 Pod 整体消失的部署事故中, 却会完全没有告警。
步骤
- 确认当前正在抓取哪些目标,并将结果保存到
/root/pca/targets.txt。 - 使用
kubernetes_sd_configs自动发现 Pod,并将结果保存到/root/pca/sd.txt。 - 使用
relabel_configs只保留带有注解的目标,创建app标签,并将结果保存到/root/pca/relabel.txt。 - 编写 PromQL 并保存到
/root/pca/promql.txt。需要包含instant=、range=、rate_result=三行。 - 创建一条记录规则(名称遵循
level:metric:operation约定),确认它确实产生结果,并保存到/root/pca/recording.txt。 - 创建一条告警规则,让目标实际发生故障,直至进入
firing状态,并将结果保存到/root/pca/alert.txt。还要使用for子句。 - 让 Prometheus 将告警发送到 Alertmanager,并将实际送达的结果保存到
/root/pca/am.txt。 - 在
/root/pca/report.md中写入up_targets=、alert_fired=yes、recording_rule=三行及相关说明。
参考
- 使用
promq 'up'进行查询。结果为 JSON,可以通过| jq进行筛选。 - 修改配置文件后,执行
curl -XPOST http://127.0.0.1:30090/-/reload。Pod 通过 hostPath 直接挂载该目录,因此修改会立即生效。 - 如果 reload 返回的不是 200,说明配置存在语法错误。 此时旧配置仍然有效,服务不会停止。
- 使用
curl -s $P/api/v1/targets | jq查看目标状态。被重标签规则过滤的目标会出现在droppedTargets中。 - 在第 6 步中,要让
up == 0成立,必须确保目标存在但没有响应。让static_configs指向一个无人监听的端口是最可靠的方法。 - 常见错误 1:试图通过删除 Pod 来制造
up == 0。目标会从列表中消失,时间序列本身也随之消失。这种情况应使用absent()检测。 - 常见错误 2:记录规则名称中不使用冒号。这样就无法仅凭名称区分规则生成的指标和原始指标。
当前正在抓取什么
确认当前正在抓取哪些目标,并将结果保存到 /root/pca/targets.txt。
同时查看 /api/v1/targets 和当前的 prometheus.yml。
不手动填写目标
使用 kubernetes_sd_configs 自动发现 Pod,并将结果保存到 /root/pca/sd.txt。
在 kubernetes_sd_configs 中使用 role: pod,列表就会随着 Pod 的创建和消失自动更新。
保留什么、丢弃什么
使用 relabel_configs 只保留带有注解的目标,创建 app 标签,并将结果保存到 /root/pca/relabel.txt。
以 __meta_ 开头的标签只在重标签之前存在。使用 keep 进行筛选,再通过 target_label 创建新标签。
查询真实数据
编写 PromQL 并保存到 /root/pca/promql.txt。需要包含 instant=、range=、rate_result= 三行。
需要包含 instant=、range=、rate_result= 三行。计数器应使用 rate()。
预先计算结果
创建一条记录规则(名称遵循 level:metric:operation 约定),确认它确实产生结果,并保存到 /root/pca/recording.txt。
名称应遵循 level:metric:operation 约定。必须包含冒号,才能与原始指标区分开来。
让告警实际触发
创建一条告警规则,让目标实际发生故障,直至进入 firing 状态,并将结果保存到 /root/pca/alert.txt。还要使用 for 子句。
只有在目标仍然存在但没有响应时,up == 0 才为真。删除 Pod 会使时间序列本身消失。
告警必须有发送目的地
让 Prometheus 将告警发送到 Alertmanager,并将实际送达的结果保存到 /root/pca/am.txt。
如果不配置 alerting.alertmanagers,即使规则已触发,告警也不会发送到任何地方。
学到了什么
在 /root/pca/report.md 中写入 up_targets=、alert_fired=yes、recording_rule= 三行及相关说明。
写入 up_targets=、alert_fired=yes、recording_rule= 三行及相关说明。