Prometheus 结合 Node Exporter 监控 Kubernetes 集群节点

Prometheus 结合 Node Exporter 监控 Kubernetes 集群节点

文章目录

  !版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。


系统环境:

  • 操作系统: CentOS 7.9
  • Docker 版本: 19.03.13
  • Prometheus 版本: 2.25.0
  • Kubernetes 版本: 1.20.2
  • Node Exporter 版本: 1.1.2

参考地址:

示例地址:


系列文章目录


一、什么是 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 中,每个节点都是通过 KubeletMaster 交互进行管控的,所以 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 按钮:

设置 ImportID 号为 8919,引入 Node Exporter 模板,然后点击 Load 按钮进入配置数据库:

选择使用上面配置的 Prometheus 数据库,之后点击 Import 按钮进入看板:

可以看到如下监控信息:

我们可以根据图表中的看板实时观察每个节点服务器的运行情况,并且可以在此基础上使用 Grafana 提供的告警功能提供数据预警,还是和之前一样,更多功能需要在实践中摸索,才能快速掌握一个组件。

---END---

如果本文对你有帮助,可以关注我的公众号"小豆丁技术栈"了解最新动态,顺便也请帮忙 github 点颗星哦~感谢~


  !版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。