前言

在生产环境中,常常有部署在k8s平台外的服务,对于平台外的主机我们需要及时知道哪些机器宕机了,所以我们想把这些主机纳入Prometheus-Operator监控,并能产生告警机制。
采用node_exporter的形式对k8s平台外部的机器进行数据采集,并暴露metrics接口。主要有以及下步骤:

  1. 为主机安装node_exporter
  2. 创建EndPoints资源
  3. 创建ServiceMonitor
  4. 创建告警Rule

为主机安装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: 严重告警

总结

这个流程走下来,我们总结一下,集群外部的服务,无论是主机监控还是中间件业务监控,都是一样的,就是各自需要采集的数据和告警规则不一样而已。
无非是以下步骤:

  1. 准备相关exporter,如:kafka_exporter、zookeeper_exporter、node_exporter
  2. 安装exporter,并设置好相关权限,如:node_exporter需要主机的相关信息,kafka_exporter需要kafka的链接地址
  3. 设置EndPoints资源,让k8s集群能够获得外部exporter的地址
  4. 设置service和servicemonitor,也就是让prometheus建立采集的任务job
  5. 设置grafana的dashboard,可以到grafana-dashboard去找找
  6. 设置告警规则,不同角色不同服务,告警规则的设置,告警路由的完善。以kafka的监控为例,系统运维只关心,机器有没有问题,kafka管理员只关心,kafka有没有正常运行,jvm怎么样,用户只关心topic消费了没?能不能发送和接收消息,消息的命中率和消息堆积情况怎么样

以上就是在prometheus-operator中如何监控外部服务的内容了,感谢阅读!QAQ


 目录


买个卤蛋,吃根冰棒