====== Diagrama ======
{{ :proyectos:prometheus-node-local1.png?400 |}}
* IP prometheus: 192.168.1.10
* IP Cliente node_export: 192.168.1.101
====== Instalación de dependencias ======
Instalar los siguientes paquetes en los nodos
apt install curl sudo net-tools
====== Instalación Prometheus ======
En el servidor de prometheus creamos el usuario
useradd --no-create-home --shell /bin/false prometheus
Creamos las carpetas de prometheus y definimos dueño y grupo
mkdir /etc/prometheus
mkdir /var/lib/prometheus
DOWNLOAD_URL=$(curl -s https://api.github.com/repos/prometheus/prometheus/releases/latest \
| grep browser_download_url \
| grep linux-amd64 \
| cut -d '"' -f 4)
curl -s -L --create-dirs -o /tmp/prometheus.tar.gz "$DOWNLOAD_URL"
tar --strip-components=1 -C /etc/prometheus -zxvf /tmp/prometheus.tar.gz
chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus
ln -s /etc/prometheus/prometheus /usr/local/bin/prometheus
ln -s /etc/prometheus/promtool /usr/local/bin/promtool
Verificamos la configuración por defecto de prometheus y lo ejecutamos
cat /etc/prometheus/prometheus.yml
sudo -u prometheus /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
Ahora pueden ver prometheus desde http://192.168.1.10:9090/
Para salir del programa, presionar en la terminal CTRL+C para cancelar el comando.
Creamos el servicio systemd
nano /etc/systemd/system/prometheus.service
Le agregamos siguiente contenido
[Unit]
Description=Prometheus Service
After=network.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 \
--web.listen-address="127.0.0.1:9090"
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
De esta manera prometheus quedara expuesta a la red a travez del reverse proxy de nginx
Reiniciamos el systemd e iniciamos el servicio.
systemctl daemon-reload
systemctl start prometheus
systemctl status prometheus
systemctl enable prometheus
Ahora pueden ver prometheus desde http://127.0.0.1:9090/
====== Nginx ======
Ahora creamos el reverse proxy en nginx
apt install nginx
Agregando configuración de Nginx
Creando usuario y clave
htpasswd -c /etc/prometheus/.htpasswd promadmin
location / {
auth_basic "Prometheus";
auth_basic_user_file "/etc/prometheus/.htpasswd";
proxy_pass http://127.0.0.1:9090;
}
nginx -t
systemctl reload nginx
Ahora pueden ver prometheus desde http://192.168.1.10/ y veran algo como.
{{ :proyectos:prometheus-local1.png?400 | Pantalla inicial prometheus web}}
====== Instalación node_exporter ======
Creamos en el cliente el usuario de node_exporter
useradd -rs /bin/false node_exporter
mkdir /opt/node_exporter
DOWNLOAD_URL=$(curl -s https://api.github.com/repos/prometheus/node_exporter/releases/latest \
| grep browser_download_url \
| grep linux-amd64 \
| cut -d '"' -f 4)
curl -s -L --create-dirs -o /tmp/node_exporter.tar.gz "$DOWNLOAD_URL"
tar --strip-components=1 -C /opt/node_exporter -zxvf /tmp/node_exporter.tar.gz
chown -R node_exporter:node_exporter /opt/node_exporter
ln -s /opt/node_exporter/node_exporter /usr/local/bin/
nano /etc/systemd/system/node_exporter.service
Creamos el servicio de systemd
[Unit]
Description=Node Exporter Service
After=network.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start node_exporter
systemctl status node_exporter
systemctl enable node_exporter
Ahora probaremos en la terminal que podemos obtener las metricas del node_exporter con curl
curl http://127.0.0.1:9100/metrics
====== Conectando Prometheus con node_exporter ======
Agregar a la configuracion del prometheus el nodo /etc/prometheus/prometheus.yml
scrape_configs:
.
.
.
- job_name: 'node_exporter_metrics'
scrape_interval: 5s
static_configs:
- targets: [':9100']
.
.
.
systemctl restart prometheus
systemctl status prometheus
Abrir el prometheus para ver el nodo y las graficas en http://192.168.1.10/
{{ :proyectos:prometheus-node1.png?400 |}}
====== node_exporter con NAT ======
Cuando el servidor no tiene comunicación directa con el agente node_exporter, pero el node_exporter puede alcanzar el servidor prometheus, es necesario hacer un proxy.
Se puede hacer con:
- [[https://github.com/prometheus-community/PushProx/issues/119|PushProxy]]
- SSH proxy
Para SSH proxy, se realiza:
Servidor Prometheus
adduser remoto
Cambiar a la configuración del prometheus el nodo /etc/prometheus/prometheus.yml
...
- targets: [':10100']
...
Agente Node_Exporter
su -
ssh-keygen -t rsa -b 4096
ssh-copy-id ssh remoto@logs.prueba.com
ssh -R 1100:localhost:10100 remoto@logs.prueba.com
''cat /etc/systemd/system/remote-tunnel@.service''
[Unit]
Description=Setup a remote tunnel to %I
After=network.target
[Service]
EnvironmentFile=/etc/default/remote-tunnel@%i
ExecStart=/usr/bin/ssh -i ${PATH_TO_KEY} -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -nNT -R ${REMOTE_PORT}:${LOCAL_ADDR}:${LOCAL_PORT} ${REMOTE_USER}@${REMOTE_HOST}
RestartSec=15
Restart=always
KillMode=mixed
[Install]
WantedBy=multi-user.target
''cat /etc/default/remote-tunnel@logs.prueba.com''
PATH_TO_KEY=/root/.ssh/id_rsa
LOCAL_ADDR=localhost
LOCAL_PORT=10100
REMOTE_PORT=10100
REMOTE_USER=remoto
REMOTE_HOST=logs.prueba.com
Habilitar y reiniciar el servicio
systemctl enable --now remote-tunnel@logs.prueba.com
systemctl status remote-tunnel@logs.prueba.com
Desde el servidor prometheus, verificar que funcionan las metricas curl http://127.0.0.1:10100/metrics
Si funciona solo es de reiniciar el prometheus
====== Consideraciones ======
- No se ha tomado en cuenta la seguridad de nginx ni de los node_exporter
- No se ha considerado poner el prometheus en un subdirectorio para tenerlo con otros servicios
====== Referencias ======
* https://betterstack.com/community/guides/monitoring/monitor-linux-prometheus-node-exporter/
* https://grafana.com/blog/2022/05/10/how-to-collect-prometheus-metrics-with-the-opentelemetry-collector-and-grafana/
* https://gist.github.com/drmalex07/c0f9304deea566842490
* https://unix.stackexchange.com/questions/56765/creating-a-user-without-a-password
* https://prometheus.io/docs/practices/pushing/