У нас в компании есть сотрудник, который курирует разработчиков и наши Web
-сервисы и вот мы с ним задались целью, как можно сделать отказоустойчивость порталов компании, которые в интернете. Площадка взаимодействия с поставщиками и клиентами, калькулятор/визуализатор продукции, информационный. Я предложил сперва уточнить у специалистов подрядчика, что они скажут, т.к. мое мнение, что мы должны сами все поддерживать и разрабатывать, и не зависеть ни от кого. Уметь развернуть из бекапа и знать все вносимые изменения, но у этого сотрудника, с которым я работаю видение другое, должны быть подрядчики дабы разгрузить отдел IT – я же сказал, как должно быть. Ну так вот прислали они следующие шаги:
1. Пустить все запросы к сайту через сторонний сервис, который обеспечит защиту от ddos-атака (Claudflare);
2.Запретить доступ к сайту по IP (выдавать в этом случае статичную страницу nginx’а);
3.Установить систему мониторинга Prometeus (понятно, что соответствующий сервис должен быть установлен на другом сервере);
4.Name-записи хранить не у хостера, а у регистратора доменов (nic.ru/reg.ru) – это позволит снизить зависимость от ddos-атак на name-сервера.
У нас пункт 4
выполнен: DNS
-записи у nic.ru, SLAVE
-запись в DATALINE
. (заметка для ознакомления на практике "Порядок настройки DNS-SLAVE для организации"
)
Исходя из пунктов выше, я решил посмотреть, что есть система мониторинга (использовать буду на Ubuntu 22.04 LTS Server
) Prometheus
лучше или хуже если сравнивать с системой мониторинга на базе Zabbix
Prometheus
— это бесплатное программное приложение, используемое для мониторинга событий и оповещения. Он записывает метрики в реальном времени в базу данных временных рядов, построенную с использованием модели HTTP
-запроса, с гибкими запросами и оповещениями в режиме реального времени.
Шаг №1:
Обновляем систему до самого актуального состояния в рамках текущего релиза установленной операционной системы:
ekzorchik@srv-us2204a:~$ sudo rm -rf /var/lib/apt/lists ekzorchik@srv-us2204a:~$ sudo apt-get update && sudo apt-get upgrade -y
Шаг №2:
Устанавливаю систему предварительные утилиты:
ekzorchik@srv-us2204a:~$ sudo apt-get -y install wget curl nano
Шаг №3:
Создаю специального пользователя и группу под сервис Prometheus:
ekzorchik@srv-us2204a:~$ sudo groupadd --system prometheus ekzorchik@srv-us2204a:~$ sudo useradd -s /sbin/nologin --system -g prometheus prometheus
Шаг №4:
Создаю под сервис рабочие директории:
ekzorchik@srv-us2204a:~$ sudo mkdir /var/lib/prometheus ekzorchik@srv-us2204a:~$ for i in rules rules.d files_sd; do sudo mkdir -p /etc/prometheus/${i}; done
Шаг №5:
Загружаю/Распаковываю и устанавливаю в систему из интернета (https://github.com/prometheus/prometheus/releases
) самую последнюю версию Prometheus:
ekzorchik@srv-us2204a:~$ mkdir -p /tmp/prometheus && cd /tmp/prometheus ekzorchik@srv-us2204a:/tmp/prometheus$ ekzorchik@srv-us2204a:/tmp/prometheus$ curl -s https://api.github.com/repos/prometheus/prometheus/releases/latest | grep browser_download_url | grep linux-amd64 | cut -d '"' -f 4 | wget -qi - ekzorchik@srv-us2204a:/tmp/prometheus$ ls prometheus-2.36.0.linux-amd64.tar.gz ekzorchik@srv-us2204a:/tmp/prometheus$ tar zxf prometheus-*.tar.gz ekzorchik@srv-us2204a:/tmp/prometheus$ cd prometheus-*/ ekzorchik@srv-us2204a:/tmp/prometheus/prometheus-2.36.0.linux-amd64$ ekzorchik@srv-us2204a:/tmp/prometheus/prometheus-2.36.0.linux-amd64$ sudo mv prometheus promtool /usr/local/bin/ ekzorchik@srv-us2204a:/tmp/prometheus/prometheus-2.36.0.linux-amd64$ cd ~ ekzorchik@srv-us2204a:~$ prometheus --version prometheus, version 2.36.0 (branch: HEAD, revision: d48f381d9a4e68c83283ce5233844807dfdc5ba5) build user: root@b3126bd1c115 build date: 20220530-13:56:56 go version: go1.18.2 platform: linux/amd64 ekzorchik@srv-us2204a:~$ ekzorchik@srv-us2204a:~$ promtool --version promtool, version 2.36.0 (branch: HEAD, revision: d48f381d9a4e68c83283ce5233844807dfdc5ba5) build user: root@b3126bd1c115 build date: 20220530-13:56:56 go version: go1.18.2 platform: linux/amd64 ekzorchik@srv-us2204a:~$ ekzorchik@srv-us2204a:~$ cd /tmp/prometheus/prometheus-2.36.0.linux-amd64/ ekzorchik@srv-us2204a:/tmp/prometheus/prometheus-2.36.0.linux-amd64$ sudo mv consoles/ console_libraries/ /etc/prometheus/ ekzorchik@srv-us2204a:/tmp/prometheus/prometheus-2.36.0.linux-amd64$ sudo mv prometheus.yml /etc/prometheus/prometheus.yml ekzorchik@srv-us2204a:/tmp/prometheus/prometheus-2.36.0.linux-amd64$ cd $HOME ekzorchik@srv-us2204a:~$
Шаг №6:
Произвожу настройку Prometheus:
ekzorchik@srv-us2204a:~$ sudo cp /etc/prometheus/prometheus.yml /etc/prometheus/prometheus.yml.backup ekzorchik@srv-us2204a:~$ sudo nano /etc/prometheus/prometheus.yml
я пока в файле Prometheus.yml
ничего менять не буду
Шаг №7:
Создаю файл сервиса, который будет запускать Prometheus
вместе с системой:
ekzorchik@srv-us2204a:~$ sudo nano /etc/systemd/system/prometheus.service [Unit] Description=Prometheus Documentation=https://prometheus.io/docs/introduction/overview/ Wants=network-online.target After=network-online.target [Service] Type=simple User=prometheus Group=prometheus ExecReload=/bin/kill -HUP $MAINPID 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 \ --web.listen-address=0.0.0.0:9090 \ --web.external-url= SyslogIdentifier=prometheus Restart=always [Install] WantedBy=multi-user.target
Шаг №8:
Изменяю права и владельца у файлов Prometheus:
ekzorchik@srv-us2204a:~$ for i in rules rules.d files_sd; do sudo chown -R prometheus:prometheus /etc/prometheus/${i}; done ekzorchik@srv-us2204a:~$ for i in rules rules.d files_sd; do sudo chmod -R 775 /etc/prometheus/${i}; done ekzorchik@srv-us2204a:~$ sudo chown -R prometheus:prometheus /var/lib/prometheus/
Шаг №9:
Активирую файл сервиса Prometheus:
ekzorchik@srv-us2204a:~$ sudo systemctl daemon-reload ekzorchik@srv-us2204a:~$ sudo systemctl start prometheus.service ekzorchik@srv-us2204a:~$ sudo systemctl enable prometheus.service Created symlink /etc/systemd/system/multi-user.target.wants/prometheus.service → /etc/systemd/system/prometheus.service. ekzorchik@srv-us2204a:~$ sudo systemctl status prometheus.service ● prometheus.service - Prometheus Loaded: loaded (/etc/systemd/system/prometheus.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2022-06-07 08:27:38 MSK; 2s ago Docs: https://prometheus.io/docs/introduction/overview/ Main PID: 1762 (prometheus) Tasks: 7 (limit: 2241) Memory: 16.6M CPU: 81ms CGroup: /system.slice/prometheus.service └─1762 /usr/local/bin/prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path=/var/lib/prometheus --web.console.templa> Jun 07 08:27:38 srv-us2204a prometheus[1762]: ts=2022-06-07T05:27:38.273Z caller=head.go:542 level=info component=tsdb msg="Replaying WAL, this may tak> Jun 07 08:27:38 srv-us2204a prometheus[1762]: ts=2022-06-07T05:27:38.417Z caller=head.go:613 level=info component=tsdb msg="WAL segment loaded" segment> Jun 07 08:27:38 srv-us2204a prometheus[1762]: ts=2022-06-07T05:27:38.417Z caller=head.go:613 level=info component=tsdb msg="WAL segment loaded" segment> Jun 07 08:27:38 srv-us2204a prometheus[1762]: ts=2022-06-07T05:27:38.417Z caller=head.go:619 level=info component=tsdb msg="WAL replay completed" check> Jun 07 08:27:38 srv-us2204a prometheus[1762]: ts=2022-06-07T05:27:38.418Z caller=main.go:993 level=info fs_type=EXT4_SUPER_MAGIC Jun 07 08:27:38 srv-us2204a prometheus[1762]: ts=2022-06-07T05:27:38.418Z caller=main.go:996 level=info msg="TSDB started" Jun 07 08:27:38 srv-us2204a prometheus[1762]: ts=2022-06-07T05:27:38.418Z caller=main.go:1177 level=info msg="Loading configuration file" filename=/etc> Jun 07 08:27:38 srv-us2204a prometheus[1762]: ts=2022-06-07T05:27:38.419Z caller=main.go:1214 level=info msg="Completed loading of configuration file" > Jun 07 08:27:38 srv-us2204a prometheus[1762]: ts=2022-06-07T05:27:38.419Z caller=main.go:957 level=info msg="Server is ready to receive web requests." Jun 07 08:27:38 srv-us2204a prometheus[1762]: ts=2022-06-07T05:27:38.419Z caller=manager.go:937 level=info component="rule manager" msg="Starting rule > ekzorchik@srv-us2204a:~$
Шаг №10:
Проверяю, что в системе появился порт соединения для сервиса Prometheus:
ekzorchik@srv-us2204a:~$ sudo ss -ltp | egrep prometheus LISTEN 0 4096 *:9090 *:* users:(("prometheus",pid=1762,fd=8)) ekzorchik@srv-us2204a:~$
Это порт 9090
Допустим Вы разворачиваете ваш сервис Prometheus
в интернете, то не лишним будет задействовать надстройку (ufw
или firewalld
) над правилами iptables
и разрешить взаимодействие с хостом на этот порт:
sudo firewall-cmd --add-port=9090/tcp --permanent sudo ufw allow to any port 9090/tcp
Шаг №11:
С рабочей системы через браузер делаю обращение на адрес (http://IP&DNS:9090 => http://172.35.35.33:9090
) системы где развернул сервис Prometheus дабы посмотреть что есть этот развернутый сервис:
Вроде ничего примечательного нет.
Разбирая и оформляя для себя пошаговые заметки, я буду практически осваивать новый сервис и уже на основе их приму решение, а стоит ли использование данного сервиса в моих задачах.
А пока на этом, я прощаюсь, с уважением автор блога Олло Александр aka ekzorchik.