部署一个比较靠谱的prometheus监控

  1. 1. 部署方案以及组件
  2. 2. 从helm仓库下载helm chart
  3. 3. 修改kube-metrics镜像
  4. 4. 修改prometheus.yaml的内容(非必要)
  5. 5. 部署 prometheus 到集群
  6. 6. 部署grafana 作为dashboard
    1. 6.1. 拉取helm charts
  7. 7. 添加grafana监控dashboard
    1. 7.1. 添加数据源
    2. 7.2. 导入dashboard
    3. 7.3. 一些问题

部署方案以及组件

当前helm版本:3.6.3

Prometheus charts 版本: 14.11.0

grafana charts 版本:6.17.2

此处采用helm部署,helm提供的组件如下:

  • alertmanager: 负责接收并处理来自Prometheus Server(也可以是其它的客户端程序)的告警信息。Alertmanager可以对这些告警信息进行进一步的处理,比如当接收到大量重复告警时能够消除重复的告警信息,同时对告警信息进行分组并且路由到正确的通知方,Prometheus内置了对邮件,Slack等多种通知方式的支持,同时还支持与Webhook的集成,以支持更多定制化的场景.
  • nodeExporter: Node Exporter 是 Prometheus 官方发布的,用于采集节点的系统信息,比如 CPU,内存,磁盘和网络等信息。
  • pushgateway: Prometheus Pushgateway 允许将时间序列从短暂的服务级别批处理作业推送到 Prometheus 可以采集的中间作业。结合 Prometheus 的基于文本的简单展示格式,即使没有客户端库,也可以轻松集成,甚至编写 shell 脚本。
  • server: prometheus 主程序

从helm仓库下载helm chart

1
2
3
4
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo add kube-state-metrics https://kubernetes.github.io/kube-state-metrics
helm repo update
helm pull --untar prometheus-community/prometheus

打开prometheus文件夹下的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
49
50
51
52
53
54
55
alertmanager:    
ingress:
enabled: true # 开启ingress
annotations:
kubernetes.io/ingress.class: traefik # 添加traefik的声明,开启session 亲和性的功能
traefik.ingress.kubernetes.io/affinity: "true"
traefik.ingress.kubernetes.io/router.entrypoints: web
traefik.ingress.kubernetes.io/session-cookie-name: "route"
traefik.ingress.kubernetes.io/load-balancer-method: drr
hosts:
- alertmanager.local # 添加外部访问地址
persistentVolume:
size: 1Ti # 修改存储配置
storageClass: "aliyun-nas-retain" # 使用storageClass,这边采用阿里云nas
replicaCount: 2 # 修改副本数为2
statefulSet:
enabled: true # 多副本需使用statefulset部署
resources:
limits: # 添加资源使用限制
cpu: 500m
memory: 2048Mi
requests:
cpu: 200m
memory: 1024Mi
server:
ingress:
enabled: true # 开启ingress
annotations:
kubernetes.io/ingress.class: traefik # 添加traefik的声明,开启session 亲和性的功能
traefik.ingress.kubernetes.io/affinity: "true"
traefik.ingress.kubernetes.io/router.entrypoints: web
traefik.ingress.kubernetes.io/session-cookie-name: "route"
traefik.ingress.kubernetes.io/load-balancer-method: drr
hosts:
- prometheus.local # 配置prometheus服务器的访问域名
persistentVolume:
size: 1Ti # 修改存储容量
storageClass: "aliyun-nas-retain" # 配置storageClass
replicaCount: 2 # 修改prometheus副本数
statefulSet: # 使用statefulset
enabled: true
retention: "30d" # 修改prometheus数据保留时间
pushgateway:
ingress:
annotations:
kubernetes.io/ingress.class: traefik # 添加traefik的声明,开启session亲和性的功能
traefik.ingress.kubernetes.io/affinity: "true"
traefik.ingress.kubernetes.io/router.entrypoints: web
traefik.ingress.kubernetes.io/session-cookie-name: "route"
traefik.ingress.kubernetes.io/load-balancer-method: drr
hosts:
- pushgateway.local # 配置pushgateway访问域名
persistentVolume: # 配置pushgateway存储
size: 1Ti
storageClass: "aliyun-nas-retain"

修改kube-metrics镜像

由于k8s.gcr.io在国内无法访问,所以无法使用原有的所有镜像,据说阿里云提供gcr.io镜像仓库的镜像,但是经过实际测试,缺少大量镜像,目前的解决方案是使用bitnami/kube-state-metrics镜像替代原有的镜像。

修改prometheus/charts/kube-state-metrics/values.yaml

1
2
3
4
prometheusScrape: true
image:
repository: bitnami/kube-state-metrics # k8s.gcr.io/kube-state-metrics/kube-state-metrics
tag: 2.2.0 # bitnami的镜像版本tag与官方的镜像tag有部分区别,需要手动修改

修改prometheus.yaml的内容(非必要)

由于准备采用1 K8S for Prometheus Dashboard 20211010 编号 13105的grafana模板来展示数据。所以需要对job相应的修改,如果不准备采用此模板,可不做此项

关于节点名称的标签,因为cadvisor是使用instance,而kube-state-metrics是使用node;这样会导致grafana节点信息表格中,没有统一的字段来连接各个查询,所以需要在prometheus.yaml中增加以下内容来给cadvisor的指标复制一个node标签。

这边直接在values.yaml修改以下部分:

1
2
3
4
5
6
7
8
9
10
11
serverFiles:
prometheus.yml:
scrape_configs:
- job_name: 'kubernetes-nodes-cadvisor'
metric_relabel_configs: # 在原有基础上添加以下部分,增加node标签
- source_labels: [instance]
separator: ;
regex: (.+)
target_label: node
replacement: $1
action: replace

部署 prometheus 到集群

简单执行:

1
2
kubectl create ns prometheus
helm install prometheus prometheus -n prometheus

部署grafana 作为dashboard

拉取helm charts

简单执行:

1
2
3
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
helm pull --untar grafana/grafana

修改grafana/values.yaml,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: traefik # 添加ingress配置
traefik.ingress.kubernetes.io/router.entrypoints: web
hosts:
- grafana.local


persistence: # 添加数据持久化配置
type: pvc
enabled: true
storageClassName: "aliyun-nas-retain"
accessModes:
- ReadWriteOnce
size: 10Gi

添加grafana监控dashboard

可在此处找所需的监控模板,这边使用13105

添加数据源

填写prometheus的service的地址和端口

导入dashboard

输入13105  点击load
点击左侧面板的Search Dashboards

可找到刚才的dashboard

一些问题

目前使用他直接提供的dashboard似乎会存在某些问题

如安装prometheus时需添加node的label

容器网络显示也会出现问题,会出现nodata的情况

解决方案:

编辑nodata的这部分带宽数据

修改name = ~"^k8s_.*"name=~".*"