Привет всем =)
Решил написать несколько заметок на тему реализации построения мониторинга на Promstack компонентах. И начать настройку хотелось бы с не логичной стороны, это настройки экспортеров. Так как текущая обстановка на работе благоволит начать действовать.
Думаю вы уже знакомы с экспортерами. Это такое приложение, которое собирает различные метрики с компонентов и других приложений нашей системы. Говоря же про node_exporter, этот экспортер вытягивает метрики с оборудования и операционки, предоставляемые ядром системы.
Скачать и запустить экспортер дело 5 минут, у вас поднимится порт 9100 готовый принимать http-запросы. Но реальность такова, что чаще всего приходиться извращаться и ставить дополнительный софт что бы как то закрыть доступ к метрикам.
Но время шло, и наконец-то начиная с версии 1.0 в node_exporter добавили поддержку TLS и Basic Auth, необходимость установки дополнительно по отпадает. Но в рамках этой главы я покажу оба метода, с прокси и без использования прокси.
Установка node_exporter (Нативно)
Для начала качаем последний релиз экспортера:
root@node01:~# cd /tmp
root@node01:~# wget https://github.com/prometheus/node_exporter/releases/download/v1.5.0/node_exporter-1.5.0.linux-amd64.tar.gz
Далее в /tmp
распаковываем архив:
root@node01:/tmp# tar -zxvf node_exporter-1.5.0.linux-amd64.tar.gz -C ./
В архиве будет содержаться бинарь, поэтому его перемешаем в область ко всем запускаемым программам:
root@node01:/tmp# mv node_exporter-1.5.0.linux-amd64/node_exporter /usr/local/bin/
Теперь проработаем вопрос безопасности нашего экспортера. Для TLS-инкрипции будем юзать пока что самоподписные сертификаты. Но если есть доступ к интнернет, или это у вас какой нибудь веб-сервак, то можно прикрутить сертификат от LE. В будущем есть идеи, как упразднить менеджмент сертификатов через freeipa и certmonger.
Создаем самоподписной сертификат:
root@node01:~# mkdir -p /etc/node_exporter/ssl
root@node01:~# cd /etc/node_exporter/ssl/
root@node01:~# openssl req -new -newkey rsa:2048 -days 365 -nodes -x509 -keyout node_exporter.key -out node_exporter.crt -subj "/C=RU/ST=MOSCOW/L=MOSCOW/O=PROM/CN=localhost" -addext "subjectAltName = DNS:localhost"
В дальнейшем сертификат скопируем на сервер с прометеем.
Как я говорил ранее, начиная с версии 1.0, в поддержку node экспортер была включена поддержка basic_auth для доступа к метрикам через пароль. Поэтому используя утилиту htpasswd
, или что-то другое генерим пароль.
root@node01:/etc/node_exporter/ssl# htpasswd -nBC 10 "" | tr -d ':\n'; echo
Результат этой команды выкенет захешированный пароль, этот пароль далее вставляем в конфигурацию экспортера.
Создаем конфигурационный файл, и описываем в нем настройки безопасности.
---
root@node01:~# vim /etc/node_exporter/config.yml
---
tls_server_config:
cert_file: /etc/node_exporter/ssl/node_exporter.crt
key_file: /etc/node_exporter/ssl/node_exporter.key
basic_auth_users:
prometheus: "PASSWORDHASH"
На сервере создаем пользователя, из под которого будем запускать exporter.
root@node01:~# useradd -c "Exporter system user" -U --system -s /bin/false node_exporter
Ну и для запуска экспортера как сервис, напишем systemd-unit:
root@node01:~# vim /etc/systemd/system/node-exporter.service
---
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=node_exporter
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/bin/node_exporter --web.config.file=/etc/node_exporter/config.yml
[Install]
WantedBy=multi-user.target
Перечитываем конфигурацию systemd:
root@node01:~# systemctl daemon-reload
Перед запуском сервиса нужно изменить владельца/группу на бинаре экспортера и файлах конфигурации:
root@node01:~# chown -R node_exporter:node_exporter /etc/node_exporter/
root@node01:~# chown -R node_exporter:node_exporter /usr/local/bin/node_exporter
Ну и запускаем сервис:
root@node01:~# systemctl enable --now node-exporter
Не забываем открыть порт на фаерволе.
Можем кинуть с локалхоста запрос к экспортеру, что бы проверить как отдаются метрики:
root@node01:~# curl --user prometheus --insecure https://localhost:9100/metrics
Добавление хоста в prometheus
На сервер с прометеусом копируем сертификат. Далее правим конфиг prometheus.yml, добавляем новый джоб:
[root@prometheus01 ~]# vim /etc/prometheus/prometheus.yml
---
- job_name: "node_exporter"
scheme: https
basic_auth:
username: prometheus
password: "Mypassword"
tls_config:
ca_file: /etc/prometheus/exporter_ssl/node_exporter.crt
insecure_skip_verify: true
static_configs:
- targets: ['node-exporter.local:9100']
labels:
instance: node-services
Создаем каталог под хранение сертификатов, и кладем туда серт:
[root@prometheus01 ~]# mkdir /etc/prometheus/exporter_ssl/
[root@prometheus01 ~]# mv /home/tony/node_exporter.crt /etc/prometheus/exporter_ssl/
[root@prometheus01 ~]# chown -R prometheus:prometheus /etc/prometheus/exporter_ssl/
Ну и перезапускаем prometheus:
[root@prometheus01 ~]# systemctl restart prometheus
Для подключения других серверов, аналогично настраиваем экспортера. Сертификат и пароль будет использоватся такой же, просто серт копируем на новую тачку. Ну и в секцию джобы с node_exporter добавляем новый таргет.
Настройка node_exporter + nginx
В процессе можете столкнуться с такой ситуацией, когда на целевом сервере нужно поставить несколько экспортеров, например node_exporter, nginx_exporter и экспортер для mysql.
И под каждый тип будет открываться сетевой сокет, ну и в добавок не все экспортеры могут работать с Basic Auth. Решение проблемы, это спрятать наших экспортеров за прокси Nginx, и через nginx размутить TLS-терминацию и авторизацию.
Пропустим этап скачивания и настройки экспортера, условно говоря мы это уже выполнили и в качестве входных данных имеем запущенный node_exporter на localhost:9100
и установленный nginx.
Напишем новый конфиг для nginx,
server {
listen 443 ssl;
server_name node-exporter.local;
access_log off;
error_log off;
allow 10.8.10.14/32;
allow 10.8.10.15/32;
deny all;
ssl_certificate /etc/ssl/node_exporter/node_exporter.crt;
ssl_certificate_key /etc/ssl/node_exporter/node_exporter.key;
auth_basic "Exporters area";
auth_basic_user_file /etc/nginx/.htpasswd;
location /node-exporter {
proxy_pass http://localhost:9100/metrics;
}
}
В этом конфиге я разрешаю доступ только с серверов прометея, остальным доступ будет закрыт.
allow 10.8.10.14/32;
allow 10.8.10.15/32;
deny all;
Далее идут директивы с указанием сертификатов и ключа сертификата.
ssl_certificate /etc/ssl/node_exporter/node_exporter.crt;
ssl_certificate_key /etc/ssl/node_exporter/node_exporter.key;
Опции auth_basic
включают вход по паролю.
auth_basic "Exporters area";
auth_basic_user_file /etc/nginx/.htpasswd;
А в контексте location
говориться, все запросы поступающие на uri /node-exporter
проксировать на сетевой сокет экспортера.
location /node-exporter {
proxy_pass http://localhost:9100/metrics;
}
Теперь в конфигурацию этого сервера мы можем добавлять и другие локейшены для других экспортеров.
Сгенерим файл .htpasswd
c паролем доступа к метрикам:
root@node01:~# htpasswd -c /etc/nginx/.htpasswd prometheus
Ну и перезапускаем nginx:
root@node01:~# systemctl restart nginx
Теперь с сервера можем проверить, отдаются ли метрики:
root@prometheus01:~# curl -v --insecure --user prometheus https://node-exporter.local/node-exporter
Добавление хоста в prometheus
Идем в настройки конфигурации прометея, и добавляем новую джобу.
- job_name: node-exporter-tls
scheme: https
basic_auth:
username: prometheus
password: "Mypassword"
tls_config:
ca_file: /etc/prometheus/exporter_ssl/node_exporter.crt
insecure_skip_verify: true
metrics_path: /node-exporter
static_configs:
- targets:
- node-exporter.local:443
Из отличий с прошлым примером, тут добавился путь к метрикам metrics_path
.
Также не забываем закинуть сертификат в /etc/prometheus/exporter_ssl/
и перезапускаем прометей.
После идем в графанку посмотреть что там начало сыпаться.