prometheus监控告警

常见的监控数据类型

主要分为两大类:

  1. 应用级别的数据 :主要了解应用自身的一些监控指标 eg: cpu 使用率,内存使用率,请求失败率等
  2. 集群级别的数据 :主要了解自身的运行状况,节点的 cpu,内存,网络吞吐等指标及时了解 kubelet 的负载情况,k8s 各组件的状态

运行过程中, k8s 产生的各种 event 数据,以及 deployment,sts,daemonset,pod 等状态,资源请求,调用和 API 延迟等数据指标也是必须要收集的

常见的监控数据收集工具

  1. cAdvisor : v1.12 版本已移除

  2. hapster : 通过 cAdvisor 收集汇总的各种性能数据,做自动伸缩 (Autoscale) 所依赖的组件,已被废除,使用 metrics-server 来替换

  3. metrics-server : 集群范围内的监控数据聚合工具。 (可以通过标准的 Kubernetes API 来访问到这些监控数据)

  1. kube-state-metrics : 可以监听 kube-apiserver 中的数据,并生成有关资源对象的新的状态指标,eg: deployment ,Node, Pod (和 metrics-server 的最大区别)

  2. node-export : Prometheus 的一个 export, 可以获取到节点级别的监控指标

  3. Promtheus + Grafana : 推荐方案

Prometheus

prometheus

Prometheus 项目工作的核心 Prometheus Server,是使用 Pull 的方式去搜集被监控对象的 Metrics 数据(监控指标数据),然后,再把这些数据保存在一个 TSDB (时间序列数据库,比如 OpenTSDB、InfluxDB 等)当中,以便后续可以按照时间进行检索。

有了这套核心监控机制, Prometheus 剩下的组件就是用来配合这套机制的运行。

  1. Pushgateway : 可以允许被监控对象以 Push 的方式向 Prometheus 推送 Metrics 数据。主要用于 Job 类,Job 类程序可能存活时间比较短,不适合采用拉取的方式。
  2. Alertmanager : 则可以根据 Metrics 信息灵活地设置报警。
  3. Grafana : 前台界面,对外暴露出、可以灵活配置的监控数据可视化界面。
  4. Exporters :用于一些第三方服务,通过转换提供符合 Prometheus 规范的 Metrics 信息,比如 Node Exporter 提供节点相关的信息。
  5. Service Disvovery:用于服务发现,获取服务对应的 EndPoint 用于数据采集,默认支持 DNS、Consul、Kubernestes 等多种发现方案, 自动发现新服务可以被监控,减少手动配置 Prometheus 的配置。
  6. Client Library:为各种语言提供的客户端库,提供 HTTP 服务的 Metrics 接口,当 Prometheus Server 拉取时,提供实时的 Metrics 数据。

kube-aggregator

kubeadm 部署默认开启

1
2

http://127.0.0.1:8001/apis/metrics.k8s.io/v1beta1/namespaces/<namespace-name>/pods/<pod-name>

KubernetesAPI Server 开启了 Aggregator 模式之后,你再访问 apis/metrics.k8s.io/v1beta1 的时候,实际上访问到的是一个叫作 kube-aggregator 的代理。而 kube-apiserver,正是这个代理的一个后端;而 Metrics Server,则是另一个后端。在这个机制下,你还可以添加更多的后端给这个 kube-aggregator。所以 kube-aggregator 其实就是一个根据 URL 选择具体的 API 后端的代理服务器。通过这种方式,我们就可以很方便地扩展 KubernetesAPI 了。

kube-prometheus-stack 个性化定制

按需修改文件, 修改 grafana 自定义一些配置

/etc/kubeasz/clusters/k8s-01/yml/prom-values.yaml

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
## Using default values from https://github.com/grafana/helm-charts/blob/main/charts/grafana/values.yaml
grafana:
enabled: true
adminUser: admin
adminPassword: password
image:
repository: easzlab.io.local:5000/prometheus/grafana
service:
nodePort: 30903
type: NodePort
sidecar:
image:
repository: easzlab.io.local:5000/prometheus/k8s-sidecar
skipTlsVerify: true

datasources:
datasources.yaml:
datasources:
- name: Prometheus
type: prometheus
url: http://prometheus-kube-prometheus-prometheus:9090
access: proxy
isDefault: true

grafana.ini:
paths:
data: /var/lib/grafana/
logs: /var/log/grafana
plugins: /var/lib/grafana/plugins
provisioning: /etc/grafana/provisioning
analytics:
check_for_updates: true
log:
mode: console
grafana_net:
url: https://grafana.net
users:
default_theme: light
security:
allow_embedding: true
auth.anonymous:
enabled: true
org_role: Viewer
auth.basic:
enabled: false
server:
root_url: http://localhost/test/grafana/
serve_from_sub_path: true

或者

kube-prometheus-stack/charts/grafana/values.yaml

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
grafana.ini:
paths:
data: /var/lib/grafana/
logs: /var/log/grafana
plugins: /var/lib/grafana/plugins
provisioning: /etc/grafana/provisioning
analytics:
check_for_updates: true
log:
mode: console
grafana_net:
url: https://grafana.net
users:
default_theme: light
security:
allow_embedding: true
auth.anonymous:
enabled: true
org_role: Viewer
auth.basic:
enabled: false
server:
root_url: http://localhost/test/grafana/
serve_from_sub_path: true

# datasources: {} 更改为下面
datasources:
datasources.yaml:
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
url: http://prometheus-kube-prometheus-prometheus:9090
access: proxy
isDefault: true

运行安装

1
2
3
 /etc/kubeasz/bin/helm uninstall prometheus -n monitor

/etc/kubeasz/bin/helm upgrade prometheus --install -n monitor -f /etc/kubeasz/clusters/k8s-01/yml/prom-values.yaml /etc/kubeasz/roles/cluster-addon/files/kube-prometheus-stack-45.23.0.tgz

或者完成后修改 kubectl edit cm -n monitor prometheus-grafana

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
apiVersion: v1
data:
grafana.ini: |
[analytics]
check_for_updates = true
[grafana_net]
url = https://grafana.net
[log]
mode = console
[paths]
data = /var/lib/grafana/
logs = /var/log/grafana
plugins = /var/lib/grafana/plugins
provisioning = /etc/grafana/provisioning
[users]
default_theme = light
[security]
allow_embedding = true
[auth.anonymous]
enabled = true
org_role = Viewer
[auth.basic]
enabled = false
[server]
root_url = http://localhost/test/grafana/
serve_from_sub_path = true

如果网页提示 datasource 找不到。 使用 admin 账户 填加 datasource

http://prometheus-kube-prometheus-prometheus:9090

添加企业微信机器人通知(dingding 一样的)

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
alertmanager:
alertmanagerSpec:
image:
registry: easzlab.io.local:5000
service:
nodePort: 30902
type: NodePort

config:
global:
resolve_timeout: 5m
inhibit_rules:
- equal:
- namespace
- alertname
source_matchers:
- severity = critical
target_matchers:
- severity =~ warning|info
- equal:
- namespace
- alertname
source_matchers:
- severity = warning
target_matchers:
- severity = info
- equal:
- namespace
source_matchers:
- alertname = InfoInhibitor
target_matchers:
- severity = info
receivers:
- name: web.hook
webhook_configs:
- send_resolved: false
url: http://prometheus-webhook-adapter:8060/adapter/wx
- name: "null"
route:
group_by:
- namespace
group_interval: 5m
group_wait: 30s
receiver: web.hook
repeat_interval: 12h
routes:
- matchers:
- alertname = "InfoInhibitor"
receiver: "null"
- matchers:
- alertname = "Watchdog"
receiver: "web.hook"
- matchers:
- "severity = critical"
receiver: "web.hook"
templates:
- /etc/alertmanager/config/*.tmpl'

## Using default values from https://github.com/grafana/helm-charts/blob/main/charts/grafana/values.yaml

或者完成后修改 kubectl get secrets -n monitor alertmanager-prometheus-kube-prometheus-alertmanager base64编码

test_webhook.yaml

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
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
run: prometheus-webhook-adapter
name: prometheus-webhook-adapter
namespace: monitor
spec:
selector:
matchLabels:
run: prometheus-webhook-adapter
template:
metadata:
labels:
run: prometheus-webhook-adapter
spec:
containers:
- args:
- --adapter=/app/prometheusalert/dingtalk.js=/adapter/dingtalk=https://oapi.dingtalk.com/robot/send?access_token={token}#{secret}
- --adapter=/app/prometheusalert/wx.js=/adapter/wx=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxxxxxxxxxxxxxxxxxxxxxx
image: imwl/prometheus-webhook-adapter:v1
name: prometheus-webhook-adapter
ports:
- containerPort: 80
protocol: TCP

---
apiVersion: v1
kind: Service
metadata:
labels:
run: prometheus-webhook-adapter
name: prometheus-webhook-adapter
namespace: monitor
spec:
ports:
- port: 8060
protocol: TCP
targetPort: 80
selector:
run: prometheus-webhook-adapter
type: ClusterIP