ติดตั้ง Node Exporter เก็บ Metrics VPS สำหรับ Prometheus
Node Exporter คือ monitoring agent ง่าย ๆ ที่ รวบรวม metrics ของ VPS (CPU, RAM, Disk, Network, etc.) เสมือนระบบการเงิน — ติดตั้งแล้วใจเย็น ตัวมันเองจะส่งข้อมูลไป Prometheus ต่อเนื่อง แล้วจากนั้น Prometheus เก็บข้อมูลเหล่านั้นไว้ Grafana นำมาวาด dashboard สวยๆ และ Alert Manager ตั้ง alert ให้แจ้งตอน VPS มี ปัญหา ต่างจาก Netdata (ทั้งหมดในกล่อง) Node Exporter ยืดหยุ่นกว่า คุณเลือกได้ว่า metrics ไหนส่ง ไหนไม่ส่ง และช่องโหว่ด้านความปลอดภัยน้อยกว่าเพราะมันเก็บแค่ metrics ไม่มี dashboard ในตัว บทความนี้สอน install Node Exporter ด้วย systemd พร้อมเก็บ logs จัดการ auto-restart และคำสั่ง debug ครบครัน
ทำความเข้าใจสถาปัตยกรรม Prometheus Stack
- Node Exporter: agent ติดตั้งบน VPS รวบรวม CPU, RAM, Disk, Network, Load Average
- Prometheus: central server ดึง (pull) metrics จาก Node Exporter ทุก 15 วินาที (default) เก็บเป็น time series
- Grafana: dashboard visualize ข้อมูลจาก Prometheus ร้องขอ (query) ปรับให้สวยงามได้
- AlertManager: ส่ง alert ไป Email/Slack/Telegram/Line เมื่อเงื่อนไข Prometheus แตะ
- Node Exporter Metrics: แต่ละ metric มีชื่อเช่น
node_cpu_seconds_total,node_memory_MemFree_bytes,node_disk_io_reads_completed_total
ติดตั้ง Node Exporter บน Linux
# ดาวน์โหลด Node Exporter เวอร์ชันล่าสุด
wget https://github.com/prometheus/node_exporter/releases/download/v1.8.1/node_exporter-1.8.1.linux-amd64.tar.gz
# แตกไฟล์
tar xzvf node_exporter-1.8.1.linux-amd64.tar.gz
cd node_exporter-1.8.1.linux-amd64
# คัดลอก binary ไป /usr/local/bin
sudo cp node_exporter /usr/local/bin/
sudo chmod +x /usr/local/bin/node_exporter
# ตรวจสอบเวอร์ชัน
node_exporter --version
สร้าง Systemd Service สำหรับ Node Exporter
# สร้าง systemd unit file
sudo nano /etc/systemd/system/node_exporter.service
# ใส่เนื้อหาต่อไปนี้:
[Unit]
Description=Prometheus Node Exporter
After=network.target
[Service]
Type=simple
User=node_exporter
Group=node_exporter
WorkingDirectory=/var/lib/node_exporter
ExecStart=/usr/local/bin/node_exporter \
--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/) \
--collector.netdev.device-exclude=^(veth.*)$
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
# บันทึกไฟล์ (Ctrl+O, Enter, Ctrl+X)
สร้าง User สำหรับ Node Exporter
# สร้าง user ไม่มี shell (security best practice)
sudo useradd --no-create-home --shell /bin/false node_exporter
# สร้าง working directory
sudo mkdir -p /var/lib/node_exporter
sudo chown -R node_exporter:node_exporter /var/lib/node_exporter
# Reload systemd daemon
sudo systemctl daemon-reload
# Enable Node Exporter ให้เริ่มตัวเองเมื่อ reboot
sudo systemctl enable node_exporter
# Start service
sudo systemctl start node_exporter
# ตรวจสอบสถานะ
sudo systemctl status node_exporter
ตั้ง Firewall และ Reverse Proxy
# Node Exporter ทำงานบน port 9100 (default) ต้องเปิด firewall
# ถ้าใช้ UFW:
sudo ufw allow 9100/tcp
# ตั้ง Nginx reverse proxy (ถ้าจำเป็นต้องเข้าจากข้างนอก):
sudo nano /etc/nginx/sites-available/metrics
server {
listen 443 ssl;
server_name metrics.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/metrics.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/metrics.yourdomain.com/privkey.pem;
auth_basic "Metrics";
auth_basic_user_file /etc/nginx/.htpasswd;
location / {
proxy_pass http://127.0.0.1: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;
}
}
# สร้างไฟล์ .htpasswd สำหรับ basic auth:
sudo apt-get install apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd prometheus
# ใส่รหัสผ่าน
# ทดสอบ config
sudo nginx -t
# Reload Nginx
sudo systemctl reload nginx
ตั้งค่า Prometheus ให้ดึง Metrics จาก Node Exporter
# แก้ไข prometheus.yml ที่ Prometheus server
sudo nano /etc/prometheus/prometheus.yml
# เพิ่ม job_name สำหรับ Node Exporter:
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node'
static_configs:
- targets: ['localhost:9100'] # ถ้า Node Exporter บน server เดียวกัน
labels:
instance: 'my-vps-prod'
# หรือเพิ่ม node ระยะไกลได้:
- targets: ['192.168.1.50:9100']
labels:
instance: 'vps-staging'
- targets: ['https://metrics.yourdomain.com:443']
scheme: https
basic_auth:
username: prometheus
password: 'YOUR_PASSWORD'
labels:
instance: 'vps-remote'
# Reload Prometheus:
sudo systemctl reload prometheus
# ตรวจสอบ Prometheus UI ที่ http://localhost:9090
# ไปที่ Status → Targets ดู VPS ที่เก็บมา
Query Metrics บน Prometheus
# เปิด Prometheus UI ที่ http://localhost:9090/graph
# Query CPU usage (percentage)
100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# Memory free (GB)
node_memory_MemFree_bytes / (1024^3)
# Memory used (percentage)
100 - ((node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes) / node_memory_MemTotal_bytes * 100)
# Disk usage (percentage)
100 - (node_filesystem_avail_bytes{fstype!~"tmpfs|fuse.lxcfs|squashfs"} / node_filesystem_size_bytes{fstype!~"tmpfs|fuse.lxcfs|squashfs"} * 100)
# Load average
node_load1
# Network traffic (bytes/sec)
rate(node_network_transmit_bytes_total{instance="my-vps-prod"}[5m])
ตรวจสอบว่า Node Exporter ทำงานถูกต้อง
# ตรวจสอบ service กำลังทำงาน
systemctl status node_exporter
# ดู logs ล่าสุด
sudo journalctl -u node_exporter -f
# ทดสอบ endpoint metrics ด้วย curl
curl http://localhost:9100/metrics | head -30
# ตรวจสอบ metrics จำเพาะ:
curl -s http://localhost:9100/metrics | grep node_cpu_seconds_total
# ตรวจสอบหลังการเปลี่ยน config
sudo systemctl restart node_exporter && sleep 2 && curl -s http://localhost:9100/metrics | grep -c "^node_"
telnet VPS_IP 9100 ต้องเชื่อมต่อได้ จากนั้นรอสัก 30-45 วินาที Prometheus จะ scrape ใหม่แก้ปัญหาที่พบบ่อย
Error: "connection refused" เมื่อ Prometheus ดึง metrics
Node Exporter ยังไม่เริ่มตัวหรือ port 9100 ถูกปิด firewall หรือ host ผิด — ตรวจสอบ Prometheus config ว่าระบุ target ถูกต้อง
# ตรวจสอบ Node Exporter ทำงาน
sudo systemctl status node_exporter
# ตรวจสอบ port ฟังอยู่
sudo netstat -tlnp | grep 9100
# ต้องเห็น node_exporter กำลังฟัง 0.0.0.0:9100 หรือ 127.0.0.1:9100
# ถ้าไม่ทำงาน restart:
sudo systemctl restart node_exporter
# เปิด firewall:
sudo ufw allow 9100/tcp
# ตรวจสอบสื่อสาร Prometheus → Node Exporter:
telnet PROMETHEUS_SERVER VPS_IP 9100
Metrics บ่อยครั้งเป็น "NaN" หรือ "stale"
Node Exporter มีข้อมูล แต่ Prometheus ไม่สามารถ scrape ได้ต่อเนื่อง — มักเกิดจาก network ไม่เสถียร timeout ของ Prometheus สั้นเกินไป หรือ VPS response ช้า
# เพิ่ม timeout ใน prometheus.yml:
scrape_configs:
- job_name: 'node'
scrape_timeout: 30s # ค่า default 10s อาจสั้น
scrape_interval: 30s
static_configs:
- targets: ['VPS_IP:9100']
# restart Prometheus:
sudo systemctl restart prometheus
# ตรวจสอบจำนวน metrics จากอาจเกินความจำ:
curl -s http://VPS_IP:9100/metrics | wc -l
# ถ้ามากกว่า 5000 metrics ลดจำนวน collectors (ตัวสุดท้าย)
Node Exporter กินความจำสูงเกินไป
Collectors บางตัว (เช่น filesystem, textfile) อาจสแกน files เยอะ — ปิด collector ที่ไม่ต้องการ
# แก้ไข /etc/systemd/system/node_exporter.service:
ExecStart=/usr/local/bin/node_exporter \
--no-collector.arp \
--no-collector.edac \
--no-collector.ipvs \
--collector.netdev.device-exclude=docker|veth
# reload:
sudo systemctl daemon-reload
sudo systemctl restart node_exporter
Certificate error เมื่อใช้ HTTPS reverse proxy
Prometheus config ไม่ตรวจสอบ certificate หรือ certificate ไม่ถูกต้อง
# ใน prometheus.yml:
scrape_configs:
- job_name: 'node'
scheme: https
tls_config:
insecure_skip_verify: true # ใช้เฉพาะ dev/staging (ห้าม prod)
basic_auth:
username: prometheus
password: 'PASSWORD'
static_configs:
- targets: ['metrics.yourdomain.com:443']
คำถามที่พบบ่อย
Node Exporter ต่างจาก cAdvisor ยังไง?
Node Exporter รวบรวม metrics ของตัว OS (system-level) — CPU, RAM, Disk, Process ทั่วไป ส่วน cAdvisor เฉพาะ Docker container metrics (memory/cpu ของ container นั้นๆ) ถ้า VPS รัน Docker ต้องใช้ทั้งคู่ — Node Exporter สำหรับ host metrics cAdvisor สำหรับ container metrics
จำเป็นต้องบ่อม TLS/HTTPS สำหรับ Node Exporter ไหม?
ถ้า Node Exporter และ Prometheus รันบน server เดียวกันหรือ private network ไม่จำเป็น แต่ถ้า metrics มีข้อมูลไม่สาธารณะ (เช่น IP address, hostname) หรือเก็บผ่าน internet ต้องบ่อม TLS + basic auth ไว้ ข้างบนมีตัวอย่างอยู่แล้ว
ขอ metrics ได้นานเท่าไหร่?
Prometheus เก็บข้อมูล time-series เท่าที่ disk ให้ได้ — ค่า retention policy default 15 วัน (สามารถแก้ได้ใน prometheus.yml ด้วย retention flag) Node Exporter เก็บเพียงแค่ counter ปัจจุบัน ไม่มี historical data ของตัวเอง Prometheus เป็นตัวเก็บ historical ทั้งหมด