Установка и первоначальная настройка Prometheus + Alertmanager на CentOS 8

В данной статье я расскажу про установку и первоначальную настройка Prometheus + Alertmanager на CentOS 8.

Статей на эту тему в Интернет предостаточно, но как обычно в них есть опечатки, в результате чего некоторые вещи оказываются неработоспособными.

Исходные данные: CentOS 8.3
Задача: Установить Prometheus, Alertmanager и node_exporter, а так же произвести базовую настройку всех компонентов.

1. Первым делом на сервере должна быть настроена синхронизация времени по NTP

На самом деле на CentOS 8 при базовой установке для синхронизации времени ставится chronyd, нам лишь нужно убедиться, что он запущен и время синхронизируется:

# systemctl status chronyd
● chronyd.service - NTP client/server
   Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2021-05-13 20:07:52 +05; 3h 4min ago
     Docs: man:chronyd(8)
           man:chrony.conf(5)
 Main PID: 782 (chronyd)
    Tasks: 1 (limit: 4930)
   Memory: 1.3M
   CGroup: /system.slice/chronyd.service
           └─782 /usr/sbin/chronyd

Смотрим текущий статус синхронизации часов:

timedatectl status

Результат:

               Local time: Thu 2021-05-13 23:14:25 +05
           Universal time: Thu 2021-05-13 18:14:25 UTC
                 RTC time: Thu 2021-05-13 18:14:22
                Time zone: Asia/Yekaterinburg (+05, +0500)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

Мы видим, что все синхронно.

2. Теперь разберемся с настройкой firewall

Для работы всех компонентов нужно открыть несколько портов:

  • 9090/tcp — HTTP для сервера Prometheus
  • 9093/tcp — HTTP для Alertmanager
  • 9094/tcp и 9094/udp — для Alertmanager
  • 9100/tcp — для работы node_exporter
  • На CentOS 8 используется firewalld, поэтому откроем нужные порты используя firewall-cmd, вначале проверим активную зону:

    # firewall-cmd --get-active-zones
    public
      interfaces: enp0s3
    

    Теперь добавим в public-зону нужные порты:

    firewall-cmd --permanent --zone=public --add-port=9090/tcp --add-port=9093/tcp --add-port=9094/{tcp,udp} --add-port=9100/tcp
    firewall-cmd --reload
    

    Проверим настройки:

    # firewall-cmd --permanent --zone=public --list-all
    public
      target: default
      icmp-block-inversion: no
      interfaces:
      sources:
      services: dhcpv6-client ssh
      ports: 9090/tcp 9093/tcp 9094/tcp 9094/udp 9100/tcp
      protocols:
      masquerade: no
      forward-ports:
      source-ports:
      icmp-blocks:
      rich rules:
    

    3. Далее нам нужно проверить SELinux и отключить его

    Конечно это не самый правильный вариант, но практика показывает, что для серверов в локальной сети это вполне допустимо.

    Проверим включен ли SELinux:

    getenforce
    

    Результат:

    Enforcing
    

    То есть SELinux включен. Отключаем:

    setenforce 0
    

    И внесем правки в файл настроек, чтобы при рестарте сервера он отключился:

    sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
    

    4. Теперь пришло время установить Prometheus

    Тут нас ждет множество шагов т.к. у Prometheus нет репозитария пакетов и все придется делать руками — это скачать архив с бинарниками, создать пользователя, создать нужные каталоги и unit-файл для systemd и прочее.

    Идем на официальную страницу и копируем ссылку на архив tar.gz для Linux архитектуры amd64.
    На текущий момент доступна версия 2.28 и нам нужен файл prometheus-2.28.0.linux-amd64.tar.gz

    wget https://github.com/prometheus/prometheus/releases/download/v2.28.0/prometheus-2.28.0.linux-amd64.tar.gz
    

    Далее я приведу набор команд для создания пользователя от имени которого будет работать сервис, создание вспомогательных каталогов, распаковка скачанного архива, копированию бинарных файлов в нужные каталоги и прочее. Все эти команды нужно выполнить под пользователем root.

    useradd --no-create-home --shell /bin/bash prometheus
    usermod --home /var/lib/prometheus prometheus
    mkdir /etc/prometheus
    mkdir /var/lib/prometheus
    tar -zxf prometheus-*.linux-amd64.tar.gz
    cd prometheus-*.linux-amd64
    yes | cp prometheus promtool /usr/local/bin/
    cp -r console_libraries consoles prometheus.yml /etc/prometheus
    chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus
    chown prometheus:prometheus /usr/local/bin/{prometheus,promtool}
    echo "PROMETHEUS_OPTS=\"--storage.tsdb.retention.time=7d --storage.tsdb.retention.size=50GB\"" > /etc/default/prometheus
    chown prometheus:prometheus /etc/default/prometheus
    cd ~
    

    Обратите внимание файл /etc/default/prometheus с опциями —storage.tsdb.retention.time и —storage.tsdb.retention.size. Первая опция говорит, что нужно удалять старые данные старше 7 дней, а вторая задает удаление по размеру хранимых данных. Я задал 7 дней или 50 Гигабайт. Вам нужно выставить свои значения. Более подробно об этих настройках можно прочитать в официальной документации.

    Теперь попробуем запустить Prometheus в консоле (интерактивно):

    su - prometheus -c "/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"
    

    В консоле вы должны увидеть запуск Prometheus примерно с таким выводом:

    level=info ts=2021-05-13T18:52:23.621Z caller=main.go:388 msg="No time or size retention was set so using the default time retention" duration=15d
    level=info ts=2021-05-13T18:52:23.621Z caller=main.go:426 msg="Starting Prometheus" version="(version=2.28.0, branch=HEAD, revision=ff58416a0b0224bab1f38f949f7d7c2a0f658940)"
    level=info ts=2021-05-13T18:52:23.621Z caller=main.go:431 build_context="(go=go1.16.5, user=root@32b9079a2740, date=20210621-15:45:36)"
    level=info ts=2021-05-13T18:52:23.621Z caller=main.go:432 host_details="(Linux 4.18.0-240.el8.x86_64 #1 SMP Fri Sep 25 19:48:47 UTC 2020 x86_64 centos8.localdomain (none))"
    level=info ts=2021-05-13T18:52:23.621Z caller=main.go:433 fd_limits="(soft=1024, hard=262144)"
    level=info ts=2021-05-13T18:52:23.621Z caller=main.go:434 vm_limits="(soft=unlimited, hard=unlimited)"
    level=info ts=2021-05-13T18:52:23.622Z caller=web.go:540 component=web msg="Start listening for connections" address=0.0.0.0:9090
    level=info ts=2021-05-13T18:52:23.624Z caller=main.go:803 msg="Starting TSDB ..."
    level=info ts=2021-05-13T18:52:23.628Z caller=head.go:741 component=tsdb msg="Replaying on-disk memory mappable chunks if any"
    level=info ts=2021-05-13T18:52:23.628Z caller=head.go:755 component=tsdb msg="On-disk memory mappable chunks replay completed" duration=2.735µs
    level=info ts=2021-05-13T18:52:23.628Z caller=head.go:761 component=tsdb msg="Replaying WAL, this may take a while"
    level=info ts=2021-05-13T18:52:23.632Z caller=tls_config.go:191 component=web msg="TLS is disabled." http2=false
    level=info ts=2021-05-13T18:52:23.632Z caller=head.go:813 component=tsdb msg="WAL segment loaded" segment=0 maxSegment=0
    level=info ts=2021-05-13T18:52:23.632Z caller=head.go:818 component=tsdb msg="WAL replay completed" checkpoint_replay_duration=26.835µs wal_replay_duration=4.47535ms total_replay_duration=4.526302ms
    level=info ts=2021-05-13T18:52:23.636Z caller=main.go:828 fs_type=XFS_SUPER_MAGIC
    level=info ts=2021-05-13T18:52:23.636Z caller=main.go:831 msg="TSDB started"
    level=info ts=2021-05-13T18:52:23.636Z caller=main.go:957 msg="Loading configuration file" filename=/etc/prometheus/prometheus.yml
    level=info ts=2021-05-13T18:52:23.780Z caller=main.go:988 msg="Completed loading of configuration file" filename=/etc/prometheus/prometheus.yml totalDuration=144.524274ms remote_storage=2.175µs web_handler=342ns query_engine=1.032µs scrape=143.965324ms scrape_sd=78.146µs notify=19.165µs notify_sd=12.808µs rules=1.004µs
    level=info ts=2021-05-13T18:52:23.780Z caller=main.go:775 msg="Server is ready to receive web requests."
    

    Строка «Server is ready to receive web requests.» говорит, что все успешно запустилось и можно открыть Web-браузер по адресу http://IP-адрес-сервера:9090

    Теперь нажимаем Ctrl+C для остановки процесса и настроим автозапуск Prometheus.

    Для начала поменяем shell у пользователя prometheus, ведь теперь он ему не нужен:

    usermod --shell /bin/false prometheus
    

    Теперь создадим unit-фaйл для systemd:

    cat << EOF > /etc/systemd/system/prometheus.service
    [Unit]
    Description=Prometheus Service
    After=network.target
    
    [Service]
    EnvironmentFile=-/etc/default/prometheus
    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 \\
      \$PROMETHEUS_OPTS
    ExecReload=/bin/kill -HUP \$MAINPID
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
    EOF
    

    Перезагрузим конфигурацию systemd и запустим Prometheus:

    systemctl daemon-reload
    systemctl enable --now prometheus
    

    Проверим факт запуска:

    # systemctl status prometheus
    ● prometheus.service - Prometheus Service
       Loaded: loaded (/etc/systemd/system/prometheus.service; enabled; vendor preset: disabled)
       Active: active (running) since Sun 2021-05-16 21:13:18 +05; 4min 10s ago
     Main PID: 7925 (prometheus)
        Tasks: 7 (limit: 4956)
       Memory: 53.1M
       CGroup: /system.slice/prometheus.service
               └─7925 /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 >
    
    # netstat -ltupn | grep prometheus
    tcp6       0      0 :::9090                 :::*                    LISTEN      39210/prometheus
    

    5. Теперь пришло время установить Alertmanager

    И опять нас ждет множество шагов. Я постараюсь писать уже не так подробно, ведь действия будут схожи с установкой Prometheus.

    wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz
    useradd --no-create-home --shell /bin/false alertmanager
    usermod --home /var/lib/alertmanager alertmanager
    mkdir /etc/alertmanager
    mkdir /var/lib/alertmanager
    tar -zxf alertmanager-*.linux-amd64.tar.gz
    cd alertmanager-*.linux-amd64
    yes | cp alertmanager amtool /usr/local/bin/
    cp alertmanager.yml /etc/alertmanager
    chown -R alertmanager:alertmanager /etc/alertmanager /var/lib/alertmanager
    chown alertmanager:alertmanager /usr/local/bin/{alertmanager,amtool}
    cd ~
    cat << EOF > /etc/systemd/system/alertmanager.service
    [Unit]
    Description=Alertmanager Service
    After=network.target
    
    [Service]
    EnvironmentFile=-/etc/default/alertmanager
    User=alertmanager
    Group=alertmanager
    Type=simple
    ExecStart=/usr/local/bin/alertmanager \\
              --config.file=/etc/alertmanager/alertmanager.yml \\
              --storage.path=/var/lib/alertmanager \\
              \$ALERTMANAGER_OPTS
    ExecReload=/bin/kill -HUP \$MAINPID
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
    EOF
    echo "ALERTMANAGER_OPTS=\"\"" > /etc/default/alertmanager
    chown alertmanager:alertmanager /etc/default/alertmanager
    systemctl daemon-reload
    systemctl enable --now alertmanager
    

    После этих действий у нас должен запуститься Alertmanager в виде службы, проверим:

    # systemctl status alertmanager
    ● alertmanager.service - Alertmanager Service
       Loaded: loaded (/etc/systemd/system/alertmanager.service; enabled; vendor preset: disabled)
       Active: active (running) since Fri 2021-05-14 00:29:24 +05; 8s ago
     Main PID: 39473 (alertmanager)
        Tasks: 6 (limit: 4930)
       Memory: 10.6M
       CGroup: /system.slice/alertmanager.service
               └─39473 /usr/local/bin/alertmanager --config.file=/etc/alertmanager/alertmanager.yml --storage.path=/var/lib/prometheus/alertmanager
    
    # netstat -ltupn | grep alertmanager
    tcp6       0      0 :::9093                 :::*                    LISTEN      39473/alertmanager
    tcp6       0      0 :::9094                 :::*                    LISTEN      39473/alertmanager
    udp6       0      0 :::9094                 :::*                                39473/alertmanager
    

    Открываем Web-браузер по адресу http://IP-адрес-сервера:9093 и перед нами должна появиться консоль Alertmanager

    6. Далее нам нужно установить node_exporter

    node_exporter — это уже сборщик метрик с операционной системы, его можно установить на все сервера в компании и настроить Prometheus на сбор данных с этого экспортера.

    Если Вы будите устанавливать node_exporter на другие сервера, то необходимо открыть порт 9100/tcp, чтобы Prometheus смог подключиться к node_exporter.

    Я так же постараюсь быть кратким и приведу лишь набор необходимых для установки команд и немного комментариев.

    wget https://github.com/prometheus/node_exporter/releases/download/v1.1.2/node_exporter-1.1.2.linux-amd64.tar.gz
    useradd --no-create-home --shell /bin/false nodeusr
    tar -zxf node_exporter-*.linux-amd64.tar.gz
    cd node_exporter-*.linux-amd64
    cp node_exporter /usr/local/bin/
    chown nodeusr:nodeusr /usr/local/bin/node_exporter
    cd ~
    cat << EOF > /etc/systemd/system/node_exporter.service
    [Unit]
    Description=Node Exporter Service
    After=network.target
    
    [Service]
    EnvironmentFile=-/etc/default/node_exporter
    User=nodeusr
    Group=nodeusr
    Type=simple
    ExecStart=/usr/local/bin/node_exporter \$NODE_EXPORTER_OPTS
    ExecReload=/bin/kill -HUP \$MAINPID
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
    EOF
    echo "NODE_EXPORTER_OPTS=\"\"" > /etc/default/node_exporter
    chown nodeusr:nodeusr /etc/default/node_exporter
    systemctl daemon-reload
    systemctl enable --now node_exporter
    

    После этих действий у нас должен запуститься node_exporter в виде службы, проверим:

    # systemctl status node_exporter
    ● node_exporter.service - Node Exporter Service
       Loaded: loaded (/etc/systemd/system/node_exporter.service; enabled; vendor preset: disabled)
       Active: active (running) since Sun 2021-05-16 21:22:06 +05; 706ms ago
     Main PID: 8055 (node_exporter)
        Tasks: 3 (limit: 4956)
       Memory: 8.6M
       CGroup: /system.slice/node_exporter.service
               └─8055 /usr/local/bin/node_exporter
    
    # netstat -ltupn | grep node_exporter
    tcp6       0      0 :::9100                 :::*                    LISTEN      39693/node_exporter
    

    Открываем Web-браузер по адресу http://IP-адрес-сервера:9100/metrics и перед нами должны появиться метрики, собранные node_exporter

    6. Теперь настроим сбор метрик с node_exporter в Prometheus

    Открываем файл конфигураций Prometheus — /etc/prometheus/prometheus.yml и в разделе scrape_configs добавляем job_name: ‘node_exporter_clients’ с нашими серверами:

    ...
    scrape_configs:
      - job_name: 'prometheus'
        static_configs:
        - targets: ['192.168.10.10:9090']
      - job_name: 'node_exporter_clients'
        scrape_interval: 60s
        static_configs:
        - targets: ['192.168.10.11:9100','192.168.10.12:9100','192.168.10.13:9100']
    

    Это кусочек моего конфига с моими IP адресами, у Вас же они будут свои.

    Скажу лишь, что job_name: ‘prometheus’ с адресом 192.168.10.10:9090 — это сам сервер с Prometheus

    Ниже идет job_name: ‘node_exporter_clients’ у которого в targets перечислен список серверов с установленным node_exporter.

    Для применения настроек нужно перезапустить Prometheus:

    systemctl restart prometheus
    

    После этого в Web-интерфейсе Prometheus в разделе Status -> Targets мы сможем увидеть наши сервера:

    Prometheus - Сервера

    Prometheus — Сервера

    7. Теперь настроим в Prometheus алармы

    Создадим простой файл с правилом:

    cat << EOF > /etc/prometheus/alert_rules.yml
    groups:
    - name: alert.rules
      rules:
      - alert: InstanceDown
        expr: up == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          description: '{{ \$labels.instance }} of job {{ \$labels.job }} has been down for more than 1 minute.'
          summary: Instance {{ \$labels.instance }} down
    EOF
    

    Проверим наше правило на корректность с помощью promtool:

    /usr/local/bin/promtool check rules /etc/prometheus/alert_rules.yml
    

    Результат:

    Checking /etc/prometheus/alert_rules.yml
      SUCCESS: 1 rules found
    

    Все корректно, двигаемся дальше.

    Далее подключим правило в конфигурацию Prometheus, в файле /etc/prometheus/prometheus.yml в секции rule_files: добавьте

    ...
    rule_files:
      # - "first_rules.yml"
      # - "second_rules.yml"
      - "alert_rules.yml"
    ...
    

    Перезапустим Prometheus:

    systemctl restart prometheus
    

    Наше правило появилось в разделе Status -> Rules

    Prometheus rules

    Prometheus rules

    Так же мы можем увидеть его на странице Alerts

    Prometheus alerts

    Prometheus alerts

    Теперь остановим на одном сервере node_exporter и посмотрим состояние аларма:

    Prometheus - Down alarm

    Prometheus — Down alarm

    Prometheus - Down alarm 2

    Prometheus — Down alarm 2

    8. И последнее, что мы настроим — это отправку аларма на почту (email)

    Для этого нам потребуется немного настроить Alertmanager.

    Откроем файл /etc/alertmanager/alertmanager.yml и добавим несколько настроек.

    В секцию global добавим настройку smtp_from (если данной секции нет, то создайте ее):

    global:
      smtp_from: [email protected]
    ...
    

    Таким образом мы будем отправлять сообщения от имени [email protected] (у Вас будет другой email).

    Далее секцию route приведем к виду:

    ...
    route:
      group_by: ['alertname', 'instance', 'severity']
      group_wait: 10s
      group_interval: 10s
      repeat_interval: 1h
      receiver: 'web.hook'
      routes:
        - receiver: send_email
          match:
            alertname: InstanceDown
    ...
    

    Мы добавили маршрут, который принимает событие InstanceDown и запускает ресивер send_email

    Напомню, что имя события InstanceDown было описано выше в файле /etc/prometheus/alert_rules.yml

    Далее добавим в конфиг еще один ресивер (send_email) с описанием почтового сервера через который будем отправлять алармы (я буду отправлять через почту для домена на yandex.ru):

    receivers:
    ...
    - name: send_email
      email_configs:
      - to: [email protected]
        send_resolved: true
        smarthost: smtp.yandex.ru:587
        auth_username: [email protected]
        auth_password: XXXXXXXXX
        require_tls: true
    

    Мы будем отправлять алармы на ящик [email protected]

    Перезапустим Alertmanager:

    systemctl restart alertmanager
    

    Теперь нам нужно настроить связку Prometheus с Alertmanager, для этого открываем конфигурационный файл Prometheus — /etc/prometheus/prometheus.yml

    Приведем секцию alerting к виду:

    alerting:
      alertmanagers:
      - static_configs:
        - targets:
          - 127.0.0.1:9093
    

    Перезапустим Prometheus:

    systemctl restart prometheus
    

    Через некоторое время в Alertmanager появится наш алерт:

    Alertmanager (alert)

    Alertmanager (alert)

    И мы получим на почту сообщение примерно как на скрине ниже:

    Alertmanager (email)

    Alertmanager (email)

    На этом все, в следующей статье про Prometheus и Alertmanager мы научимся осуществлять мониторинг нагрузки на CPU, использование RAM и диска, а так же попробуем настроить мониторинг Linux-служб на примере nginx.

    Если у Вас возникли вопросы или Вы хотите, чтобы я помог Вам, то Вы всегда можете связаться со мной разными доступными способами.


    Подписаться
    Уведомить о
    guest

    Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

    1 Комментарий
    Межтекстовые Отзывы
    Посмотреть все комментарии
    Username
    Username
    6 часов назад

    Cпасибо, очень помогла Ваша статья!

    1
    0
    Оставьте комментарий! Напишите, что думаете по поводу статьи.x