prometheus结合Node Exporter监控k8s集群节点
系统环境
- 操作系统: CentOS 7.6
- Docker 版本: 19.03.5
- Prometheus 版本: 2.36.0
- Kubernetes 版本: 1.20.0
- Node Exporter 版本: 1.1.2
Node Exporter简介
Node Exporter 是 Prometheus 官方提供的一个节点资源采集组件,可以用于收集服务器节点的数据,如 CPU频率信息、磁盘IO统计、剩余可用内存等等。Node Exporter 会将收集到的信息转换为Prometheus可识别的Metrics数据,Prometheus可以从Node Exporter 中对这些指标进行收集与存储,并且可以根据这些数据的实时变化进行服务器节点资源监控
k8s部署Node Exporter
创建 Node Exporter 部署文件 node-exporter-ds.yaml
[root@k8s01 node-exporter]# vim node-exporter-ds.yaml
apiVersion: v1
kind: Service
metadata:
name: node-exporter
namespace: monitoring
labels:
k8s-app: node-exporter
spec:
type: ClusterIP
ports:
- name: http
port: 9100
targetPort: 9100
selector:
k8s-app: node-exporter
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-exporter
namespace: monitoring
labels:
k8s-app: node-exporter
spec:
selector:
matchLabels:
k8s-app: node-exporter
template:
metadata:
labels:
k8s-app: node-exporter
spec:
containers:
- name: node-exporter
image: prom/node-exporter:v1.3.1
imagePullPolicy: IfNotPresent
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"
[root@k8s01 node-exporter]# kubectl apply -f node-exporter-deploy.yaml
service/node-exporter created
daemonset.apps/node-exporter created
部署完后可在任一节点执行下面命令测试是否能够正常访问到Node Exporter暴露的metrics数据
[root@k8s01 node-exporter]# curl -kL http://127.0.0.1:9100/metrics
...
process_max_fds 1.048576e+06
# HELP process_open_fds Number of open file descriptors.
# TYPE process_open_fds gauge
process_open_fds 9
# HELP process_resident_memory_bytes Resident memory size in bytes.
# TYPE process_resident_memory_bytes gauge
process_resident_memory_bytes 1.1456512e+07
# HELP process_start_time_seconds Start time of the process since unix epoch in seconds.
# TYPE process_start_time_seconds gauge
process_start_time_seconds 1.6545927432e+09
# HELP process_virtual_memory_bytes Virtual memory size in bytes.
# TYPE process_virtual_memory_bytes gauge
process_virtual_memory_bytes 7.33663232e+08
# HELP process_virtual_memory_max_bytes Maximum amount of virtual memory available in bytes.
# TYPE process_virtual_memory_max_bytes gauge
process_virtual_memory_max_bytes 1.8446744073709552e+19
# HELP promhttp_metric_handler_errors_total Total number of internal errors encountered by the promhttp metric handler.
# TYPE promhttp_metric_handler_errors_total counter
promhttp_metric_handler_errors_total{cause="encoding"} 0
promhttp_metric_handler_errors_total{cause="gathering"} 0
...
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: 用于对采集的标签进行重新标记
配置文件中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
之前k8s部署peometheus了,部署过程中将 Prometheus的配置文件存储在 Kubernetes 的 ConfigMap 资源里进行存储,所以我们需要修改 ConfigMap 资源中的配置内容,在配置中添加 Node Exporter 相关配置
[root@k8s01 prometheus]# vim prometheus-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-config
namespace: monitoring
data:
prometheus.yml: |
global:
scrape_interval: 15s
evaluation_interval: 15s
external_labels:
cluster: "kubernetes"
scrape_configs:
- job_name: prometheus
static_configs:
- targets: ['127.0.0.1:9090']
labels:
instance: prometheus
###################### 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__
[root@k8s01 prometheus]# kubectl apply -f prometheus-config.yaml
configmap/prometheus-config configured
重新加载 Prometheus 配置
[root@k8s01 prometheus]# curl -XPOST http://10.x.x.x:30089/-/reload
Grafana引入模板
到这已经完成 Prometheus 监控 Kubernetes 节点,不过我们很难直观的通过采集的 Metrics 数据观测节点运行状态信息。需要借助 Grafana 图表工具将这些指标信息绘制成图表,来直观的显示节点的运行情况,之前已经介绍过如何在 Kubernetes 中部署 Grafana,这里就不介绍该组件的安装过程
点击 Grafana 左侧栏菜单,选择 Manage 菜单,进入后点击右上角 Import 按钮,输入8919,引入Node Exporter模板,然后点击Load按钮配置数据库,结果如下: