Configurare correttamente Node Exporter significa: impostare il servizio in modo che Prometheus raccolga metriche affidabili dei server Linux con porte ben definite, impostazioni mirate del collector e una sicurezza ottimale. In questa guida pratica illustrerò l’installazione, la configurazione di systemd, l’ottimizzazione dei collector, la sicurezza, l’integrazione con Prometheus, alcuni trucchi per migliorare le prestazioni e utili controlli da eseguire quotidianamente.
Punti centrali
- Installazione e avvio del servizio con una propria unità systemd
- Collezionista scegliere in modo mirato, ridurre il carico delle metriche
- Sicurezza tramite l'apertura delle porte e il proxy
- Prometeo Scrape, avvisi e archiviazione
- Prestazioni tramite intervalli, sharding, pulizia
Che cos’è Node Exporter?
Ho impostato il Nodo Installa Exporter su ogni host Linux per fornire metriche di sistema in formato Prometheus. Il daemon fornisce dati relativi al carico della CPU, al carico di sistema, alla memoria, allo swap, ai file system, alla rete e, facoltativamente, a systemd e ai processi. Accedo all'endpoint tramite HTTP /metriche e vedo serie temporali leggibili che Prometheus recupera ciclicamente. Questo approccio si adatta a parchi server eterogenei e rimane trasparente grazie al modello pull. Traggo vantaggio da una chiara separazione: l’esportatore raccoglie i dati, Prometheus li memorizza e li analizza.
Panoramica architetturale: ecco come Node Exporter e Prometheus interagiscono tra loro
Avvio l'Exporter sulla porta 9100, gestisco i collector e faccio in modo che Prometheus esegua periodicamente lo scraping. Il principio "pull" semplifica la gestione dei firewall, poiché devo aprire solo l'accesso da Prometheus all'host. Grafana o soluzioni di visualizzazione simili si basano poi su Prometheus e mostrano i valori in modo chiaro. Negli ambienti di produzione gestisco più server Prometheus con responsabilità distinte. In questo modo mantengo i percorsi brevi, i ruoli chiari e la gestione trasparente.
Installazione su Linux: pulita e ripetibile
Sto scaricando il file binario corrispondente per linux-amd64 oppure l'architettura di destinazione e inseriscila dopo /usr/local/bin/. Successivamente, creo un utente di sistema senza nome utente, ad esempio node_exporter, e imposto i diritti di proprietà sul file binario. Per l'avvio automatico, creo un'unità systemd nella directory /etc/systemd/system/ con un semplice ExecStart e una politica di riavvio. Dopo systemctl daemon-reload Attivo e avvio il servizio, verifico lo stato e richiamo curl http://localhost:9100/metrics . In questo modo posso verificare immediatamente se le metriche sono disponibili correttamente e se il servizio funziona come previsto.
Node Exporter come servizio systemd: le impostazioni chiave
Nell'unità definisco Utente e Group come account dedicato, imposta Tipo=semplice e un ExecStart ben definito. Una strategia di riavvio come Riavvio=sul guasto è utile in caso di interruzioni improvvise. Per gli aggiornamenti, modifico l'unità o creo un file drop-in, in modo che le modifiche rimangano tracciabili. Dopo ogni modifica, eseguo un daemon-reload e riavvia il servizio. Mi assicuro che l’unità sia compatta, documentata e riutilizzabile per tutte le classi di server.
Porta e indirizzo di lista: coerenza e sicurezza
Di default ascolto sulla porta 9100, ma modifica la porta in base al progetto, qualora ci fossero sovrapposizioni. L'opzione --web.listen-address consente di modificare l'host e la porta, ad esempio 127.0.0.1:9200 in caso di offloading locale tramite proxy. Uno schema di porte uniforme riduce la confusione nei team di grandi dimensioni. Inserisco le modifiche alle porte a livello centrale, in modo che i firewall e le liste di sicurezza siano corretti. La porta rimane limitata ai server Prometheus e non è liberamente accessibile da Internet.
Configurare Collector in modo mirato: solo ciò che conta davvero
Scelgo il Collezionista in modo mirato, per gestire il volume dei dati e il tempo di elaborazione. I moduli standard per CPU, memoria, sistemi di file e rete rimangono solitamente attivi. Se necessario, attivo moduli specifici come --collector.systemd oppure --collector.processes, per monitorare più da vicino i servizi e i processi. Disattivo i moduli indesiderati con --no-collector.X, in modo che Prometheus debba elaborare un numero minore di serie temporali. Documento la selezione effettuata per ciascun ruolo del server, affinché il team mantenga un approccio coerente.
Textfile Collector: inserire correttamente le proprie metriche
Utilizzo Textfile Collector per individuale Indicatori che i moduli standard non forniscono. Una directory come /var/lib/node_exporter/textfile_collector raccoglie .promFile in formato Prometheus. Gli script scrivono in modo atomico, creando file temporanei e sostituendoli alla fine, in modo che non compaiano valori incompleti. In questo modo inserisco direttamente in Prometheus statistiche aziendali, lo stato dei batch o le lunghezze delle code. Rispetto le convenzioni di denominazione per garantire la leggibilità delle analisi e delle dashboard.
Sicurezza nell'ambiente di produzione: accesso riservato solo alle persone autorizzate
Limito l'accesso alle porte tramite Firewall in modo coerente sulle fonti di scraping. Un reverse proxy a monte si occupa, se necessario, del TLS o dell’mTLS e gestisce l’autenticazione. Faccio funzionare il servizio senza diritti di root e assegno permessi minimi ai percorsi dei file di log e dei file di testo. In reti separate, garantisco ulteriore sicurezza tramite VPN o sottoreti private. In questo modo, le informazioni dettagliate sul sistema rimangono protette e visibili solo all’infrastruttura di monitoraggio.
Integrazione con Prometheus: scrapes, etichette, avvisi
Metto nella prometheus.yml un lavoro come nome_lavoro: node a, inserisci un valore appropriato scrape_interval (spesso 15 s) e inserisco i target o la Service Discovery. Le etichette standardizzate (ad es. ambiente, ruolo, sede) facilitano l’utilizzo dei filtri e dei dashboard. Per le analisi ricorrenti definisco delle regole di registrazione, alleggerendo così il carico delle query ad hoc. Gli avvisi si basano su metriche aggregate, ad esempio per il carico della CPU, la RAM, lo swap, l’utilizzo del disco e gli errori di rete. Per un’introduzione al carico di sistema e ai picchi di carico, rimando alla mia guida sintetica Analisi della CPU e del carico di lavoro, che spiega in modo pratico gli indicatori tipici.
Monitoraggio dello stesso Node Exporter: fidarsi va bene, controllare è meglio
Osservo il Stato del lavoro in Prometheus e imposto gli allarmi affinché scatti quando un host non viene sottoposto a scraping per un periodo prolungato. Controllo regolarmente le versioni degli exporter per poter utilizzare tempestivamente le correzioni di bug e i nuovi moduli. Inoltre, misuro il numero di serie temporali per host, per individuare tempestivamente eventuali aumenti del carico dovuti a modifiche al collector. Le dashboard ricevono notifiche relative all’ultimo recupero riuscito. In questo modo riesco a individuare rapidamente i malfunzionamenti e a reagire senza indugi.
Ottimizzazione delle prestazioni e scalabilità: tenere sotto controllo il carico
Controllo il Intervalli in base alle dimensioni e alla finalità dell’ambiente: 15 secondi per i sistemi principali, 30–60 secondi per i server meno critici. Grazie alla selezione mirata dei collector, riduco il numero di metriche e i tempi di interrogazione. Mantengo snelle le mie metriche in file di testo, elimino quelle obsolete e le rinomino in modo coerente. Se la flotta cresce notevolmente, distribuisco il carico su più istanze di Prometheus e separo le responsabilità. La tabella seguente mostra le regolazioni collaudate e il loro effetto durante il funzionamento.
| Argomento | Impostazione | Effetto | Suggerimento |
|---|---|---|---|
| Intervallo di scraping | 15 s / 30 s / 60 s | Ridurre il numero di scrapes Carico | Tenere conto della criticità per ciascuna classe di host |
| Selezione Collector | solo i moduli necessari | Riduce le serie temporali | Documentare l'elenco per ogni ruolo |
| Collector di file di testo | file .prom di dimensioni ridotte | Minori costi di analisi sintattica | Scrivere in modo conciso, definire con chiarezza |
| Cardinalità delle etichette | Verificare le etichette | Impedisce Esplosione delle serie | Evitare l'uso di ID e valori altamente variabili |
| Sharding | Dividere Prometeo | Scala gli scrape e le query | Separare le responsabilità |
Per i sistemi di archiviazione, presto particolare attenzione ai valori IO e alle latenze per singolo dispositivo e per sistema di file. La mia guida offre un buon punto di partenza Monitoraggio delle latenze dei dischi, che riassume le tipiche sequenze di sintomi e le metriche. Correlando questi valori con i tempi di attesa e il carico della CPU, riesco a individuare con precisione i colli di bottiglia. Incornicio le query in “Recording Rules” per garantire un caricamento rapido dei dashboard. In questo modo, l’analisi e la gestione rimangono veloci e chiare.
Visualizzazione con Grafana: vedere con chiarezza, agire rapidamente
Utilizzo dashboard già pronte per CPU, RAM, disco, rete e systemd, ma li adatto alle mie etichette. Una dashboard di panoramica mostra lo stato, il carico e gli host che destano preoccupazione, mentre le pagine di dettaglio approfondiscono ulteriormente i dati. Descrivo brevemente i pannelli in modo che tutti possano comprendere il significato degli indicatori. I selettori di variabili accelerano il passaggio da un host all’altro o da un ruolo all’altro. Chi desidera una panoramica completa, troverà sotto Stack di monitoraggio con Grafana Indicazioni per la creazione di uno stack ad alte prestazioni.
Organizzazione ordinata dei pacchetti e gestione delle versioni: garantire la riproducibilità
Garantisco la riproducibilità delle installazioni fissando esplicitamente le versioni e verificando i checksum. Per le configurazioni Fleet, impacchetto Node Exporter come pacchetto interno (ad es. DEB/RPM) con una struttura di percorsi fissa e un utente di sistema. Distribuisco gli aggiornamenti in modo scaglionato e documento la versione utilizzata per ciascun ambiente. Laddove opportuno, memorizzo i parametri di avvio in un EnvironmentFile, in modo che le modifiche non vengano apportate direttamente al file dell'unità e che la gestione delle versioni rimanga ordinata. Testo le nuove versioni prima nell'ambiente di staging, prima di distribuirle su larga scala.
Configurazione di esempio: unità systemd e hardening
Utilizzo un'unità semplice ma affidabile e, se necessario, aggiungo delle impostazioni di tempra:
[Unit]
Description=Prometheus Node Exporter
After=network-online.target
Wants=network-online.target
[Service]
User=node_exporter
Group=node_exporter
ExecStart=/usr/local/bin/node_exporter \
--web.listen-address=0.0.0.0:9100 \
--collector.systemd \
--collector.processes \
--collector.filesystem.fs-types-exclude='^(tmpfs|devtmpfs|overlay|squashfs)$' \
--collector.filesystem.mount-points-exclude='^/(sys|proc|dev|run)($|/)'
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
Per gli host produttivi, applico ulteriori misure di sicurezza al servizio, senza limitarne i diritti di lettura a /proc e /sys da rompere. Lo inserisco come drop-in (/etc/systemd/system/node_exporter.service.d/hardening.conf) ovvero:
[Service]
NoNewPrivileges=true
PrivateTmp=true
PrivateDevices=true
ProtectSystem=strict
ProtectHome=true
ProtectControlGroups=true
ProtectKernelTunables=true
ProtectKernelModules=true
LockPersonality=true
MemoryDenyWriteExecute=true
CapabilityBoundingSet=
AmbientCapabilities=
RestrictNamespaces=true
RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6
SystemCallFilter=@system-service
Dopo ogni modifica: systemctl daemon-reload e un riavvio pulito. A scopo di debug, attivo temporaneamente un livello di log più alto tramite --log.level=debug, per visualizzare i dettagli relativi al collettore e al parser.
Rifinitura Collector per ambienti clinici
Trovo il giusto equilibrio tra visibilità e carico utilizzando filtri mirati:
- Sistemi di file: escludo i pseudo-FS e i mount temporanei (
--collector.filesystem.fs-types-excludee--collector.filesystem.mount-points-exclude), per evitare serie senza senso. - Processi:
--collector.processesfornisce somme utili, ma genera serie aggiuntive. Lo attivo solo sugli host in cui il numero di processi fornisce un segnale (ad es. nodi batch o worker). - Rete: Il
netstat-Collector può generare molte etichette a seconda del kernel e delle connessioni. Verifico la cardinalità in staging e, in caso contrario, lo disattivo in modo mirato. - Pressione/PSI: i kernel moderni forniscono metriche relative alla pressione (
--collector.pressure, spesso attiva per impostazione predefinita). La utilizzo per individuare tempestivamente eventuali colli di bottiglia a livello di CPU, I/O e memoria. - NVMe/RAID: collector specifici (ad es.
nvme) Lo attivo solo dove è presente l’hardware: in questo modo i dashboard mantengono la loro rilevanza.
Testo i collezionisti in modo selettivo tramite il parametro di query collect[], senza modificare i parametri di avvio. Un esempio: curl 'http://localhost:9100/metrics?collect[]=systemd&collect[]=processes'. In questo modo vedo subito quale impatto hanno i singoli Collector.
Textfile Collector: migliori pratiche operative
Scrivo le metriche in modo atomico: gli script generano prima .tmp-file e sostituirli alla fine con mv. Ogni file contiene un solo gruppo logico e ha una dimensione massima di pochi kilobyte. Lascio a Prometheus la gestione dei timestamp; i file stessi non necessitano di timestamp. Se elimino un .prom-file, le serie correlate scompariranno dopo il prossimo scraping. Documento gli spazi dei nomi (ad es. business_*) e mantengo stabili i valori delle etichette per controllare la cardinalità. Laddove i valori oscillano notevolmente, li uniformo già negli script (ad esempio calcolandone la media), in modo che i dashboard funzionino in modo più fluido.
Sicurezza: varianti di firewall e proxy
Per prima cosa punto sulla segmentazione della rete: l’Exporter è in ascolto solo internamente e il firewall consente l’accesso esclusivamente agli IP di Prometheus. Un esempio con nftables su un host:
table inet filter {
chain input {
type filter hook input priority 0;
ct state established,related accept
iif lo accept
tcp dport 9100 ip saddr { 10.0.0.10, 10.0.0.11 } accept
tcp dport 9100 drop
}
}
Laddove è necessaria la crittografia, inserisco un reverse proxy locale a monte che gestisce TLS o mTLS e si limita a 127.0.0.1:9100 reindirizza. In alternativa, se la versione lo supporta, utilizzo la configurazione web nativa dell’esportatore tramite un --file web.config, in modo che l'autenticazione e i certificati continuino a essere gestiti a livello centrale. In linea di principio, il servizio viene eseguito senza privilegi, con diritti minimi sulla propria directory e con possibilità di scrittura solo dove è davvero necessario (ad es. percorso del file di testo).
L'integrazione di Prometheus in dettaglio: rietichettatura, limiti, avvisi
Mantengo le descrizioni dei lavori concise e uniformi. Ecco come si presenta una descrizione pratica, con limiti e gestione delle etichette:
scrape_configs:
- job_name: node
scrape_interval: 30s
scrape_timeout: 10s
sample_limit: 10000
static_configs:
- targets: ['host1:9100','host2:9100']
labels:
env: prod
role: web
relabel_configs:
- source_labels: [__address__]
target_label: instance
regex: '([^:]+)(?::\d+)?'
replacement: '$1'
metric_relabel_configs:
- source_labels: [device]
regex: '^(ram|loop|zram|dm-).*'
action: drop
Con metric_relabel_configs Attenuo la cardinalità scartando i dispositivi poco significativi. Per gli allarmi utilizzo regole semplici ma solide:
gruppi:
- nome: node_basic
regole:
- avviso: NodeDown
espressione: up{job="node"} == 0
per: 5m
etichette: {gravità: critico}
- alert: HighCPU
expr: 1 - avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) > 0.9
for: 10m
labels: {severity: warning}
Per monitorare il carico utilizzo durata_scraping_in_secondi e campioni_di_scraping_scrapati per ogni target. In questo modo riesco a capire se un collector attivato in più aumenta in modo sproporzionato il tempo di raccolta o il numero di serie.
Funzionamento in container e Kubernetes
Configurerò Node Exporter in container vicino al host, in modo che /proc e /sys rimangano visibili dall'host. A tal fine, monto questi percorsi in modalità di sola lettura nel container e utilizzo hostNetwork per garantire la coerenza delle porte. In Kubernetes eseguo l’Exporter come DaemonSet per ogni nodo e mantengo i contesti di sicurezza restrittivi (senza privilegi superflui). Nella scelta del collector tengo conto degli ambienti Cgroup-v2; i collector importanti come meminfo, pressione, sistema di file e CPU rimangono la base. Dopo le implementazioni, verifico tramite un collegamento diretto ricciolo contro il Pod, per verificare se i percorsi delle metriche host previsti vengano effettivamente letti.
Risoluzione dei problemi e garanzia di qualità
- Connettività: sto verificando
curl -s http://localhost:9100/metrics | headsull'host di destinazione e, dal punto di vista di Prometheus, la raggiungibilità tramite la porta aperta. - Recensione per collezionisti: Informazioni su
collect[]Ho testato i singoli collector senza modificare la configurazione globale. - Log: A titolo temporaneo, aumento il livello di log (
--log.level=debug), per risolvere errori di analisi sintattica o problemi relativi ai diritti su/proc//sysvisibile. - Controllo delle versioni: Con
node_exporter_build_infoConfronto le versioni e pianifico gli aggiornamenti in modo mirato. - Le serie in primo piano: la metrica
scrape_samples_scraped{job="node"}Lo utilizzo come valore approssimativo per il numero di serie per ogni host. Un picco verso l’alto indica la presenza di nuovi collector o un’esplosione di etichette. - Timeout: Ritengo che
scrape_timeoutsottoscrape_intervale osservoscrape_timeout_seconds, per individuare tempestivamente eventuali colli di bottiglia.
Capacità e stoccaggio: pianificare anziché lasciarsi cogliere di sorpresa
Imposto la conservazione dei dati in Prometheus in base al caso d’uso: intervalli brevi per i sistemi principali, conservazione più lunga per le tendenze. Man mano che la flotta cresce, scalare orizzontalmente tramite sharding (ad esempio per sede o team) e separo il carico delle query da quello dell’ingestione. Se necessario, salvo le metriche anche su un componente a lungo termine tramite scrittura remota. Tengo attivamente sotto controllo la cardinalità ed elimino con coerenza le metriche o le etichette inutilizzate, in particolare nel caso delle metriche dei file di testo, che possono crescere rapidamente.
Consigli pratici per flotte eterogenee
- Host solo IPv6: mi unisco alla discussione
[::]:9100e assicurati che le regole del firewall siano adeguate. - Hardware speciale: attivo i collettori specifici per l'hardware solo laddove hanno senso e documento le differenze nei profili dei ruoli.
- Aggiornamenti graduali: effettuo gli aggiornamenti in lotti e nel frattempo tengo d’occhio la situazione
su,durata_scraping_in_secondiecampioni_di_scraping_scrapati, per individuare immediatamente eventuali regressioni. - Documentazione: annoto i parametri di avvio effettivi per ogni ruolo. Questo evita discussioni e facilita l’analisi degli errori.
In breve: il mio programma di guida pratica
Sto installando il Nodo Configurerò l’Exporter come servizio systemd autonomo, definirò la porta e l’indirizzo di ascolto e ne limiterò rigorosamente l’accesso. Scelgo i Collector in modo mirato, inserisco i valori necessari tramite il file di testo del Collector e mantengo basso il numero delle metriche. In Prometheus imposto intervalli adeguati, gestisco le etichette, definisco le regole di registrazione e gli allarmi per CPU, RAM, dischi e rete. Monitoro personalmente l’esportatore, pianifico gli aggiornamenti e controllo regolarmente il numero di serie per ogni host. Grazie a una visualizzazione chiara, reagisco più rapidamente, riconosco tempestivamente le tendenze e mantengo il monitoraggio dei miei server Linux affidabile nell’uso quotidiano.


