Monitorización de Servidores usando Prometheus
Actualmente cuento con 3 servidores a mi disposición y uso Ansible para automatizar su mantenimiento y cambios. Tras realizar estos cambios es posible que alguno de ellos consuma una mayor cantidad de memoria, uso de CPU o cantidad de disco duro. Para casos sencillos la utilidad BTOP es más que suficiente, ya que da un pequeño resumen de la utilización de recursos y los procesos que están ocupando dichos recursos en el servidor, pero para casos donde se requiere un análisis de los recursos más prolongado o incluso alarmas para detectar fallos/acercamientos a los requerimientos máximos del sistema no es suficiente solo con la monitorización inmediata del sistema, sino que se requiere de una monitorización constante. En este post mostraré mi sistema actual de monitorización usando Grafana junto a Prometheus para la monitorización de mis servidores.
Node Exporter
Node Exporter es un servicio que expone una API con una instantánea de las métricas del servidor. Para correr este servicio se podrá usar el siguiente docker compose:
1---
2services:
3 node_exporter:
4 image: quay.io/prometheus/node-exporter:latest
5 container_name: node_exporter
6 command:
7 - "--path.rootfs=/host"
8 - "--web.config.file=/etc/prometheus/web.yml"
9 ports:
10 - 9100:9100
11 pid: host
12 restart: unless-stopped
13 volumes:
14 - '/:/host:ro,rslave'
15 - ./NodeExporter/web.yml:/etc/prometheus/web.ymlPara que este servicio no esté expuesto de forma libre se podrá generar un archivo de establezca un usuario y contraseña, en mi caso el archivo web.yml será:
1basic_auth_users:
2 {{ nodeexporter_user }}: {{ nodeexporter_pass }}Finalmente este servicio podrá estar detrás de un reverse proxy, aquí se muestra un ejemplo de configuración usando NGINX:
server {
server_name subdominio.dominio.com;
location / {
proxy_pass http://localhost:9100;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Prometheus
Prometheus es un programa que toma los datos de los APIs de métricas que se le configuren, teniendo estas métricas un tiempo de vida 14 días por defecto. Para mi configuración solo uso una de base de datos de Prometheus, que hace requests a las otros servidores y a sí mismo. Para correr una base de datos de Prometheus se podrá usar el siguiente docker compose:
1---
2services:
3 prometheus:
4 image: prom/prometheus:latest
5 user: "1000:1000"
6 volumes:
7 - ./Prometheus/prometheus-data:/prometheus
8 - ./Prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
9 ports:
10 - "9090:9090"
11 network_mode: host
12 restart: unless-stoppedSeguidamente se configurará el archivo de configuración prometheus.yml de la siguiente forma:
1global:
2scrape_interval: 5m
3
4scrape_configs:
5- job_name: "Server1"
6 static_configs:
7 - targets: ["sub1.url1.com"]
8 basic_auth:
9 username: "Username1"
10 password: "Password1"
11- job_name: "Server2"
12 static_configs:
13 - targets: ["sub2.url1.com"]
14 basic_auth:
15 username: "Username2"
16 password: "Password2"
17- job_name: "HomeServer"
18 static_configs:
19 - targets: ["localhost:9100"]
20 basic_auth:
21 username: "Username3"
22 password: "Password3"Así ya tendremos una base de datos que tomará los datos de los servidores cada $5$ minutos y los almacenará con distintas etiquetas.
Remarcar que en la configuración actual, cualquier persona puede acceder a Prometheus y por lo tanto a las bases de datos que hemos intentado asegurar, es por ello que según la documentación oficial se recomienda usar credenciales a esta URL o limitar el acceso mediante reglas del firewall, para crear una url protegida se podrá usar, por ejemplo:
1sudo htpasswd -c /etc/nginx/.htpasswd adminserver {
server_name subdominio.dominio.com;
location / {
auth_basic "Acceso restringido";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://localhost:9090;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}Grafana
Prometheus ya almacena los datos, los puede mostrar haciendo queries y puede generar alertas, pero la interfaz no es tan bonita e intuitiva como la que tienen Grafana, es por ello que, en lo personal, prefiero añadir la fuente de datos de Prometheus y visualizarlo mediante la interfaz ya creada de NodeExporterFull. Para correr Grafana podremos utilizar el siguiente docker compose:
1---
2services:
3 grafana:
4 image: grafana/grafana-enterprise
5 container_name: grafana
6 restart: unless-stopped
7 user: '0'
8 ports:
9 - '3000:3000'
10 volumes:
11 - './Grafana/data:/var/lib/grafana'
12 network_mode: hostCon ello tendremos una monitorización completa de todos nuestros servicios, con la posibilidad de generar alertas y todo esto encriptado, para que solo nosotros podamos visualizar estos datos.