前言
在生产环境中,常常有部署在k8s平台外的服务,对于平台外的主机我们需要及时知道哪些机器宕机了,所以我们想把这些主机纳入Prometheus-Operator监控,并能产生告警机制。
采用node_exporter的形式对k8s平台外部的机器进行数据采集,并暴露metrics接口。主要有以及下步骤:
为主机安装node_exporter
为监控各云主机,需要在主机安装node_exporter,该组件可以采集主机cpu、内存、网络、磁盘等各种主机信息,并且提供metrics的web接口供promethues
采集。安装方式可以使用docker 或者 本地服务的方式安装,本文介绍docker方式安装。以下为初始化脚本
#!/bin/bash
set -x
registries=$1
yum install -y docker
systemctl enable docker
systemctl start docker
sed -i 's/{}/{ "insecure-registries":['$registries'] }/' /etc/docker/daemon.json
systemctl restart docker
docker run -d --name node_exporter \
--restart=always \
--net="host" \
--pid="host" \
--privileged=true \
-v "/proc:/host/proc:ro" \
-v "/sys:/host/sys:ro" \
-v "/:/rootfs:ro" \
$registries/prometheus/node-exporter:v0.18.1 \
--path.procfs=/host/proc \
--path.rootfs=/rootfs \
--path.sysfs=/host/sys \
--collector.filesystem.ignored-mount-points='^/(sys|proc|dev|host|etc)($$|/)'
其中安装了docker以及源的修改,部署了node_exporter 使用ansible可以批量安装 ansible all -m script -a "script path" 192.168.0.9:5001
或者按照自己的想法进行修改,测试ansible all -m shell curl localhost:9100/metrics
能发现数据说明安装完成
创建EndPoints资源
promethues-operator在k8s中定义了一系列的crd资源,其中ServiceMonitor只能对Service进行监听,而我们的服务是游离在k8s集群外部的,所以
需要将外部地址做成EndPoints资源。如代码:
apiVersion: v1
kind: Endpoints
metadata:
name: node-exporter-ext
subsets:
- addresses:
- ip: 10.8.122.21
- ip: 10.8.122.21
- ip: 10.8.122.21
- ip: 10.8.122.21
ports:
- name: http-9100
port: 9100
protocol: TCP
只需要将ip或者端口填上即可
创建ServiceMonitor
创建好了EndPoints,需要创建Service和ServiceMonitor
Service 文件如下:
apiVersion: v1
kind: Service
metadata:
labels:
app: node-exporter-ext
name: node-exporter-ext
spec:
clusterIP: None
ports:
- name: http-9100
port: 9100
protocol: TCP
targetPort: http-9100
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
ServiceMonitor 是promethues-operator自定义的CRD资源,创建一个ServiceMonitor,promethues-operator就会创建一个job,去收集相关的metrics,实例如下:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
labels:
app: node-exporter-ext
prometheus: ipaas
name: node-exporter-ext
spec:
endpoints:
- interval: 30s
port: http-9100
scheme: http
jobLabel: app
namespaceSelector:
matchNames:
- monitoring
selector: {}
上面代码中描述了endpoints的信息,以及抓取周期为30s,到了这步,从生成采集服务到数据录入prometheus就完成了,也可以制作dashboard,node_exporter dashboard推荐
创建告警Rule
prometheus-operator告警文件对应于k8s下kind为PrometheusRule的CRD资源,参考如下:
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
labels:
prometheus: ipaas
role: alert-rules
name: prometheus-ipaas-node-alerts
spec:
groups:
- name: 主机状态-监控告警
rules:
- alert: 主机状态
annotations:
description: '{{$labels.instance}}:服务器延时超过5分钟'
summary: '{{$labels.instance}}:服务器宕机'
expr: 'up{job=~"node-exporter.*"} == 0'
for: 1m
labels:
status: 非常严重
- alert: CPU使用情况
annotations:
description: '{{$labels.mountpoint }} CPU使用大于60%(目前使用:{{$value}}%)'
summary: '{{$labels.mountpoint}} CPU使用率过高!'
expr: >-
100-(avg(irate(node_cpu_seconds_total{mode="idle"}[5m]))
by(instance)* 100) > 60
for: 1m
labels:
status: 一般告警
- alert: 内存使用
annotations:
description: '{{$labels.mountpoint }} 内存使用大于80%(目前使用:{{$value}}%)'
summary: '{{$labels.mountpoint}} 内存使用率过高!'
expr: >-
100 -(node_memory_MemTotal_bytes
-node_memory_MemFree_bytes+node_memory_Buffers_bytes+node_memory_Cached_bytes
) / node_memory_MemTotal_bytes * 100> 80
for: 1m
labels:
status: 严重告警
- alert: IO性能
annotations:
description: '{{$labels.mountpoint }} 流入磁盘IO大于60%(目前使用:{{$value}})'
summary: '{{$labels.mountpoint}} 流入磁盘IO使用率过高!'
expr: >-
100-(avg(irate(node_disk_io_time_seconds_total[1m])) by(instance)*
100) < 60
for: 1m
labels:
status: 严重告警
- alert: 网络
annotations:
description: '{{$labels.mountpoint }}流入网络带宽持续2分钟高于100M. RX带宽使用率{{$value}}'
summary: '{{$labels.mountpoint}} 流入网络带宽过高!'
expr: >-
((sum(rate
(node_network_receive_bytes_total{device!~'tap.*|veth.*|br.*|docker.*|virbr*|lo*'}[5m]))
by (instance)) / 100) > 102400
for: 1m
labels:
status: 严重告警
- alert: 网络
annotations:
description: '{{$labels.mountpoint }}流出网络带宽持续2分钟高于100M. RX带宽使用率{{$value}}'
summary: '{{$labels.mountpoint}} 流出网络带宽过高!'
expr: >-
((sum(rate
(node_network_transmit_bytes_total{device!~'tap.*|veth.*|br.*|docker.*|virbr*|lo*'}[5m]))
by (instance)) / 100) > 102400
for: 1m
labels:
status: 严重告警
- alert: TCP会话
annotations:
description: '{{$labels.mountpoint }} TCP_ESTABLISHED大于1000%(目前使用:{{$value}}%)'
summary: '{{$labels.mountpoint}} TCP_ESTABLISHED过高!'
expr: node_netstat_Tcp_CurrEstab > 1000
for: 1m
labels:
status: 严重告警
- alert: 磁盘容量
annotations:
description: '{{$labels.mountpoint }} 磁盘分区使用大于80%(目前使用:{{$value}}%)'
summary: '{{$labels.mountpoint}} 磁盘分区使用率过高!'
expr: >-
100-(node_filesystem_free_bytes{fstype=~"ext4|xfs"}/node_filesystem_size_bytes
{fstype=~"ext4|xfs"}*100) > 80
for: 1m
labels:
status: 严重告警
总结
这个流程走下来,我们总结一下,集群外部的服务,无论是主机监控还是中间件业务监控,都是一样的,就是各自需要采集的数据和告警规则不一样而已。
无非是以下步骤:
- 准备相关exporter,如:kafka_exporter、zookeeper_exporter、node_exporter
- 安装exporter,并设置好相关权限,如:node_exporter需要主机的相关信息,kafka_exporter需要kafka的链接地址
- 设置EndPoints资源,让k8s集群能够获得外部exporter的地址
- 设置service和servicemonitor,也就是让prometheus建立采集的任务job
- 设置grafana的dashboard,可以到grafana-dashboard去找找
- 设置告警规则,不同角色不同服务,告警规则的设置,告警路由的完善。以kafka的监控为例,系统运维只关心,机器有没有问题,kafka管理员只关心,kafka有没有正常运行,jvm怎么样,用户只关心topic消费了没?能不能发送和接收消息,消息的命中率和消息堆积情况怎么样
以上就是在prometheus-operator中如何监控外部服务的内容了,感谢阅读!QAQ
本博客所有文章除特别声明外,均采用: 署名-非商业性使用-禁止演绎 4.0 国际协议,转载请保留原文链接及作者。