常见的监控数据类型
主要分为两大类:
- 应用级别的数据 :主要了解应用自身的一些监控指标 eg: cpu 使用率,内存使用率,请求失败率等
- 集群级别的数据 :主要了解自身的运行状况,节点的 cpu,内存,网络吞吐等指标及时了解 kubelet 的负载情况,k8s 各组件的状态
运行过程中, k8s 产生的各种 event 数据,以及 deployment,sts,daemonset,pod 等状态,资源请求,调用和 API 延迟等数据指标也是必须要收集的
常见的监控数据收集工具
cAdvisor : v1.12 版本已移除
hapster : 通过 cAdvisor 收集汇总的各种性能数据,做自动伸缩 (Autoscale) 所依赖的组件,已被废除,使用
metrics-server来替换metrics-server : 集群范围内的监控数据聚合工具。 (可以通过标准的
Kubernetes API来访问到这些监控数据)
kube-state-metrics : 可以监听 kube-apiserver 中的数据,并生成有关资源对象的新的状态指标,eg: deployment ,Node, Pod (和 metrics-server 的最大区别)
node-export : Prometheus 的一个 export, 可以获取到节点级别的监控指标
Promtheus + Grafana : 推荐方案
Prometheus

Prometheus 项目工作的核心 Prometheus Server,是使用 Pull 的方式去搜集被监控对象的 Metrics 数据(监控指标数据),然后,再把这些数据保存在一个 TSDB (时间序列数据库,比如 OpenTSDB、InfluxDB 等)当中,以便后续可以按照时间进行检索。
有了这套核心监控机制, Prometheus 剩下的组件就是用来配合这套机制的运行。
Pushgateway: 可以允许被监控对象以Push的方式向Prometheus推送Metrics数据。主要用于Job类,Job类程序可能存活时间比较短,不适合采用拉取的方式。Alertmanager: 则可以根据Metrics信息灵活地设置报警。Grafana: 前台界面,对外暴露出、可以灵活配置的监控数据可视化界面。Exporters:用于一些第三方服务,通过转换提供符合Prometheus规范的Metrics信息,比如Node Exporter提供节点相关的信息。Service Disvovery:用于服务发现,获取服务对应的EndPoint用于数据采集,默认支持DNS、Consul、Kubernestes等多种发现方案, 自动发现新服务可以被监控,减少手动配置 Prometheus 的配置。Client Library:为各种语言提供的客户端库,提供HTTP服务的Metrics接口,当Prometheus Server拉取时,提供实时的Metrics数据。
补

kubeadm 部署默认开启
1 |
|
Kubernetes 的 API Server 开启了 Aggregator 模式之后,你再访问 apis/metrics.k8s.io/v1beta1 的时候,实际上访问到的是一个叫作 kube-aggregator 的代理。而 kube-apiserver,正是这个代理的一个后端;而 Metrics Server,则是另一个后端。在这个机制下,你还可以添加更多的后端给这个 kube-aggregator。所以 kube-aggregator 其实就是一个根据 URL 选择具体的 API 后端的代理服务器。通过这种方式,我们就可以很方便地扩展 Kubernetes 的 API 了。
kube-prometheus-stack 个性化定制
按需修改文件, 修改 grafana 自定义一些配置
/etc/kubeasz/clusters/k8s-01/yml/prom-values.yaml1
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.yaml1
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
35grafana.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-grafana1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26apiVersion: 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 | alertmanager: |
或者完成后修改 kubectl get secrets -n monitor alertmanager-prometheus-kube-prometheus-alertmanager base64编码
test_webhook.yaml1
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
42apiVersion: 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