Установка и первоначальная настройка 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.

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


    Оставить комментарий

    avatar
    1000

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

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