Prawidłowa konfiguracja Node Exporter oznacza: konfiguruję tę usługę tak, aby Prometheus zbierał wiarygodne dane dotyczące serwerów z systemem Linux, z jasno określonymi portami, precyzyjnymi ustawieniami kolektora i odpowiednim zabezpieczeniem. W tym praktycznym przewodniku przedstawiam instalację, konfigurację systemd, optymalizację collectorów, zabezpieczenia, integrację z Prometheusem, wskazówki dotyczące wydajności oraz przydatne testy do codziennego użytku.
Punkty centralne
- Instalacja oraz uruchomienie usługi za pomocą własnej jednostki systemd
- Collector dokonywać przemyślanych wyborów, zmniejszać obciążenie metryczne
- Bezpieczeństwo poprzez udostępnianie portów i serwer proxy
- Prometeusz Zrzuty ekranu, powiadomienia i przechowywanie
- Wydajność poprzez interwały, sharding, czyszczenie
Czym jest Node Exporter?
Ustawiłem Węzeł Zainstaluj eksporter na każdym serwerze z systemem Linux, aby udostępniać wskaźniki systemowe w formacie Prometheus. Demon dostarcza dane dotyczące obciążenia procesora, obciążenia systemu, pamięci operacyjnej, obszaru wymiany, systemów plików, sieci oraz – opcjonalnie – dane dotyczące systemd i procesów. Uzyskuję dostęp do punktu końcowego przez HTTP /wskaźniki i widzę czytelne szeregi czasowe, które Prometheus pobiera cyklicznie. Takie podejście sprawdza się w przypadku zróżnicowanych flot serwerów i pozostaje przejrzyste dzięki modelowi typu „pull”. Korzystam z wyraźnego podziału ról: eksporter gromadzi dane, a Prometheus je przechowuje i analizuje.
Przegląd architektury: w jaki sposób Node Exporter i Prometheus współdziałają ze sobą
Uruchamiam eksportator na porcie 9100, zarządzam kolektorami i ustawiam Prometheus na okresowe pobieranie danych. Zasada „pull” ułatwia obsługę zapór sieciowych, ponieważ otwieram dostęp tylko z Prometheusa do hosta. Grafana lub podobne rozwiązania do wizualizacji korzystają następnie z danych z Prometheusa i wyświetlają wartości w przejrzysty sposób. W środowiskach produkcyjnych obsługuję kilka serwerów Prometheusa, z których każdy odpowiada za odrębny zakres zadań. Dzięki temu ścieżki komunikacji są krótkie, role jasno określone, a zarządzanie przejrzyste.
Instalacja w systemie Linux: uporządkowana i powtarzalna
Pobieram odpowiedni plik binarny dla linux-amd64 lub architekturę docelową i umieść ją w /usr/local/bin/. Następnie tworzę użytkownika systemowego bez nazwy logowania, na przykład node_exporter, i przypisuję uprawnienia właściciela do pliku binarnego. Aby uruchamiać program automatycznie, tworzę jednostkę systemd w katalogu /etc/systemd/system/ z prostym ustawieniem ExecStart i polityką restartowania. Zgodnie z systemctl daemon-reload włączam i uruchamiam usługę, sprawdzam jej stan i wywołuję curl http://localhost:9100/metrics . Dzięki temu od razu widzę, czy wskaźniki są dostępne i czy usługa działa zgodnie z założeniami.
Node Exporter jako usługa systemd: najważniejsze parametry konfiguracyjne
W module definiuję Użytkownik oraz Group jako dedykowany konto, ustaw Typ=prosty oraz wyraźny ExecStart. Strategia ponownego uruchomienia, taka jak Restart=po awarii pomaga w przypadku doraźnych awarii. W celu wprowadzania aktualizacji edytuję moduł lub tworzę plik typu „drop-in”, aby zmiany były przejrzyste. Po każdej modyfikacji przeprowadzam daemon-reload i uruchom ponownie usługę. Staram się, aby moduł był zwięzły, dobrze udokumentowany i nadający się do ponownego wykorzystania we wszystkich klasach serwerów.
Port i adres listy: spójność i bezpieczeństwo
Domyślnie nasłuchuję na porcie 9100, jednak w razie kolizji należy zmienić port w zależności od projektu. Opcja --web.listen-address umożliwia dostosowanie adresu hosta i portu, na przykład 127.0.0.1:9200 w przypadku lokalnego odciążania proxy. Ujednolicony schemat portów ogranicza niejasności w dużych zespołach. Zmiany portów wprowadzam centralnie, aby zapory sieciowe i listy bezpieczeństwa były spójne. Port pozostaje ograniczony do serwerów Prometheusa i nie ma swobodnego dostępu do Internetu.
Precyzyjna konfiguracja Collector: tylko to, co naprawdę się liczy
Wybieram Collector celowo, aby kontrolować ilość danych i czas obliczeniowy. Moduły standardowe dotyczące procesora, pamięci, systemów plików i sieci pozostają zazwyczaj aktywne. W razie potrzeby aktywuję specjalne moduły, takie jak --collector.systemd lub --collector.processes, aby dokładniej monitorować usługi i procesy. Niepożądane moduły wyłączam za pomocą --no-collector.X, aby Prometheus musiał przetwarzać mniej szeregów czasowych. Dokumentuję dokonany wybór dla każdej roli serwera, aby zapewnić spójność działań zespołu.
Textfile Collector: prawidłowe wprowadzanie własnych wskaźników
Korzystam z programu Textfile Collector do indywidualny Wskaźniki, których nie dostarczają moduły standardowe. Katalog taki jak /var/lib/node_exporter/textfile_collector gromadzi .promPliki w formacie Prometheus. Skrypty zapisują dane w sposób atomowy, tworząc pliki tymczasowe i zastępując je na końcu, dzięki czemu nie pojawiają się żadne niekompletne wartości. W ten sposób przekazuję statystyki biznesowe, statusy przetwarzania wsadowego lub długości kolejek bezpośrednio do Prometheusa. Przestrzegam konwencji nazewniczych, aby zapewnić czytelność analiz i pulpitów nawigacyjnych.
Bezpieczeństwo w trybie produkcyjnym: dostęp wyłącznie dla uprawnionych osób
Ograniczam dostęp do portów za pomocą Firewall konsekwentnie w odniesieniu do źródeł scrapowania. Umieszczony przed serwerem odwrotny serwer proxy w razie potrzeby zajmuje się protokołami TLS lub mTLS oraz przejmuje uwierzytelnianie. Uruchamiam tę usługę bez uprawnień roota i przyznaję minimalne uprawnienia do ścieżek plików dziennika i plików tekstowych. W oddzielnych sieciach zapewniam dodatkowe zabezpieczenia za pomocą VPN lub prywatnych podsieci. Dzięki temu szczegółowe informacje o systemie pozostają chronione i widoczne wyłącznie dla infrastruktury monitorującej.
Integracja z Prometheusem: dane zebrane, etykiety, alerty
Umieszczam w prometheus.yml taką pracę jak nazwa_stanowiska: node , wprowadź sensowne scrape_interval (często 15 s) i wprowadzam cele lub wykrywanie usług. Ujednolicone etykiety (np. środowisko, rola, lokalizacja) ułatwiają filtrowanie i tworzenie pulpitów nawigacyjnych. W celu przeprowadzania częstych analiz definiuję reguły rejestrowania, odciążając w ten sposób zapytania ad hoc. Powiadomienia opierają się na zagregowanych metrykach, takich jak obciążenie procesora, pamięć RAM, pamięć wymiany, zajętość dysków i błędy sieciowe. Aby zapoznać się z zagadnieniem obciążenia i szczytów obciążenia, odsyłam do mojego zwięzłego Analiza procesora i obciążenia, w której typowe wskaźniki zostały wyjaśnione w sposób praktyczny.
Monitorowanie samego Node Exporter: zaufanie to dobrze, kontrola – lepiej
Obserwuję... Status zlecenia w Prometheusie i konfiguruję uruchamianie alertów, gdy host nie jest skanowany przez dłuższy czas. Regularnie sprawdzam wersje eksporterów, aby na bieżąco korzystać z poprawek błędów i nowych modułów. Ponadto mierzę liczbę szeregów czasowych na każdy host, aby wcześnie wykryć, czy zmiana w kolektorze powoduje wzrost obciążenia. Na pulpitach nawigacyjnych wyświetlane są powiadomienia dotyczące ostatniego pomyślnego pobrania danych. Dzięki temu szybko wykrywam awarie i reaguję bez zbędnych opóźnień.
Optymalizacja wydajności i skalowalność: kontrolowanie obciążenia
Kontroluję Interwały w zależności od wielkości i przeznaczenia środowiska: 15 s dla systemów kluczowych, 30–60 s dla serwerów o mniejszym znaczeniu. Dzięki selektywnemu doborowi kolektorów ograniczam liczbę metryk i skracam czas odpowiadania na zapytania. Własne metryki w plikach tekstowych utrzymuję w zwięzłej formie, usuwam stare dane i stosuję spójną nomenklaturę. Jeśli flota znacznie się powiększa, rozkładam obciążenie na kilka instancji Prometheusa i rozdzielam zakresy odpowiedzialności. Poniższa tabela przedstawia sprawdzone parametry regulacyjne i ich wpływ na działanie systemu.
| Temat | Ustawienie | Efekt | Wskazówka |
|---|---|---|---|
| Interwał zeskrobywania | 15 s / 30 s / 60 s | Mniej otarć zmniejsza Obciążenie | Uwzględnienie krytyczności w podziale na klasy hostów |
| Wybór kolekcjonerski | tylko niezbędne moduły | Redukcja szeregów czasowych | Dokumentować listę dla każdej roli |
| Program do zbierania plików tekstowych | zredukowane pliki .prom | Mniejsze nakłady związane z analizą składniową | Pisać zwięźle, nazywać jasno |
| Kardynalność etykiet | Sprawdź etykiety | Zapobiega Wybuch seriali | Należy unikać identyfikatorów i wartości o dużej zmienności |
| Sharding | Podział „Prometeusza” | Skalowanie zrzutów danych i zapytań | Rozdzielenie obowiązków |
W przypadku systemów pamięci masowej zwracam szczególną uwagę na wartości IO oraz opóźnienia dla poszczególnych urządzeń i systemów plików. Dobrym punktem wyjścia jest mój przewodnik Monitorowanie opóźnień dysków, który podsumowuje typowe łańcuchy symptomów i wskaźniki. Łączę te wartości z czasem oczekiwania procesora i obciążeniem procesora, aby precyzyjnie zidentyfikować wąskie gardła. Zapytania umieszczam w regułach rejestrowania, dzięki czemu pulpity nawigacyjne ładują się szybko. Dzięki temu analiza i obsługa przebiegają sprawnie i są przejrzyste.
Wizualizacja za pomocą Grafany: jasny obraz, szybkie działanie
Korzystam z gotowych pulpitów nawigacyjnych do CPU, pamięć RAM, dysk, sieć i systemd, ale dostosowuję je do moich etykiet. Pulpit nawigacyjny z przeglądem pokazuje status, obciążenie i hosty budzące podejrzenia, natomiast strony szczegółowe pozwalają na głębszą analizę. Krótko opisuję panele, aby każdy zrozumiał znaczenie wskaźników. Selektory zmiennych przyspieszają przełączanie się między hostami lub rolami. Osoby poszukujące pełnego przeglądu znajdą pod adresem Stos monitorujący z wykorzystaniem Grafany Wskazówki dotyczące tworzenia wydajnego stosu.
Przejrzyste pakowanie i zarządzanie wersjami: zachowanie powtarzalności
Dbam o powtarzalność instalacji poprzez wyraźne przypisywanie wersji i sprawdzanie sum kontrolnych. W przypadku konfiguracji floty pakuję Node Exporter jako pakiet wewnętrzny (np. DEB/RPM) ze stałą strukturą ścieżek i użytkownikiem systemowym. Aktualizacje wdrażam stopniowo i dokumentuję zastosowaną wersję dla każdego środowiska. Tam, gdzie to możliwe, zapisuję parametry startowe w pliku Plik środowiskowy, aby zmiany nie były wprowadzane bezpośrednio w pliku jednostki i aby zachować prawidłowe wersjonowanie. Nowe wersje testuję najpierw w środowisku stagingowym, zanim rozpowszechnię je na szeroką skalę.
Przykładowa konfiguracja: jednostka systemd i zabezpieczenia
Korzystam z prostego, ale niezawodnego modułu i w razie potrzeby uzupełniam ustawienia utwardzania:
[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
W przypadku aktywnych hostów dodatkowo wzmacniam zabezpieczenia usługi, nie ograniczając jej uprawnień do odczytu w /proc oraz /sys przerwać. Traktuję to jako drop-in (/etc/systemd/system/node_exporter.service.d/hardening.conf) na:
[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
Po każdej zmianie: systemctl daemon-reload i czysty restart. W celach debugowania tymczasowo włączam wyższy poziom logowania poprzez --log.level=debug, aby wyświetlić szczegóły dotyczące modułów zbierających i analizujących.
Dopracowanie Collector dla środowisk praktycznych
Równoważę widoczność i obciążenie za pomocą ukierunkowanych filtrów:
- Systemy plików: Wykluczam pseudoplikowe systemy plików i montowania tymczasowe (
--collector.filesystem.fs-types-excludeoraz--collector.filesystem.mount-points-exclude), aby uniknąć bezsensownych serii. - Procesy:
--collector.processesdostarcza przydatnych sum, ale generuje dodatkowe serie. Włączam tę opcję tylko na hostach, na których liczba procesów stanowi sygnał (np. węzły wsadowe lub robocze). - Sieć: Der
netstat-Collector może generować wiele etykiet w zależności od jądra i połączeń. Sprawdzam kardynalność w środowisku stagingowym i w przeciwnym razie wyłączam go selektywnie. - Ciśnienie/PSI: Nowoczesne jądra dostarczają wskaźniki ciśnienia (
--ciśnienie kolektora, często włączone domyślnie). Wykorzystuję je do wczesnego wykrywania wąskich gardeł w zakresie procesora, operacji wejścia/wyjścia i pamięci. - NVMe/RAID: konkretne moduły zbierające (np.
NVMe) włączam tę funkcję tylko tam, gdzie jest dostępny odpowiedni sprzęt – dzięki temu pulpity nawigacyjne zachowują swoją wartość informacyjną.
Testuję kolekcje selektywnie za pomocą parametru zapytania collect[], bez zmiany parametrów startowych. Przykład: curl 'http://localhost:9100/metrics?collect[]=systemd&collect[]=processes'. Dzięki temu od razu widzę, jaki wpływ mają poszczególni kolekcjonerzy.
Textfile Collector: najlepsze praktyki z praktyki operacyjnej
Piszę metryki w sposób atomowy: skrypty najpierw generują .tmp-pliki i na końcu zastępujemy je za pomocą mv. Każdy plik zawiera tylko jedną grupę logiczną i zajmuje maksymalnie kilka kilobajtów. Obsługę znaczników czasu pozostawiam Prometheusowi; same pliki nie potrzebują znaczników czasu. Jeśli usunę .prom-plik, powiązane serie znikną po kolejnym skanowaniu. Dokumentuję przestrzenie nazw (np. business_*) i utrzymuję stałe wartości etykiet, aby kontrolować kardynalność. Tam, gdzie wartości silnie się wahały, wygładzam je już w skryptach (np. poprzez obliczenie średniej), aby pulpity nawigacyjne działały płynniej.
Bezpieczeństwo: rodzaje zapór sieciowych i serwerów proxy
Najpierw stawiam na segmentację sieci: eksporter nasłuchuje wyłącznie wewnętrznie, a zapora sieciowa zezwala wyłącznie na adresy IP serwera Prometheus. Przykład z nftables na jednym serwerze:
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
}
}
Tam, gdzie konieczne jest szyfrowanie, umieszczam przed nim lokalny serwer proxy odwrotny, który obsługuje protokoły TLS lub mTLS i przekierowuje wyłącznie do 127.0.0.1:9100 przekazuje dalej. Alternatywnie – o ile wersja to obsługuje – korzystam z natywnej konfiguracji internetowej eksportera poprzez --plik web.config, aby uwierzytelnianie i certyfikaty były nadal zarządzane centralnie. Zasadniczo usługa działa bez uprawnień, z minimalnymi uprawnieniami do swojego katalogu i zapisuje dane tylko tam, gdzie jest to naprawdę konieczne (np. ścieżka do pliku tekstowego).
Integracja z Prometheusem – szczegóły: zmiana etykiet, limity, alerty
Staram się, aby opisy stanowisk były zwięzłe i spójne. Praktyczny opis stanowiska, uwzględniający ograniczenia i zarządzanie etykietami, wygląda następująco:
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
Z konfiguracje zmiany etykiet metrycznych Zmniejszam kardynalność, odrzucając urządzenia o niewielkiej wartości informacyjnej. W przypadku alarmów stosuję proste, ale solidne reguły:
grupy:
- nazwa: node_basic
reguły:
- alert: NodeDown
wyrażenie: up{job="node"} == 0
okres: 5m
etykiety: {poważność: krytyczna}
- alert: HighCPU
expr: 1 - średnia według (instancja) (rate(node_cpu_seconds_total{mode="idle"}[5m])) > 0,9
for: 10m
labels: {severity: warning}
Do monitorowania obciążenia używam czas_skrobania_w_sekundach oraz scrape_samples_scraped na każdy cel. W ten sposób mogę stwierdzić, czy dodatkowo aktywowany kolektor nieproporcjonalnie wydłuża czas odbioru lub zwiększa liczbę seryjną.
Działanie w kontenerach i Kubernetes
Uruchamiam Node Exporter w kontenerach blisko serwera, aby /proc oraz /sys pozostać widoczne z poziomu hosta. W tym celu montuję te ścieżki w kontenerze jako tylko do odczytu i korzystam z hostNetwork w celu zapewnienia spójności portów. W Kubernetes uruchamiam eksporter jako DaemonSet na każdym węźle i stosuję restrykcyjne konteksty bezpieczeństwa (bez zbędnych uprawnień). Przy wyborze kolektora biorę pod uwagę środowiska cgroup-v2; ważne kolektory, takie jak meminfo, ciśnienie, system plików oraz procesor pozostają podstawą. Po wdrożeniu sprawdzam to za pomocą bezpośredniego zwijać się w stosunku do Podu, czy oczekiwane ścieżki metryk hosta są rzeczywiście odczytywane.
Rozwiązywanie problemów i zapewnianie jakości
- Łączność: Sprawdzam
curl -s http://localhost:9100/metrics | headna hoście docelowym oraz, z punktu widzenia Prometheusa, dostępność poprzez otwarty port. - Test kolekcjonerski: O
collect[]testowałem poszczególne kolektory bez zmiany globalnej konfiguracji. - Dzienniki: Tymczasowo podnoszę poziom logowania (
--log.level=debug), aby zgłosić błędy parsowania lub problemy z uprawnieniami do/proc//syswidoczne. - Kontrola wersji: Za pomocą
node_exporter_build_infoporównuję wersje i celowo planuję aktualizacje. - Seriale w skrócie: wskaźniki
scrape_samples_scraped{job="node"}Wykorzystuję to jako przybliżoną wartość liczby seryjnej na każdy host. Skok w górę wskazuje na nowe kolektory lub eksplozję etykiet. - Przerwy na żądanie: Uważam, że
scrape_timeoutponiżejscrape_intervali obserwujęscrape_timeout_seconds, aby na czas wykrywać wąskie gardła.
Pojemność i przechowywanie: planowanie zamiast niespodzianek
Przechowywanie danych w Prometheusie dostosowuję do konkretnych przypadków użycia: krótkie interwały dla systemów kluczowych, dłuższe przechowywanie dla trendów. Gdy flota się powiększa, skaluję system horyzontalnie poprzez sharding (np. według lokalizacji lub zespołu) i oddzielam obciążenie związane z zapytaniami od obciążenia związanego z pozyskiwaniem danych. W razie potrzeby zapisuję metryki dodatkowo w komponencie długoterminowym za pomocą funkcji Remote-Write. Aktywnie monitoruję kardynalność i konsekwentnie usuwam nieużywane metryki lub etykiety – szczególnie w przypadku metryk z plików tekstowych, które mogą szybko się rozrastać.
Praktyczne wskazówki dotyczące flot o zróżnicowanym składzie
- Hosty obsługujące wyłącznie IPv6: Słucham
[::]:9100oraz zadbaj o odpowiednie reguły zapory sieciowej. - Sprzęt specjalistyczny: Aktywuję kolektory specyficzne dla danego sprzętu tylko tam, gdzie ma to sens, i dokumentuję różnice w profilach ról.
- Aktualizacje stopniowe: aktualizuję partiami i przy tym obserwuję
w górę,czas_skrobania_w_sekundachorazscrape_samples_scraped, aby natychmiast wykrywać regresje. - Dokumentacja: Zapisuję rzeczywiste parametry startowe dla każdej roli. Pozwala to uniknąć dyskusji i ułatwia analizę błędów.
Krótkie podsumowanie: mój harmonogram wizyt w gabinecie
Instaluję Węzeł Eksporter jako osobną usługę systemd – ustalam port i adres nasłuchowy oraz ściśle ograniczam dostęp. Świadomie wybieram kolektor, uzupełniam niezbędne wartości za pomocą pliku tekstowego kolektora i ograniczam liczbę metryk. W Prometheusie ustawiam sensowne interwały, zarządzam etykietami, definiuję reguły rejestrowania oraz alarmy dla procesora, pamięci RAM, dysków i sieci. Samodzielnie monitoruję eksporter, planuję aktualizacje i regularnie sprawdzam liczbę serii na każdym hoście. Dzięki przejrzystej wizualizacji reaguję szybciej, wcześnie rozpoznaję trendy i zapewniam niezawodne monitorowanie moich serwerów Linux na co dzień.


