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,内如如下:
apiVersion: v1kind: Servicemetadata: name: node-exporter labels: k8s-app: node-exporterspec: type: ClusterIP ports: - name: http port: 9100 targetPort: 9100 selector: k8s-app: node-exporter---apiVersion: apps/v1kind: DaemonSetmetadata: name: node-exporter labels: k8s-app: node-exporterspec: selector: matchLabels: k8s-app: node-exporter template: metadata: labels: k8s-app: node-exporter spec: containers: - name: node-exporter image: prom/node-exporter:v1.1.2 ports: - name: metrics containerPort: 9100 args: - "--path.procfs=/host/proc" - "--path.sysfs=/host/sys" - "--path.rootfs=/host" volumeMounts: - name: dev mountPath: /host/dev - name: proc mountPath: /host/proc - name: sys mountPath: /host/sys - name: rootfs mountPath: /host volumes: - name: dev hostPath: path: /dev - name: proc hostPath: path: /proc - name: sys hostPath: path: /sys - name: rootfs hostPath: path: / hostPID: true hostNetwork: true tolerations: - operator: "Exists"将 Node Exporter 配置文件部署到 Kubernetes 中:
- -f: 指定要部署的资源文件。
- -n: 指定 Namespace 名称。
$ kubectl apply -f node-exporter-deploy.yaml -n kube-system可以在 Kubernetes 任意 节点 中执行下面命令,测试是否能正常访问到 Node Exporter 暴露的 metrics 数据,执行的命令如下:
$ curl -kL http://127.0.0.1:9100/metrics然后可以看到指标数据如下所示:
# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.# TYPE go_gc_duration_seconds summarygo_gc_duration_seconds{quantile="0"} 0.000342889go_gc_duration_seconds{quantile="0.25"} 0.000342889go_gc_duration_seconds{quantile="0.5"} 0.001763509go_gc_duration_seconds{quantile="0.75"} 0.001763509go_gc_duration_seconds{quantile="1"} 0.001763509go_gc_duration_seconds_sum 0.002106398go_gc_duration_seconds_count 2# HELP go_goroutines Number of goroutines that currently exist.# TYPE go_goroutines gaugego_goroutines 8# HELP go_info Information about the Go environment.# TYPE go_info gaugego_info{version="go1.15.8"} 1# HELP go_memstats_alloc_bytes Number of bytes allocated and still in use.# TYPE go_memstats_alloc_bytes gaugego_memstats_alloc_bytes 2.49516e+06...(太长,略)三、Prometheus 中添加 Node Exporter 配置
Prometheus 中添加 Node Exporter 服务发现配置
在 Prometheus 配置文件中添加 Node Exporter 指标数据采集配置,配置内容如下所示:
scrape_configs:- job_name: 'node-exporter' kubernetes_sd_configs: - role: node relabel_configs: - action: replace source_labels: [__address__] regex: '(.*):10250' replacement: '${1}:9100' 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 中,资源内容如下:
apiVersion: v1kind: ConfigMapmetadata: name: prometheus-configdata: prometheus.yml: | global: scrape_interval: 15s evaluation_interval: 15s external_labels: cluster: "kubernetes"
scrape_configs: ###################### Node Exporter ###################### - job_name: 'node-exporter' kubernetes_sd_configs: - role: node relabel_configs: - action: replace source_labels: [__address__] regex: '(.*):10250' replacement: '${1}:9100' target_label: __address__将 Prometheus 配置文件 ConfigMap 资源部署到 Kubernetes 中:
- -f: 指定要部署的资源文件。
- -n: 指定 Namespace 名称。
$ kubectl apply -f prometheus-config.yaml -n kube-system重新加载 Prometheus 配置,这里本人的 Prometheus 地址为 http://192.168.2.32:30900,执行命令如下:
$ 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 提供的告警功能提供数据预警,还是和之前一样,更多功能需要在实践中摸索,才能快速掌握一个组件。
