Prometheus 结合 Node Exporter 监控 Kubernetes 集群节点
文章目录
!版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。
系统环境:
- 操作系统: CentOS 7.9
- Docker 版本: 19.03.13
- Prometheus 版本: 2.25.0
- Kubernetes 版本: 1.20.2
- Node Exporter 版本: 1.1.2
参考地址:
示例地址:
系列文章目录
- 01. Kubernetes 部署监控工具 Prometheus
- 02. Kubernetes 部署图表工具 Grafana
- 03. Prometheus 结合 Node Exporter 监控 Kubernetes 集群节点
- 04. Prometheus 结合 StateMetrics+cAdvisor 监控 Kubernetes 集群服务
- 05. Prometheus 监听指定标签 Kubernetes 服务
- 06. Prometheus 监控 Kubernetes ETCD 集群
- 07. Prometheus Exporter 黑盒监控 Kubernetes 服务
- 08. Kubernetes 部署告警工具 AlertManager
- 09. AlertManager 配置邮箱告警
- 其它章节整理中...
一、什么是 Node Exporter
Node Exporter 是 Prometheus 官方提供的一个节点资源采集组件,可以用于收集服务器节点的数据,如 CPU频率信息
、磁盘IO统计
、剩余可用内存
等等。Node Exporter 会将收集到的信息转换为 Prometheus 可识别的 Metrics
数据。Prometheus 可以从 Node Exporter 中对这些指标进行收集与存储,并且可以根据这些数据的实时变化进行服务器节点资源监控。
二、Kubernetes 部署 Node Exporter
创建 Node Exporter
部署文件 node-exporter-deploy.yaml,内如如下:
1apiVersion: v1
2kind: Service
3metadata:
4 name: node-exporter
5 labels:
6 k8s-app: node-exporter
7spec:
8 type: ClusterIP
9 ports:
10 - name: http
11 port: 9100
12 targetPort: 9100
13 selector:
14 k8s-app: node-exporter
15---
16apiVersion: apps/v1
17kind: DaemonSet
18metadata:
19 name: node-exporter
20 labels:
21 k8s-app: node-exporter
22spec:
23 selector:
24 matchLabels:
25 k8s-app: node-exporter
26 template:
27 metadata:
28 labels:
29 k8s-app: node-exporter
30 spec:
31 containers:
32 - name: node-exporter
33 image: prom/node-exporter:v1.1.2
34 ports:
35 - name: metrics
36 containerPort: 9100
37 args:
38 - "--path.procfs=/host/proc"
39 - "--path.sysfs=/host/sys"
40 - "--path.rootfs=/host"
41 volumeMounts:
42 - name: dev
43 mountPath: /host/dev
44 - name: proc
45 mountPath: /host/proc
46 - name: sys
47 mountPath: /host/sys
48 - name: rootfs
49 mountPath: /host
50 volumes:
51 - name: dev
52 hostPath:
53 path: /dev
54 - name: proc
55 hostPath:
56 path: /proc
57 - name: sys
58 hostPath:
59 path: /sys
60 - name: rootfs
61 hostPath:
62 path: /
63 hostPID: true
64 hostNetwork: true
65 tolerations:
66 - operator: "Exists"
将 Node Exporter
配置文件部署到 Kubernetes
中:
- -f: 指定要部署的资源文件。
- -n: 指定 Namespace 名称。
1$ kubectl apply -f node-exporter-deploy.yaml -n kube-system
可以在 Kubernetes
任意 节点
中执行下面命令,测试是否能正常访问到 Node Exporter
暴露的 metrics
数据,执行的命令如下:
1$ curl -kL http://127.0.0.1:9100/metrics
然后可以看到指标数据如下所示:
1# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.
2# TYPE go_gc_duration_seconds summary
3go_gc_duration_seconds{quantile="0"} 0.000342889
4go_gc_duration_seconds{quantile="0.25"} 0.000342889
5go_gc_duration_seconds{quantile="0.5"} 0.001763509
6go_gc_duration_seconds{quantile="0.75"} 0.001763509
7go_gc_duration_seconds{quantile="1"} 0.001763509
8go_gc_duration_seconds_sum 0.002106398
9go_gc_duration_seconds_count 2
10# HELP go_goroutines Number of goroutines that currently exist.
11# TYPE go_goroutines gauge
12go_goroutines 8
13# HELP go_info Information about the Go environment.
14# TYPE go_info gauge
15go_info{version="go1.15.8"} 1
16# HELP go_memstats_alloc_bytes Number of bytes allocated and still in use.
17# TYPE go_memstats_alloc_bytes gauge
18go_memstats_alloc_bytes 2.49516e+06
19...(太长,略)
三、Prometheus 中添加 Node Exporter 配置
Prometheus 中添加 Node Exporter 服务发现配置
在 Prometheus
配置文件中添加 Node Exporter
指标数据采集配置,配置内容如下所示:
1scrape_configs:
2- job_name: 'node-exporter'
3 kubernetes_sd_configs:
4 - role: node
5 relabel_configs:
6 - action: replace
7 source_labels: [__address__]
8 regex: '(.*):10250'
9 replacement: '${1}:9100'
10 target_label: __address__
上面部分参数说明如下:
- kubernetes_sd_configs: 设置发现模式为 Kubernetes 动态服务发现。
- kubernetes_sd_configs.role: 指定 Kubernetes 的服务发现模式,这里设置为 Node 则表示从 Kubernetes 集群中每个节点发现目标,其默认地址为 Kubelet 地址的 HTTP 端口。
- relabel_configs: 用于对采集的标签进行重新标记。
Prometheus 配置文件中 relabel_configs 参数说明
上面 Node Exporter 使用的是 DaemonSet
方式部署到 Kubernetes
集群中的,这种部署方式能够在 Kubernetes 中每个节点里面都部署一个实例,如下图所示:
如图所示,每个节点上的 Node Exporter
都会通过 9100
端口和 /metrics
接口暴露节点节点监控指标数据。要想采集这些指标数据,我们可以在 Prometheus
配置文件中,添加全部的 Node Exporter
的 地址
与 端口
这样的静态配置。
不过配置地址是一件非常繁琐的事情,为什么这么说呢?这是因为在实际使用过程中,我们每当 Kubernetes
集群中"新增节点"或"剔除节点",那么我们就必须手动修改一次 Prometheus 配置,将它们更新。那么有没有配置一个配置,就能自动采集全部节点信息的配置呢?且能根据节点的变化而变化呢?
带着问题分析一下如何实现。刚刚讲了 Node Exporter
的 端口
和 指标暴露接口
在每个服务器节点中都是固定的,唯一可能每个节点中不一致的地方就是它们部署的服务器 IP
地址,如果我们能够获取它们的服务器 IP
地址,再加上 Node Exporter
应用的端口号 9100
,将其拼合在一起就组成 Node Exporter
的完整地址,即 <Kubernetes节点IP>:9100
的形式。这样我们也就可以在 Prometheus
配置文件中动态配置 Node Exporter
采集地址了。
不过 Prometheus
已经想到这点,其原生就提供了 Kubernetes
动态服务发现功能的支持,可以调用 Kube-ApiServer
接口获取 Kubernetes
集群相关信息。其中服务发现级别可以配置为 node
,这种级别下的动态服务发现可以获得 Kubernetes
集群中的全部 Kubelet
信息。要知道在 Kubernetes
中,每个节点都是通过 Kubelet
与 Master
交互进行管控的,所以 Kubelet
组件一定在每个节点中都存在。既然这个 node 服务发现机制能够发现在各个节点中的 Kubelet 信息,那么肯定能够获取 Kubelet 的 IP 地址,由于 Node Exporter 和 Kubelet 在一起,所以获取到 Kubelet IP 地址就相当于获取到 Node Exporter 的 IP 地址了。
到这里还没说 <relabel_configs>
标签中配置参数的作用,其中该标签就是用于从 Kubernetes 动态服务发现机制中,得到的标签列表中找到 __address__
标签的值,该标签就是 Kubelet 的地址。不过该地址是一个完整地址,所以,我们需要使用 regex 正则表达式来截取标签值中的 IP
部分,然后再在加上 9100
端口与 /metrics
地址 (在 Prometheus 配置中会忽略,因为对于 Prometheus 来说,当不指定采集接口时默认就会从 /metrics 接口获取指标数据),这样就得到了我们收集指标的 Node Exporter 的完整地址,再将它们写到目标标签 __address__
中作为指标数据采集的地址。
啰嗦了这么多,其实说白了通过这个 relabel_configs 重标记的功能获取 Kubernetes 各个节点地址,然后加上 Node Exporter 端口,组成完整采集地址,通过这个地址我们就可以收集我们需要的节点指标数据。
四、将 Prometheus 配置存入 ConfigMap 资源中
在之前介绍过 在 Kubernetes 中如何部署 Prometheus,部署过程中将 Prometheus 的配置文件存储在 Kubernetes 的 ConfigMap 资源里进行存储,所以我们需要修改 ConfigMap 资源中的配置内容,在配置中添加 Node Exporter 相关配置。
将上面 Prometheus
中的配置存入到 Kubernetes
中的 ConfigMap
资源文件 prometheus-config.yaml 中,资源内容如下:
1apiVersion: v1
2kind: ConfigMap
3metadata:
4 name: prometheus-config
5data:
6 prometheus.yml: |
7 global:
8 scrape_interval: 15s
9 evaluation_interval: 15s
10 external_labels:
11 cluster: "kubernetes"
12
13 scrape_configs:
14 ###################### Node Exporter ######################
15 - job_name: 'node-exporter'
16 kubernetes_sd_configs:
17 - role: node
18 relabel_configs:
19 - action: replace
20 source_labels: [__address__]
21 regex: '(.*):10250'
22 replacement: '${1}:9100'
23 target_label: __address__
将 Prometheus 配置文件 ConfigMap
资源部署到 Kubernetes
中:
- -f: 指定要部署的资源文件。
- -n: 指定 Namespace 名称。
1$ kubectl apply -f prometheus-config.yaml -n kube-system
重新加载 Prometheus 配置,这里本人的 Prometheus
地址为 http://192.168.2.32:30900,执行命令如下:
1$ curl -XPOST http://192.168.2.32:30900/-/reload
五、Grafana 中引入 Prometheus 数据库
上面已经配置完成 Prometheus
监控 Kubernetes
节点,不过我们很难直观的通过采集的 Metrics
数据观测节点运行状态信息。所以,这时候我们需要借助 Grafana 图表工具将这些指标信息绘制成图表,来直观的显示节点的运行情况。
在之前的 "Kubernetes 部署图表组件 Grafana" 文章中,已经介绍过如何在 Kubernetes 中部署 Grafana,有兴趣可以看一下,这里就不介绍该组件的安装过程。
进入 Grafana 界面,输入默认的用户名/密码 (默认为admin
/admin
) 进入 Grafana 界面中:
然后主界面后点左侧栏菜单,选择 Data Sources
来添加 Prometheus
数据库:
输入数据库名称与 Prometheus 地址,然后点 Save&Test
按钮。
这样我们就成功将 Prometheus
数据库添加到 Grafana
中了,后面展示图表时就可以选择指定使用该数据库读取数据。
六、Grafana 中引入 Node Exporter 监控看板
最后,我们需要引入 Grafana 官网上其它业界朋友开源的制作的图表来展示节点监控数据了,我们进行如下操作:
点击 Grafana 左侧栏菜单,选择 Manage
菜单,进入后点击右上角 Import
按钮:
设置 Import
的 ID
号为 8919
,引入 Node Exporter
模板,然后点击 Load
按钮进入配置数据库:
选择使用上面配置的 Prometheus
数据库,之后点击 Import
按钮进入看板:
可以看到如下监控信息:
我们可以根据图表中的看板实时观察每个节点服务器的运行情况,并且可以在此基础上使用 Grafana 提供的告警功能提供数据预警,还是和之前一样,更多功能需要在实践中摸索,才能快速掌握一个组件。
---END---
如果本文对你有帮助,可以关注我的公众号"小豆丁技术栈"了解最新动态,顺便也请帮忙 github 点颗星哦~感谢~
!版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。