使用Prometheus + Grafana监控OpenStack

目录

  1. 概述
    1. 环境
  2. 安装Prometheus
    1. 安装node_exporter
    2. 安装openstack-exporter
    3. 安装prometheus-libvirt-exporter
  3. 安装Grafana
    1. 对接Prometheus
  4. 自动伸缩测试
    1. 新建集群
    2. 新建Grafana告警

概述

Prometheus是一个开源的完整监控解决方案,其对传统监控系统的测试和告警模型进行了彻底的颠覆,形成了基于中央化的规则计算、统一分析和告警的新模型。
为了不影响原有集群的性能,Prometheus和Grafana的主服务应该部署在单独的监控节点上。Prometheus的监控收集服务要部署在集群的对应节点上,例如node_exporter应该部署在集群的每个节点;libvirt_exporter应该部署在集群的计算节点上。

环境

Host IP 说明
monitor 10.10.15.88 监控节点
controller 10.10.15.89 控制节点
compute 10.10.15.76 计算节点

在部署Prometheus前先将每个节点的防火墙关闭。

1
systemctl disable --now firewalld.service

安装Prometheus

在监控节点上部署Prometheus的主服务。

  1. 下载Prometheus最新的安装包,并解压。

    1
    2
    wget https://github.com/prometheus/prometheus/releases/download/v2.40.2/prometheus-2.40.2.linux-amd64.tar.gz 
    tar -xzvf prometheus-2.40.1.linux-amd64.tar.gz
  2. 将二进制可执行文件复制到/usr/local/bin下。

    1
    2
    cd prometheus-2.40.1.linux-amd64/
    cp prometheus promtool /usr/local/bin/
  3. 新建用户prometheus。

    1
    sudo useradd --no-create-home --shell /bin/false prometheus
  4. 修改二进制可执行文件的用户和组。

    1
    2
    3
    mkdir /var/lib/prometheus
    chown prometheus:prometheus /usr/local/bin/prometheus \
    /usr/local/bin/promtool /var/lib/prometheus
  5. 新建/etc/prometheus文件夹,复制文件consoles和console_libraries到/etc/prometheus下。

    1
    2
    mkdir /etc/prometheus
    cp -r consoles console_libraries /etc/prometheus
  6. 编辑Prometheus的配置文件/etc/prometheus/prometheus.yml。

    1
    2
    3
    4
    5
    6
    7
    global:
    scrape_interval: 10s
    scrape_configs:
    - job_name: 'prometheus_master'
    scrape_interval: 5s
    static_configs:
    - targets: ['10.10.15.88:9090']
  7. 修改配置文件的用户和组

    1
    chown -R prometheus:prometheus /etc/prometheus/
  8. 编辑service文件/etc/systemd/system/prometheus.service。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    [Unit]
    Description=Prometheus
    Wants=network-online.target
    After=network-online.target
    [Service]
    User=prometheus
    Group=prometheus
    Type=simple
    ExecStart=/usr/local/bin/prometheus \
    --config.file /etc/prometheus/prometheus.yml \
    --storage.tsdb.path /var/lib/prometheus/ \
    --web.console.templates=/etc/prometheus/consoles \
    --web.console.libraries=/etc/prometheus/console_libraries
    [Install]
    WantedBy=multi-user.target
  9. 启动服务。

    1
    2
    3
    systemctl daemon-reload
    systemctl enable --now prometheus
    systemctl status prometheus
  10. 测试,访问http://10.10.15.88:9090/targets。

安装node_exporter

node_exporter主要用来收集主机的硬件信息,包括CPU、内存、I/O等。需要在每个需要要被监控的节点安装node_exporter服务。

  1. 下载最新的安装包,并解压。

    1
    2
    wget https://github.com/prometheus/node_exporter/releases/download/v1.4.0/node_exporter-1.4.0.linux-amd64.tar.gz
    tar -xzvf node_exporter-1.4.0.linux-amd64.tar.gz
  2. 将二进制可执行文件复制到/usr/local/bin下。

    1
    cd node_exporter-1.4.0.linux-amd64 && cp node_exporter /usr/local/bin/
  3. 编辑service文件/etc/systemd/system/node_exporter.service。

    1
    2
    3
    4
    5
    6
    7
    8
    [Unit]
    Description=Node Exporter
    After=network.target
    [Service]
    Type=simple
    ExecStart=/usr/local/bin/node_exporter
    [Install]
    WantedBy=multi-user.target
  4. 启动服务。

    1
    2
    3
    systemctl daemon-reload
    systemctl enable --now node_exporter
    systemctl status node_exporter
  5. 在各个节点执行完上述步骤后,在监控节点上编辑Prometheus的配置文件/etc/prometheus/prometheus.yml。

    1
    2
    3
    4
    5
    6
    7
    8
    scrape_configs:
    - job_name: 'node_exporter'
    scrape_interval: 5s
    static_configs:
    - targets:
    - '10.10.15.88:9100'
    - '10.10.15.89:9100'
    - '10.10.15.76:9100'
  6. 重启Prometheus。

    1
    systemctl restart prometheus
  7. 测试,访问http://10.10.15.88:9090/targets。

安装openstack-exporter

openstack-exporter主要用来收集openstack环境中的相关信息,包括云主机、镜像、网络等资源信息以及各个openstack服务的状态信息。

  1. 下载最新安装包,并解压。

    1
    2
    wget https://github.com/openstack-exporter/openstack-exporter/releases/download/v1.6.0/openstack-exporter_1.6.0_linux_amd64.tar.gz
    tar -xzvf openstack-exporter_1.6.0_linux_amd64.tar.gz
  2. 将二进制可执行文件复制到/usr/local/bin下。

    1
    cp openstack-exporter /usr/local/bin/
  3. 新建配置文件目录/etc/openstack/,并编写配置文件clouds.yaml。

    1
    2
    mkdir /etc/openstack/
    vim /etc/openstack/clouds.yaml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    clouds:
    test:
    region_name: RegionOne
    identity_api_version: 3
    identity_interface: internal
    auth:
    username: "admin"
    password: "000000"
    project_name: "admin"
    project_domain_name: "Default"
    project_domain_id: "default"
    user_domain_name: "Default"
    auth_url: "http://10.10.15.89:5000/v3"
    verify: false

    ustack:
    region_name: RegionOne
    identity_api_version: 3
    identity_interface: internal
    auth:
    username: "admin"
    password: "admin12#$"
    project_name: "admin"
    project_domain_name: "Default"
    project_domain_id: "default"
    user_domain_name: "Default"
    auth_url: "http://10.10.15.11:5000/v3"
    verify: false
  4. 编辑service文件。
    (1) /etc/systemd/system/openstack_exporter_test.service

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    [Unit]
    Description=OpenStack Exporter
    After=network.target
    [Service]
    Type=simple
    ExecStart=/usr/local/bin/openstack-exporter \
    --os-client-config /etc/openstack/clouds.yaml test \
    --disable-service.object-store \
    --disable-service.load-balancer \
    --disable-service.container-infra \
    --disable-service.gnocchi \
    --disable-service.dns \
    --disable-service.baremetal \
    --disable-service.database \
    --disable-service.orchestration \
    --web.listen-address=":9181"
    [Install]
    WantedBy=multi-user.target

    (2) /etc/systemd/system/openstack_exporter_ustack.service

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    [Unit]
    Description=OpenStack Exporter
    After=network.target
    [Service]
    Type=simple
    ExecStart=/usr/local/bin/openstack-exporter \
    --os-client-config /etc/openstack/clouds.yaml ustack \
    --disable-service.object-store \
    --disable-service.load-balancer \
    --disable-service.container-infra \
    --disable-service.gnocchi \
    --disable-service.dns \
    --disable-service.baremetal \
    --disable-service.database \
    --disable-service.orchestration \
    --web.listen-address=":9181"
    [Install]
    WantedBy=multi-user.target
  5. 启动服务。

    1
    2
    3
    systemctl daemon-reload
    systemctl enable --now openstack_exporter_test openstack_exporter_ustack
    systemctl status openstack_exporter_test openstack_exporter_ustack
  6. 编辑Prometheus的配置文件。

    1
    2
    3
    4
    5
    6
    scrape_configs:
    - job_name: 'openstack_exporter'
    scrape_interval: 60s
    scrape_timeout: 60s
    static_configs:
    - targets: ['10.10.15.88:9180', '10.10.15.88:9181']
  7. 重启Prometheus。

    1
    systemctl restart prometheus
  8. 测试,访问http://10.10.15.88:9090/targets。

安装prometheus-libvirt-exporter

prometheus-libvirt-exporter用于监控计算节点云主机的详细信息,包括CPU、内存、I/O以及网络的使用情况。需要将服务部署在每个计算节点上。

  1. 下载最新的安装包,并解压。

    1
    2
    3
    wget https://github.com/zhangjianweibj/prometheus-libvirt-exporter/\
    releases/download/v1.1.0/prometheus-libvirt-exporter.tar.gz
    tar -czvf prometheus-libvirt-exporter.tar.gz
  2. 复制可执行文件到/usr/local/bin/下。

    1
    2
    cd prometheus-libvirt-exporter/ 
    cp prometheus-libvirt-exporter /usr/local/bin/
  3. 编辑service文件/etc/systemd/system/prometheus_libvirt_exporter.service。

    1
    2
    3
    4
    5
    6
    7
    8
    [Unit]
    Description=Node Exporter
    After=network.target
    [Service]
    Type=simple
    ExecStart=/usr/local/bin/prometheus-libvirt-exporter
    [Install]
    WantedBy=multi-user.target
  4. 启动服务。

    1
    2
    3
    systemctl daemon-reload
    systemctl enable --now prometheus_libvirt_exporter
    systemctl status prometheus_libvirt_exporter
  5. 监控节点上编辑Prometheus的配置文件。

    1
    2
    3
    4
    5
    scrape_configs:
    - job_name: 'libvirt_exporter'
    scrape_interval: 5s
    static_configs:
    - targets: ['10.10.15.76:9000']
  6. 重启Prometheus。

    1
    systemctl restart prometheus
  7. 测试,访问http://10.10.15.88:9090/targets。

安装Grafana

  1. 下载RPM包,使用yum命令安装grafana。

    1
    2
    wget https://dl.grafana.com/oss/release/grafana-9.5.10-1.x86_64.rpm
    sudo yum install grafana-9.5.10-1.x86_64.rpm
  2. 启动服务。

    1
    2
    systemctl enable --now grafana-server
    systemctl status grafana-server
  3. 测试,访问http://10.10.15.88:3000/dashboards。

    GrafanaGrafana

登录名是admin默认没有密码,第一次登录会提示修改密码。

对接Prometheus

登录到grafana的后台终端,也就是http://10.10.15.88:3000/后。

  1. 点击新建Data Source。

    Data SourceData Source
  2. 选择Data Source类型为Prometheus。

    Data SourceData Source
  3. 编辑好相应的信息后,点击保存。

  4. 新建dashboard。grafana中有现成的配置好的dashboard供开发人员使用,可以通过官网选择合适的dashboard。例如为libvirt-exporter新建dashboard可以选择官网上的这个项目
    (1) 点击Dashbord中Import按钮。

    DashboardDashboard

    (2) 填写上述项目的ID号码。点击Load按钮。

    DashboardDashboard

    (3) 填好相关信息,选择Data Source为Prometheus。点击Imoport,这样就得到了一个可以展示云主机信息的dashboard。

    DashboardDashboard

    (4) 查看dashboard。如果监控数据正确的话,能看到如下的画面。

    DashboardDashboard

自动伸缩测试

我们可以利用Prometheus和Grafana的告警系统连同openstack中的senlin组件实现集群的自动伸缩。

新建集群

创建senlin集群的方式有命令行和界面,这里提供界面创建的步骤,比较直观。

  1. 登录openstack dashborad后,点击cluster,首先新建一个Profile。Profile类似Heat资源编排文件,功能是指定创建集群中各个节点的基本信息(flavor、image等)。

上面的flavor、image和network都需要提前创建,另外指定flavor、image和network的UUID同样生效。

2.通过创建好profile创建集群。

其中Min Size和Max Size分别指定集群最小和最大节点数。Max Size为-1表示集群最大无限大。Desired Capacity表示新建集群的初始大小,这里为2,也就是说新建的集群会直接初始化两个节点。

新建的集群信息。

节点信息。

这样集群就新建好了,下面新建Receiver。

3.创建Receiver。Receiver的就是触发集群伸缩的触发器。一般有scale in(收缩)和scale out(扩张)两种动作。所以要使集群自动伸缩的话要创建2个Receiver,来控制集群的收缩和扩张。
负责scale in的Receiver。

负责scale out的Receiver。

传递的参数count代表着当Receiver触发动作时,集群会增加或减少count个节点。

查看这两个Receiver的详细信息。注意它们的属性中的alarm_url这项,可以通过POST方式访问这个URL来触发这个Receiver。

ReceiverReceiver

上面的alarm_url分别是:

Receiver Alarm URL
mycluster_scale_in http://10.10.15.89:8777/v1/webhooks/17ca2527-d47e-488c-94dc-7f6626767296/trigger?V=2&count=1
mycluster_scale_out http://10.10.15.89:8777/v1/webhooks/02ae8621-f80b-4a11-9ace-eddc4fb161b0/trigger?V=2&count=1

新建Grafana告警

登录到Grafana后台,http://10.10.15.88:3000/。

1.打开grafana告警页面。

AlertAlert

2.新建告警规则。

AlertAlert

(1) 首先新建告警的通知方式,分别是scale out和scale in。

AlertAlert
AlertAlert

将上面的alarm_url分别填写到空格中。HTTP Method要选择POST。

(2) 然后创建通知的策略。也同样是两个。与上面的通知方式一一对应。

AlertAlert
AlertAlert

(3) 最后确定告警的规则。需要配合Prometheus的语法。例如我们想新建一个规则规定当集群里的节点的CPU平均使用率达到70%时就触发告警。可以这么写。
A的规则是:

1
irate(libvirt_domain_info_cpu_time_seconds_total{instanceId="28fa71ac-9ad7-4b02-a2c0-d27f157a80e2"}[30s]) * 100

B的规则是:

1
irate(libvirt_domain_info_cpu_time_seconds_total{instanceId="78f38479-ca84-4236-a3e8-0088e32d9faf"}[30s]) * 100

28fa71ac-9ad7-4b02-a2c0-d27f157a80e2和78f38479-ca84-4236-a3e8-0088e32d9faf都是集群内云主机的ID。

C的规则判断A和B的平均值是否都大于70%,是的话就会触发报警。

AlertAlert

(4) 最后编辑告警的基本信息和通知规则,这样一个监控告警就设置完成了。

AlertAlert