Bien configurer Node Exporter, cela signifie : je configure le service de manière à ce que Prometheus collecte des métriques fiables sur les serveurs Linux, avec des ports clairement définis, des paramètres de collecteur ciblés et une sécurisation rigoureuse. Dans ce guide pratique, je vous présente l'installation, la configuration de systemd, l'optimisation des collecteurs, la sécurité, l'intégration de Prometheus, des astuces pour améliorer les performances et des vérifications utiles au quotidien.
Points centraux
- Installation et démarrage du service avec sa propre unité systemd
- Collector choisir de manière ciblée, réduire la charge métrique
- Sécurité grâce à l'ouverture de ports et à un proxy
- Prometheus Extractions, alertes et conservation
- Performance via les intervalles, le sharding, le nettoyage
Qu'est-ce que Node Exporter ?
Je mets le Nœud Installez Exporter sur chaque hôte Linux afin de fournir des métriques système au format Prometheus. Le démon fournit des données sur la charge CPU, la charge du système, la mémoire vive, l'espace d'échange, les systèmes de fichiers, le réseau et, en option, des données systemd et sur les processus. J'accède au point de terminaison via HTTP /metrics et je constate que Prometheus récupère de manière cyclique des séries chronologiques lisibles. Cette approche convient aux parcs de serveurs hétérogènes et reste transparente grâce au modèle « pull ». Je bénéficie d'une séparation claire : l'exportateur collecte les données, Prometheus les stocke et les analyse.
Présentation de l'architecture : comment Node Exporter et Prometheus s'intègrent
Je lance l'exportateur sur le port 9100, je gère les collecteurs et je configure Prometheus pour qu'il effectue des collectes périodiques. Le principe du « pull » facilite la gestion des pare-feu, car je n'ouvre que l'accès de Prometheus vers l'hôte. Grafana ou d'autres solutions de visualisation similaires s'appuient ensuite sur Prometheus et affichent les valeurs de manière claire. Dans les environnements de production, j’exploite plusieurs serveurs Prometheus pour des responsabilités distinctes. Je veille ainsi à ce que les chemins de communication restent courts, les rôles clairement définis et la gestion transparente.
Installation sous Linux : propre et reproductible
Je télécharge le fichier binaire correspondant pour linux-amd64 ou l'architecture cible, puis placez-le dans le répertoire /usr/local/bin/. Ensuite, je crée un utilisateur système sans identifiant de connexion, par exemple node_exporter, et j'attribue les droits de propriété au fichier binaire. Pour le démarrage automatique, je crée une unité systemd dans le répertoire /etc/systemd/system/ avec un simple ExecStart et une politique de redémarrage. Après systemctl daemon-reload J'active et je lance le service, je vérifie son état et j'appelle curl http://localhost:9100/metrics . Cela me permet de voir immédiatement si les indicateurs sont correctement disponibles et si le service fonctionne comme prévu.
Node Exporter en tant que service systemd : les paramètres clés
Je définis dans l'unité Utilisateur et « Group » comme compte dédié, définissez Type=simple et un ExecStart bien défini. Une stratégie de redémarrage telle que Restart=on-failure permet de pallier les pannes ponctuelles. Pour les mises à jour, je modifie l'unité ou je crée un fichier « drop-in » afin que les modifications restent traçables. Après chaque modification, j'effectue un daemon-reload et redémarre le service. Je veille à ce que l'unité soit compacte, documentée et réutilisable pour toutes les classes de serveurs.
Port et adresse de liste : cohérence et sécurité
Par défaut, j'écoute sur le port 9100, mais modifie le port en fonction du projet en cas de conflits. L'option --web.listen-address permet de modifier l'hôte et le port, par exemple 127.0.0.1:9200 en cas de déchargement via un proxy local. Un schéma de ports uniforme permet d'éviter toute confusion au sein des grandes équipes. Je gère les modifications de ports de manière centralisée afin que les pare-feu et les listes de sécurité soient corrects. L'accès au port reste limité aux serveurs Prometheus et n'est pas ouvert librement vers Internet.
Configurer Collector de manière ciblée : uniquement ce qui compte vraiment
Je choisis la Collector de manière ciblée, afin de maîtriser le volume de données et le temps de calcul. Les modules standard pour le processeur, la mémoire, les systèmes de fichiers et le réseau restent généralement actifs. Si nécessaire, j'active des modules spécifiques tels que --collector.systemd ou --collector.processes, afin de surveiller plus étroitement les services et les processus. Je désactive les modules indésirables à l'aide de --no-collector.X, afin que Prometheus ait moins de séries chronologiques à traiter. Je consigne les choix effectués pour chaque rôle de serveur, afin de garantir la cohérence au sein de l'équipe.
Textfile Collector : intégrer correctement vos propres métriques
J'utilise le Textfile Collector pour individuel Indicateurs que les modules standard ne fournissent pas. Un répertoire tel que /var/lib/node_exporter/textfile_collector rassemble .promFichiers au format Prometheus. Les scripts effectuent des opérations « atomiques » en créant des fichiers temporaires qu’ils remplacent à la fin, afin d’éviter l’apparition de valeurs incomplètes. C’est ainsi que j’importe directement dans Prometheus les statistiques métier, l’état des traitements par lots ou la longueur des files d’attente. Je respecte les conventions de nommage afin de garantir la lisibilité des analyses et des tableaux de bord.
Sécurité en production : accès réservé aux personnes autorisées
Je limite l'accès aux ports via Pare-feu de manière cohérente vers les sources de scraping. Un proxy inverse en amont gère, si nécessaire, le protocole TLS ou mTLS et se charge de l’authentification. Je fais fonctionner le service sans droits root et j’attribue des droits d’accès minimaux aux chemins d’accès des fichiers journaux et des fichiers texte. Sur des réseaux distincts, j’assure une sécurité supplémentaire via un VPN ou des sous-réseaux privés. Ainsi, les informations détaillées du système restent protégées et ne sont visibles que par l’infrastructure de surveillance.
Intégration dans Prometheus : scrapes, étiquettes, alertes
Je mets dans la prometheus.yml un emploi comme nom_du_poste : node à, définis une valeur pertinente intervalle_de_récupération (souvent 15 s) et j'y ajoute des cibles ou la découverte de services. Des libellés uniformes (par exemple : environnement, rôle, emplacement) facilitent le filtrage et la création de tableaux de bord. Pour les analyses fréquentes, je définis des règles d'enregistrement, ce qui allège la charge des requêtes ad hoc. Les alertes s’appuient sur des métriques agrégées, par exemple pour la charge CPU, la RAM, la mémoire swap, l’utilisation du disque et les erreurs réseau. Pour une première approche de l’utilisation des ressources et des pics de charge, je vous renvoie à mon guide concis Analyse de l'utilisation du processeur et de la charge, qui explique de manière concrète les indicateurs clés.
Surveillance du Node Exporter lui-même : la confiance, c'est bien, mais la vérification, c'est mieux
J'observe le Statut de la mission dans Prometheus et je configure des alertes pour signaler lorsqu'un hôte n'a pas été scrapé depuis un certain temps. Je vérifie régulièrement les versions des exportateurs afin de bénéficier rapidement des corrections de bogues et des nouveaux modules. De plus, je mesure le nombre de séries chronologiques par hôte afin de détecter rapidement si une modification du collecteur entraîne une augmentation de la charge. Les tableaux de bord affichent des notifications indiquant la dernière collecte réussie. Cela me permet de repérer rapidement les dysfonctionnements et d’y réagir sans délai.
Optimisation des performances et évolutivité : maîtriser la charge
Je contrôle les Intervalles en fonction de la taille et de la nature de l'environnement : 15 s pour les systèmes centraux, 30 à 60 s pour les serveurs moins critiques. Grâce à une sélection ciblée des collecteurs, je réduis le nombre de métriques et les temps de requête. Je veille à ce que mes métriques dans les fichiers texte restent légères, je supprime les anciennes et je les renomme de manière cohérente. Si le parc s'agrandit considérablement, je répartis la charge sur plusieurs instances Prometheus et je sépare les responsabilités. Le tableau suivant présente les paramètres d'ajustement éprouvés et leur impact en production.
| Sujet | Réglage | Effet | Remarque |
|---|---|---|---|
| Intervalle de scraping | 15 s / 30 s / 60 s | Réduire le nombre de « scrapes » Dernier | Prendre en compte le niveau de criticité par classe d'hôte |
| Sélection Collector | uniquement les modules nécessaires | Réduit les séries chronologiques | Consigner la liste par rôle |
| Collecteur de fichiers texte | fichiers .prom allégés | Réduction des coûts d'analyse syntaxique | Écrire de manière concise, nommer clairement |
| Cardinalité des étiquettes | Vérifier les étiquettes | Empêche Explosion des séries | Éviter les identifiants et les valeurs très variables |
| Sharding | Diviser Prométhée | Mise à l'échelle des scrapes et des requêtes | Séparer les responsabilités |
En ce qui concerne les systèmes de stockage, je porte une attention particulière aux valeurs d'E/S et aux latences par périphérique ainsi que par système de fichiers. Mon guide constitue un bon point de départ. Surveiller les latences des disques, qui regroupe les chaînes de symptômes et les indicateurs types. Je relie ces valeurs à l'attente CPU et à la charge afin d'identifier avec certitude les goulots d'étranglement. J'intègre les requêtes dans des règles d'enregistrement afin que les tableaux de bord se chargent rapidement. Ainsi, l'analyse et l'exploitation restent rapides et claires.
Visualisation avec Grafana : une vision claire pour agir rapidement
J'utilise des tableaux de bord prêts à l'emploi pour CPU, la RAM, le disque, le réseau et systemd, mais je les adapte à mes libellés. Un tableau de bord récapitulatif affiche l’état, la charge et les hôtes suspects, tandis que les pages de détail permettent d’approfondir l’analyse. Je décris brièvement les panneaux afin que chacun comprenne la signification des indicateurs. Les sélecteurs de variables accélèrent le passage d’un hôte à l’autre ou d’un rôle à l’autre. Ceux qui souhaitent obtenir une vue d’ensemble complète trouveront sous Pile de surveillance avec Grafana Conseils pour la mise en place d'une pile performante.
Un packaging soigné et une gestion des versions : garantir la reproductibilité
Je m'assure que les installations sont reproductibles en fixant explicitement les versions et en vérifiant les sommes de contrôle. Pour les configurations Fleet, j'intègre Node Exporter sous forme de paquet interne (par exemple DEB/RPM) avec une structure de chemins d'accès fixe et un utilisateur système dédié. Je déploie les mises à jour de manière échelonnée et je documente la version utilisée pour chaque environnement. Lorsque cela est possible, j'enregistre les paramètres de démarrage dans un EnvironmentFile, afin que les modifications ne soient pas apportées directement au fichier Unit et que la gestion des versions reste claire. Je teste d'abord les nouvelles versions en environnement de préproduction avant de les déployer à grande échelle.
Exemple de configuration : unité systemd et renforcement de la sécurité
J'utilise une unité simple mais fiable et j'ajoute des réglages de durcissement si nécessaire :
[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
Pour les serveurs de production, je renforce davantage la sécurité du service, sans modifier ses droits de lecture sur /proc et /sys pour le casser. Je le mets en tant que « drop-in » (/etc/systemd/system/node_exporter.service.d/hardening.conf) pour :
[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
Après chaque modification : systemctl daemon-reload et un redémarrage propre. À des fins de débogage, j'active temporairement un niveau de journalisation plus élevé via --log.level=debug, pour afficher les détails relatifs au collecteur et au parseur.
Réglages avancés de Collector pour les environnements de cabinet
Je trouve le juste équilibre entre visibilité et charge grâce à des filtres ciblés :
- Systèmes de fichiers : j'exclus les pseudo-systèmes de fichiers et les montages éphémères (
--collector.filesystem.fs-types-excludeet--collector.filesystem.mount-points-exclude), afin d'éviter les séries absurdes. - Processus :
--collector.processesfournit des totaux utiles, mais génère des séries supplémentaires. Je ne l'active que sur les hôtes où le nombre de processus fournit un signal (par exemple, les nœuds de traitement par lots ou les nœuds de travail). - Réseau : Le
netstat-Collector peut générer de nombreuses étiquettes selon le noyau et les connexions. Je vérifie la cardinalité dans l'environnement de préproduction et, le cas échéant, je le désactive de manière ciblée. - Pression/PSI : les noyaux modernes fournissent des mesures de pression (
--collector.pressure, souvent activée par défaut). Je m'en sers pour détecter rapidement les goulots d'étranglement au niveau du processeur, des E/S et de la mémoire. - NVMe/RAID : collecteurs spécifiques (par exemple,.
nvme) Je ne l'active que là où le matériel est disponible – cela permet de garantir la pertinence des tableaux de bord.
Je teste les collecteurs de manière sélective à l'aide du paramètre de requête collect[], sans modifier les paramètres de démarrage. Exemple : curl 'http://localhost:9100/metrics?collect[]=systemd&collect[]=processes'. Je peux ainsi voir immédiatement l'impact de chaque Collector.
Collecteur de fichiers texte : bonnes pratiques issues de l'exploitation
J'écris les métriques de manière atomique : les scripts génèrent d'abord .tmp-fichiers et les remplacez à la fin par mv. Chaque fichier ne contient qu'un seul groupe logique et ne dépasse pas quelques kilo-octets. Je laisse à Prometheus le soin de gérer les horodatages ; les fichiers eux-mêmes n'ont pas besoin d'horodatage. Si je supprime un .prom-fichier, les séries associées disparaîtront après le prochain scraping. Je répertorie les espaces de noms (par exemple. business_*) et je maintiens la stabilité des valeurs des étiquettes afin de contrôler la cardinalité. Lorsque les valeurs fluctuent fortement, je les lisse déjà dans les scripts (par exemple en calculant une moyenne) afin d'assurer un fonctionnement plus fluide des tableaux de bord.
Sécurité : différents types de pare-feu et de serveurs proxy
Je mise d'abord sur la segmentation du réseau : l'exportateur n'écoute qu'en interne, et le pare-feu n'autorise que les adresses IP de Prometheus. Voici un exemple avec nftables sur un hôte :
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
}
}
Lorsqu'un chiffrement est nécessaire, je place en amont un proxy inverse local qui prend en charge le protocole TLS ou mTLS et ne communique qu'avec 127.0.0.1:9100 redirige. Sinon, j’utilise – si la version le permet – la configuration Web native de l’exportateur via une --fichier web.config, afin que l'authentification et les certificats continuent d'être gérés de manière centralisée. En principe, le service s'exécute sans privilèges, avec des droits minimaux sur son répertoire et n'effectue des écritures que lorsque cela est vraiment nécessaire (par exemple, le chemin d'accès à un fichier texte).
L'intégration de Prometheus en détail : relabeling, limites, alertes
Je veille à ce que les jobs restent légers et uniformes. Voici à quoi ressemble un job pratique, avec des limites et une gestion des étiquettes :
scrape_configs :
- job_name : node
scrape_interval : 30 s
scrape_timeout : 10 s
sample_limit : 10 000
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
Avec metric_relabel_configs J'atténue le problème de cardinalité en écartant les appareils peu significatifs. Pour les alertes, j'utilise des règles simples mais robustes :
groupes :
- nom : node_basic
règles :
- alerte : NodeDown
expr : up{job="node"} == 0
durée : 5 min
étiquettes : {gravité : critique}
- alert : HighCPU
expr : 1 - avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) > 0,9
for : 10m
labels : {severity : warning}
Pour surveiller la charge, j'utilise durée_du_scraping_en_secondes et échantillons_de_scraping_récupérés par cible. Cela me permet de détecter si un collecteur supplémentaire activé augmente de manière disproportionnée le temps de collecte ou le nombre de séries.
Fonctionnement en conteneurs et Kubernetes
Je déploie Node Exporter dans des conteneurs à proximité du serveur hôte afin que /proc et /sys restent visibles depuis l'hôte. Pour cela, je monte ces chemins en lecture seule dans le conteneur et j'utilise hostNetwork pour garantir la cohérence des ports. Dans Kubernetes, j'exécute l'exportateur sous forme de DaemonSet par nœud et je définis des contextes de sécurité restrictifs (pas de privilèges inutiles). Je tiens compte des environnements Cgroup-v2 lors du choix des collecteurs ; les collecteurs importants tels que meminfo, pression, système de fichiers et CPU restent la base. Je vérifie après les déploiements à l'aide d'un curl vérifier auprès du Pod si les chemins de métriques hôte attendus sont bien lus.
Dépannage et assurance qualité
- Connectivité : je vérifie
curl -s http://localhost:9100/metrics | headsur l'hôte cible et, du point de vue de Prometheus, l'accessibilité via le port ouvert. - Test des collectionneurs : À propos de
collect[]J'ai testé chaque collecteur individuellement, sans modifier la configuration globale. - Journaux : j'augmente temporairement le niveau de journalisation (
--log.level=debug), afin d'éviter les erreurs d'analyse ou les problèmes de droits d'accès à/proc//sysrendre visible. - Contrôle de version : avec
node_exporter_build_infoJe compare les versions et je planifie les mises à jour de manière ciblée. - Les séries en bref : les indicateurs
scrape_samples_scraped{job="node"}Je m'en sers comme estimation du nombre de séries par hôte. Une hausse soudaine indique l'apparition de nouveaux collecteurs ou une explosion des étiquettes. - Temps morts : Je pense que
scrape_timeouten dessous deintervalle_de_récupérationet observescrape_timeout_seconds, afin de détecter les goulots d'étranglement à temps.
Capacité et rangement : mieux vaut planifier que d’être pris au dépourvu
Je configure la conservation des données dans Prometheus en fonction des cas d'utilisation : intervalles courts pour les systèmes critiques, conservation plus longue pour les tendances. À mesure que le parc s'agrandit, je procède à une évolutivité horizontale par sharding (par exemple, par site ou par équipe) et je dissocie la charge des requêtes de celle de l'ingestion. Si nécessaire, j’enregistre également les métriques dans un composant de stockage à long terme via Remote-Write. Je surveille activement la cardinalité et je supprime systématiquement les métriques ou les étiquettes inutilisées, en particulier les métriques de fichiers texte, qui peuvent rapidement prendre de l’ampleur.
Conseils pratiques pour les flottes hétérogènes
- Hôtes IPv6 uniquement : je suis d'accord
[::]:9100et veille à ce que les règles du pare-feu soient adaptées. - Matériel spécifique : je n'active les collecteurs spécifiques au matériel que lorsque cela s'avère pertinent, et je documente les différences dans les profils de rôle.
- Mises à jour progressives : je procède à des mises à jour par lots tout en surveillant le processus
haut,durée_du_scraping_en_secondesetéchantillons_de_scraping_récupérés, afin de détecter immédiatement les régressions. - Documentation : je note les paramètres de démarrage effectifs pour chaque rôle. Cela évite les discussions et facilite l'analyse des erreurs.
En bref : mon programme de conduite pratique
J'installe le Nœud Je l'exporte en tant que service systemd dédié, je définis le port et l'adresse d'écoute, puis je sécurise strictement l'accès. Je choisis délibérément les collecteurs, je complète les valeurs nécessaires via le collecteur de fichiers texte et je limite le nombre de métriques. Dans Prometheus, je définis des intervalles pertinents, je gère les étiquettes, je définis des règles d’enregistrement et des alertes pour le CPU, la RAM, les disques et le réseau. Je surveille moi-même l’exportateur, je planifie les mises à jour et je vérifie régulièrement le nombre de séries par hôte. Grâce à une visualisation claire, je réagis plus rapidement, j’identifie les tendances à un stade précoce et j’assure la fiabilité de la surveillance de mes serveurs Linux au quotidien.


