====== 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/