2.4 Prometheus 采集 node 指标数据
配置 Prometheus 通过 node exporter 采集 node 节点的监控指标数据。
下面是 Prometheus 默认配置:
root@server:~# vim /apps/prometheus/prometheus.yml
# 全局配置
global: # 数据采集生产环境推荐配置为 30s 一次,如果使用默认的 15s 一次的话数据量过多
scrape_interval: 15s # 采集间隔默认 15s 一次,如果不配置默认为一分钟
evaluation_interval: 15s # 规则采集时间 15s 一次,如果不配置默认为一分钟
# scrape_timeout is set to the global default (10s). 默认数据采集超时时间
# Alertmanager 告警配置
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093 # 将告警时间发送给 alert manager 组件的 9093 端口,这个地方能够写多个
# 监控规则配置
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# 数据采集目标配置
# 需要指定 job 名称,并且这个名称是唯一的不能冲突
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: "prometheus"
# metrics_path defaults to '/metrics' ,被抓去数据的端口下面默认得有 /metrics 的 URL 才行,所以自己开发 exporter 也需要指定该 URL
# scheme defaults to 'http'.
# 固定的服务上抓取数据,如果需要抓取多个得使用相同写法实现抓取
static_configs:
- targets: ["localhost:9090"]
1.修改 yaml 文件将 node-exporter 添加至 Prometheus 监控中
# yaml 文件中的 scrape_configs 字段中添加下面几行
root@server:~# vim /apps/prometheus/prometheus.yml
- job_name: "node_exporter"
static_configs:
- targets: ["10.0.0.138:9100","10.0.0.137:9100"] # 有多个 node 需要通过 逗号隔开
2.检查配置文件
# 通过 promtool 工具检查 yaml 文件
root@server:/apps/prometheus# ./promtool check config prometheus.yml
Checking prometheus.yml
SUCCESS: 0 rule files found
3.重启加载 Prometheus
root@server:/apps/prometheus# systemctl reload prometheus.service
2.4.1 浏览器验证
http://10.0.0.139:9090/targets
1.node 节点已经实现被监控,其实这里 Prometheus 就是抓取的后端暴露的 metrics API 接口
2.配置好了之后我们就可以通过监控指标项来获取 node 的对应数据,比如这里我通过 node_memory_MemTotal_bytes
监控项来获取该 node 的内存总量,他拿到的这个数据是字节为单位
但是现在他一次性将所有的 node 都输出,那么我们该如何查看单个 node 信息呢?如下操作:在匹配的监控项后面通过大括号来取出,这个是 promQL 独有的语句
如果有多个主机我们可以通过 instance="xxxxxx"
来进行匹配
这样 Prometheus 就会周期性的去收集数据并将其存储至 TSDB
2.4.2 监控 K8S node
上面我演示了如何收集 node 资源,现在我们只需将 node_exporter 部署至 K8S 的 node 上
2.4.2.1 安装 node_exporter
1.在 K8S 集群中创建 apps 文件
# mkdir /apps
# cd /apps
2.下载安装包
# wget https://github.com/prometheus/node_exporter/releases/download/v1.2.2/node_exporter-1.2.2.linux-amd64.tar.gz
3.解压
# tar xf node_exporter-1.2.2.linux-amd64.tar.gz
4.制作软连接
# ln -sv /apps/node_exporter-1.2.2.linux-amd64 /apps/node_exporter
5.编写 service 文件
# vim /etc/systemd/system/node-exporter.service
[Unit]
Description=Prometheus Node Exporter
After=network.target
[Service]
ExecStart=/apps/node_exporter/node_exporter
[Install]
WantedBy=multi-user.target
6.加载
# 1systemctl reload
# 开机启动
# systemctl enable --now node-exporter.service
2.4.2.2 配置 server 端实现监控
我们装好了 K8S 集群的 node_exporter 之后需要修改 Prometheus 的配置文件将其把 K8S node 添加进去
1.修改 Prometheus-server 配置文件
root@server:/apps/prometheus# vim /apps/prometheus/prometheus.yml
- job_name: "kubernetes-node"
static_configs:
- targets: ["10.0.0.130:9100","10.0.0.131:9100","10.0.0.132:9100"]
2.重新加载 Prometheus
root@server:/apps/prometheus# systemctl reload prometheus.service
3.浏览器验证已监控
2.5 blackbox exporter 监控 URL
https://prometheus.io/download/#blackbox_exporter
blackbox_exporter 是 Prometheus 官方提供的一个 exporter,可以通过 HTTP, HTTPS, DNS, TCP 和 ICMP 对被监控节点进行监控和数据采集。
blackbox exporter 是一个相对比较重要的 exporter
HTTP/HTPPS:URL/API 可用性检测
TCP:端口监听检测
ICMP:主机存活检测
DNS:域名解析
监控流程:
监控 URL 的流程并不是在 blackbox 上面配置,而是需要在 Prometheus-server 上进行配置,在配置文件中添加 job 该 job 就是对一些 URL 或端口进行监控,在 Prometheus 上配置好了之后会将监控传给 exporter ,然后再将监控项传给 blackbox-exporter ,最后在是 blackbox-exporter 来监控网站的可用性,将监控数据抓取下来并返回给 Prometheus ,Prometheus 在将数据存储至 TSDB。
对于 blackbox 来说需要配置的东西不多只需要知道监控那些 URL 和端口就行,这个端口还是在 Prometheus 中配置
默认不需要修改 blackbox 的配置文件
2.5.1 部署 blackbox exporter
1.下载安装包
root@node:~# cd /apps/
root@node:/apps# wget https://github.com/prometheus/blackbox_exporter/releases/download/v0.19.0/blackbox_exporter-0.19.0.linux-amd64.tar.gz
2.解压
root@node:/apps# tar xf blackbox_exporter-0.19.0.linux-amd64.tar.gz
3.创建软连接
root@node:/apps# ln -sv /apps/blackbox_exporter-0.19.0.linux-amd64 /apps/blackbox
4.编写 service 文件
# vim /etc/systemd/system/blackbox-exporter.service
[Unit]
Description=Prometheus Blackbox Exporter
After=network.target
[Service]
Type=simple
ExecStart=/apps/blackbox/blackbox_exporter \
--config.file=/apps/blackbox/blackbox.yml \
--web.listen-address=:9115
Restart=on-failure
[Install]
WantedBy=multi-user.target
5.加载 service 文件
root@node:/apps# systemctl daemon-reload
root@node:/apps# systemctl enable --now blackbox.service
6.验证
# 9115 端口已经监听
root@node:/apps# ss -ntl | grep 9115
LISTEN 0 128 *:9115 *:*
当 blackbox 起来之后不会抓取数据因为他连需要监控的数据都不知道,这个需要通过 Prometheus server 将采集项传递给他
7.查看 blackbox 配置文件
# 在 blackbox 配置中都是以模块的
root@node:/apps# cat blackbox/blackbox.yml
modules:
http_2xx: # 这个名字是随便写的,但是需要在 prometheus.yml 配置文件中对应起来。
prober: http # 进行探测的协议,可以是 http、tcp、dns、icmp
http_post_2xx:
prober: http
http:
method: POST
tcp_connect: # tcp检测,比如检测某个端口是否在线
prober: tcp
pop3s_banner:
prober: tcp
tcp:
query_response:
- expect: "^+OK"
tls: true
tls_config:
insecure_skip_verify: false
ssh_banner:
prober: tcp
tcp:
query_response:
- expect: "^SSH-2.0-"
- send: "SSH-2.0-blackbox-ssh-check"
irc_banner:
prober: tcp
tcp:
query_response:
- send: "NICK prober"
- send: "USER prober prober prober :prober"
- expect: "PING :([^ ]+)"
send: "PONG ${1}"
- expect: "^:[^ ]+ 001"
icmp:
prober: icmp # icmp 检测,比如ping某个服务器
2.5.2 web 访问验证
http://10.0.0.138:9115/
2.5.3 blackbox 实现对 URL 监控
prometheus 调用 blackbox exporter 实现对 URL/ICMP 的监控。
我们需要在 Prometheus-server 中配置,让 Prometheus 抓起的时候将这些数据传递给 blackbox
1.Prometheus 添加 blackbox 配置详解
# vim /apps/prometheus/prometheus.yml
# 网站监控
- job_name: 'http_status' # 任务名称
metrics_path: /probe # 抓取数据默认保持不动
params: # 参数
module: [http_2xx] # 调用 blackbox 模块
static_configs:
- targets: ['http://www.xiaomi.com', 'http://www.baidu.com'] # 监控网站,所以要求 blackbox 服务器能够访问
labels: # 由于有多个监控指标通过打 labels 的方式进行区分各个
instance: http_status # Prometheus web 页面名称
group: web
relabel_configs: # 添加标签
- source_labels: [__address__] # relabel 通过将 __address__(当前目标地址) 写入 __param_target 标签来创建一个 label。source_labels 和 target_label 是一个键值对,会生成一个新的 label,通过变量获取
target_label: __param_target # 监控目标 www.xiaomi.com,www.baidu.com 作为 __address__ 的 value
- source_labels: [__param_target] # 调用监控目标
target_label: url # 将监控目标与 url 创建一个 label,url 是 key value= __param_target
- target_label: __address__ # 定义监控 __address__ 的 blackbox
replacement: 10.0.0.138:9115 # 写入 blackbox 的 ip 和端口
2.添加配置文件
root@server:/apps/prometheus# vim prometheus.yml
- job_name: "http_status"
metrics_path: /probe
params:
module: [http_2xx]
static_configs:
- targets: ['http://www.xiaomi.com', 'http://www.baidu.com']
labels:
instance: http_status
group: web
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: url
- target_label: __address__
replacement: 10.0.0.138:9115
3.检查语法并重新加载 Prometheus
root@server:/apps/prometheus# ./promtool check config prometheus.yml
Checking prometheus.yml
SUCCESS: 0 rule files found
root@server:/apps/prometheus# systemctl reload prometheus.service
2.5.3.1 web 访问验证
url 就是 key 值的话来自于我们监控的目标域名
Prometheus 监控之后我们再去看 blackbox 的 web 界面
如果说我们还想监控一个域名,只需要在 Prometheus 的配置文件中的 targets
字段在添加一个即可如下操作
1.添加新的 URL
2.重新加载
root@server:/apps/prometheus# systemctl reload prometheus.service
3.浏览器访问已经添加成功