安装
参考 常见服务安装
验证
1 | [root@test-249 manifests]# kubectl get svc -n monitoring |
原理
详情见 监控告警
metrics 类型
1 | [root@test-249 manifests]# curl 10.56.67.105:9090/metrics |
- Counter:只增不减的计数器 eg: http_requests_total , node_cpu
- Gauge:可增可减 eg: 主机的cpu、内存、磁盘使用率,当前的并发量
- Histogram : 近似的百分比估算数值,用于统计和分析样本的分布情况(eg :请求响应时间0.5s, 0.5~1, 1以上各自的占比)
- Summary:可以理解为 Histogram 的精准百分比估算数值
PromQL
瞬时向量:包含该时间序列中最新的一个样本值
区间向量:一段时间范围内的数据
Offset :查看多少分钟之前的数据 offset 30m
Labelsets:
过滤出具有handler=”/login”的label的数据。
正则匹配:http_request_total{handler=~”.login.“}
剔除某个label:http_request_total{handler!~”.login.“}
匹配两个值:http_request_total{handler=~”/login|/password”}
数学运算:+ - * / % ^
查看主机内存总大小(Mi)
除法:node_memory_MemTotal_bytes / 1024 /1024
node_memory_MemTotal_bytes / 1024 /1024 < 3000
集合运算:and or
node_memory_MemTotal_bytes / 1024 /1024 <= 2772 or node_memory_MemTotal_bytes / 1024 /1024 == 3758.59765625
unless:排除
node_memory_MemTotal_bytes / 1024 /1024 >= 2772 unless node_memory_MemTotal_bytes / 1024 /1024 == 3758.59765625
* / %
+ -
==, !=, <=, < >= >
and unless or
聚合操作:
sum(node_memory_MemTotal_bytes) / 1024^2 求和
根据某个字段进行统计 sum(http_request_total) by (statuscode, handler)
min(node_memory_MemTotal_bytes) 最小值 max
avg(node_memory_MemTotal_bytes) 平均值 avg
标准差:stddev 标准差异:stdvar
count(http_request_total) 计数
count_values("count", node_memory_MemTotal_bytes) 对value进行统计计数
topk(5, sum(http_request_total) by (statuscode, handler)) 取前N条时序
bottomk(3, sum(http_request_total) by (statuscode, handler)) 取后N条时序
取当前数据的中位数
quantile(0.5, http_request_total)
内置函数:
一个指标的增长率
increase(http_request_total{endpoint=”http”,handler=”/datasources/proxy/:id/*”,instance=”10.244.58.200:3000”,job=”grafana”,method=”get”,namespace=”monitoring”,pod=”grafana-86b55cb79f-fn4ss”,service=”grafana”,statuscode=”200”}[1h]) / 3600
rate(http_request_total{endpoint=”http”,handler=”/datasources/proxy/:id/*”,instance=”10.244.58.200:3000”,job=”grafana”,method=”get”,namespace=”monitoring”,pod=”grafana-86b55cb79f-fn4ss”,service=”grafana”,statuscode=”200”}[1h])
长尾效应。
irate: 瞬时增长率,取最后两个数据进行计算
不适合做需要分期长期趋势或者在告警规则中使用。
rate
预测统计:
predict_linear(node_filesystem_files_free{mountpoint=”/“}[1d], 4*3600) < 0
根据一天的数据,预测4个小时之后,磁盘分区的空间会不会小于0
absent():如果样本数据不为空则返回no data,如果为空则返回1。判断数据是否在正常采集。
去除小数点:
Ceil():四舍五入,向上取最接近的整数,2.79 3
Floor:向下取, 2.79 2
Delta():差值
free内存差异 delta(node_memory_MemFree_bytes[2h])
排序:
Sort:正序
Sort_desc:倒叙
Label_join:将数据中的一个或多个label的值赋值给一个新label
label_join(node_filesystem_files_free, “new_label”, “,”, “instance”, “mountpoint”)
label_replace:根据数据中的某个label值,进行正则匹配,然后赋值给新label并添加到数据中
label_replace(node_filesystem_files_free, “host”,”$2”, “instance”, “(.)-(.)”)
解决监控问题:
CPUThrottlingHigh 反应的是最近 5 分钟超过 25% 的 CPU 执行周期受到限制的 container,一般是 limit 设置的低引起的。
通过两个指标进行监控的:
- container_cpu_cfs_periods_total:container生命周期中度过的cpu周期总数
- container_cpu_cfs_throttled_periods_total:container生命周期中度过的受限的cpu周期总数
计算表达式:sum by(container, pod, namespace) (increase(container_cpu_cfs_throttled_periods_total{container!=""}[5m])) / sum by(container, pod, namespace) (increase(container_cpu_cfs_periods_total[5m])) > (25 / 100)
解决 schedule 和 controller 监控问题
1 | apiVersion: v1 |
pushgateway
示例
1 | #!/bin/bash |
exporter
exporter 的要求
- 是
HTTP服务器,可以响应从外发过来的HTTP GET请求 - 后台运行,并可定期抓取 本地的监控数据
- 给
prometheus_server的内容 是需要符合prometheus规定的metrics类型 - key-value -> prometheus(TS) values( float int ) 值是 浮点数或整数
优先选择 开源的 export ,其次使用 pushgateway ,最后使用自己的 export
AlertManager
eg 修改 alerts 的 configmap1
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
[root@test4 ~]# kubectl describe cm -n monitoring prometheus-server
Name: prometheus-server
Namespace: monitoring
Labels: app=prometheus
chart=prometheus-8.11.4
component=server
heritage=Tiller
release=prometheus
Annotations: <none>
Data
====
alerts:
----
groups:
- name: host_status_alert
rules:
- alert: 主机宕机
annotations:
description: 主机{{ $labels.instance }}宕机超过1分钟告警!
summary: 主机{{ $labels.instance }}宕机
expr: up{job="node-exporter"} == 0
for: 1m
labels:
severity: critical
- alert: CPU使用过高
annotations:
description: 主机{{ $labels.instance }}当前CPU使用率是{{ $value }}%,CPU使用率大于60%告警!
summary: 主机{{ $labels.instance }}CPU使用率过高
expr: 100-(avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by(instance)* 100)
> 60
for: 5m
labels:
severity: warning
- alert: 内存使用过高
annotations:
description: 主机{{ $labels.instance }}当前内存使用率是{{ $value }}%,内存使用率大于80%告警!
summary: 主机{{ $labels.instance }}内存使用率过高
expr: ((node_memory_MemTotal_bytes- node_memory_MemFree_bytes - node_memory_Buffers_bytes
- node_memory_Cached_bytes) / (node_memory_MemTotal_bytes )) * 100 > 80
for: 5m
labels:
severity: warning
- alert: 磁盘空间剩余不足
annotations:
description: 主机{{ $labels.instance }}的磁盘{{ $labels.mountpoint }}当前使用率是{{ $value
}},磁盘使用率大于80%告警!
summary: 主机{{ $labels.instance }}的磁盘{{ $labels.mountpoint }}可以空间不足
expr: (1-(node_filesystem_free_bytes{fstype=~"ext4|xfs|ceph",mountpoint!~"/var.*"}
/ node_filesystem_size_bytes{fstype=~"ext4|xfs|ceph",mountpoint!~"/var.*"}))
* 100 > 80
for: 5m
labels:
severity: warning
- alert: TCP连接数过多
annotations:
description: 主机{{ $labels.instance }}当前TCP_ESTABLISHED={{ $value }},TCP连接数大于1000告警!
summary: 主机{{ $labels.instance }}TCP连接数过多
expr: node_netstat_Tcp_CurrEstab > 1000
for: 5m
labels:
severity: page