ลดความยุ่งยากในการใช้คลาวด์ พูดคุยกับเจ้าหน้าที่

เก็บเมตริกเซิร์ฟเวอร์ด้วย Prometheus และ Node Exporter
Home เก็บเมตริกเซิร์ฟเวอร์ด้วย Prometheus และ Node Exporter

เก็บเมตริกเซิร์ฟเวอร์ด้วย Prometheus และ Node Exporter

Prometheus เป็นมาตรฐานที่ใช้กันแพร่หลายที่สุดสำหรับการเก็บเมตริกของเซิร์ฟเวอร์ จุดแข็งคือรูปแบบข้อมูลที่ค้นย้อนหลังได้ด้วยภาษา PromQL และระบบแจ้งเตือนที่เขียนเงื่อนไขซับซ้อนได้ ต่างจากระบบที่ดูได้อย่างเดียว

คู่มือนี้ติดตั้งสองส่วน คือ Node Exporter ที่ติดบนทุกเครื่องที่ต้องการวัดผล และ Prometheus ที่ทำหน้าที่ดึงข้อมูลมาเก็บ จากนั้นเขียนกฎแจ้งเตือนพื้นฐานที่ควรมีทุกระบบ

สิ่งที่ต้องเตรียม

  • เซิร์ฟเวอร์อย่างน้อยหนึ่งเครื่องสำหรับรัน Prometheus และเครื่องที่ต้องการเฝ้าดู
  • สิทธิ์ sudo และเครือข่ายภายในที่เครื่อง Prometheus เข้าถึงเครื่องอื่นได้
  • พื้นที่ดิสก์สำหรับเก็บข้อมูล ประมาณ 2-3 GB ต่อเครื่องต่อเดือนที่ความถี่ 15 วินาที

ขั้นตอนที่ 1: ติดตั้ง Node Exporter บนเครื่องที่ต้องการวัด

cd /tmp
curl -LO https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz
tar xzf node_exporter-1.8.2.linux-amd64.tar.gz
sudo mv node_exporter-1.8.2.linux-amd64/node_exporter /usr/local/bin/
sudo useradd --no-create-home --shell /usr/sbin/nologin node_exporter

สร้าง service

sudo nano /etc/systemd/system/node_exporter.service
[Unit]
Description=Prometheus Node Exporter
After=network-online.target

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter \
  --web.listen-address=10.0.0.11:9100 \
  --collector.systemd \
  --collector.processes
Restart=on-failure

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter
curl -s http://10.0.0.11:9100/metrics | head -20

ระบุ IP ภายในใน --web.listen-address เสมอ อย่าปล่อยให้ฟังทุกการ์ดเครือข่าย เพราะหน้านี้เปิดเผยข้อมูลของเครื่องโดยไม่มีการยืนยันตัวตน

ปิดกั้นเพิ่มด้วย Firewall ให้เข้าได้เฉพาะจากเครื่อง Prometheus

sudo ufw allow from 10.0.0.5 to any port 9100 proto tcp

ขั้นตอนที่ 2: ติดตั้ง Prometheus

cd /tmp
curl -LO https://github.com/prometheus/prometheus/releases/download/v2.53.1/prometheus-2.53.1.linux-amd64.tar.gz
tar xzf prometheus-2.53.1.linux-amd64.tar.gz
cd prometheus-2.53.1.linux-amd64

sudo useradd --no-create-home --shell /usr/sbin/nologin prometheus
sudo mkdir -p /etc/prometheus /var/lib/prometheus
sudo cp prometheus promtool /usr/local/bin/
sudo cp -r consoles console_libraries /etc/prometheus/
sudo chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus

ขั้นตอนที่ 3: ตั้งค่าว่าจะดึงข้อมูลจากที่ไหน

sudo nano /etc/prometheus/prometheus.yml
global:
  scrape_interval: 15s
  evaluation_interval: 15s

rule_files:
  - /etc/prometheus/rules/*.yml

scrape_configs:
  - job_name: prometheus
    static_configs:
      - targets: ['127.0.0.1:9090']

  - job_name: node
    static_configs:
      - targets:
          - '10.0.0.11:9100'
          - '10.0.0.12:9100'
        labels:
          env: production
      - targets:
          - '10.0.0.21:9100'
        labels:
          env: staging

ตรวจไวยากรณ์ก่อนเสมอ

promtool check config /etc/prometheus/prometheus.yml

ขั้นตอนที่ 4: สร้าง service ของ Prometheus

sudo nano /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus
After=network-online.target

[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus \
  --config.file=/etc/prometheus/prometheus.yml \
  --storage.tsdb.path=/var/lib/prometheus/ \
  --storage.tsdb.retention.time=90d \
  --web.listen-address=127.0.0.1:9090
Restart=on-failure

[Install]
WantedBy=multi-user.target
sudo mkdir -p /etc/prometheus/rules
sudo systemctl daemon-reload
sudo systemctl enable --now prometheus
sudo systemctl status prometheus --no-pager

เข้าหน้าเว็บผ่าน SSH Tunnel

ssh -L 9090:127.0.0.1:9090 [email protected] -N

เปิด http://127.0.0.1:9090/targets ทุกเป้าหมายควรขึ้นสถานะ UP

ขั้นตอนที่ 5: คำสั่ง PromQL ที่ใช้บ่อย

ลองพิมพ์ในช่องค้นหาของหน้าเว็บ

# การใช้งาน CPU เป็นเปอร์เซ็นต์
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# หน่วยความจำที่ใช้ไปเป็นเปอร์เซ็นต์
100 * (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)

# พื้นที่ดิสก์ที่เหลือเป็นเปอร์เซ็นต์
100 * node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}

# ทราฟฟิกขาเข้าเป็น Mbps
rate(node_network_receive_bytes_total{device!="lo"}[5m]) * 8 / 1000000

# เวลาที่เครื่องทำงานต่อเนื่อง
(time() - node_boot_time_seconds) / 86400

จุดที่ต้องเข้าใจคือ rate() ใช้กับตัวนับที่เพิ่มขึ้นเรื่อย ๆ เท่านั้น ไม่ใช้กับค่าที่ขึ้นลงได้ เช่น หน่วยความจำ

ขั้นตอนที่ 6: เขียนกฎแจ้งเตือนพื้นฐาน

sudo nano /etc/prometheus/rules/node.yml
groups:
  - name: node
    rules:
      - alert: InstanceDown
        expr: up{job="node"} == 0
        for: 3m
        labels:
          severity: critical
        annotations:
          summary: "เครื่อง {{ $labels.instance }} ไม่ตอบสนอง"

      - alert: DiskWillFillIn24Hours
        expr: predict_linear(node_filesystem_avail_bytes{mountpoint="/"}[6h], 24*3600) < 0
        for: 30m
        labels:
          severity: warning
        annotations:
          summary: "ดิสก์ของ {{ $labels.instance }} จะเต็มภายใน 24 ชั่วโมง"

      - alert: HighMemoryUsage
        expr: 100 * (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) > 90
        for: 10m
        labels:
          severity: warning
        annotations:
          summary: "หน่วยความจำของ {{ $labels.instance }} เกิน 90%"
promtool check rules /etc/prometheus/rules/node.yml
sudo systemctl reload prometheus

กฎ predict_linear คือสิ่งที่ระบบเฝ้าดูแบบเดิมทำไม่ได้ มันคาดการณ์จากแนวโน้ม 6 ชั่วโมงที่ผ่านมาว่าอีก 24 ชั่วโมงดิสก์จะเต็มหรือไม่ ทำให้มีเวลาแก้ก่อนเกิดปัญหาจริง

ขั้นตอนที่ 7: ต่อกับ Grafana

Prometheus แสดงกราฟได้พื้นฐานเท่านั้น สำหรับ Dashboard ที่ดูจริงจังให้ต่อกับ Grafana แล้วนำเข้า Dashboard สำเร็จรูปหมายเลข 1860 ซึ่งออกแบบมาสำหรับ Node Exporter โดยเฉพาะ ดูขั้นตอนได้ในคู่มือเรื่องการติดตั้ง Grafana

ปัญหาที่พบบ่อย

เป้าหมายขึ้นสถานะ DOWN พร้อมข้อความ connection refused

ตรวจว่า Node Exporter ฟังที่ IP ที่เข้าถึงได้จริงด้วย sudo ss -tlnp | grep 9100 และตรวจ Firewall ทั้งสองฝั่ง

ข้อมูลหายเป็นช่วง

มักเกิดจาก Prometheus ดึงข้อมูลไม่ทันเพราะเป้าหมายตอบช้า เพิ่ม scrape_timeout หรือลดความถี่ลง และดูที่หน้า Targets ว่าค่า Last Scrape Duration สูงผิดปกติหรือไม่

ดิสก์เต็มเพราะข้อมูลเมตริก

ลด --storage.tsdb.retention.time ลง หรือกำหนดเพดานด้วย --storage.tsdb.retention.size=50GB ตรวจขนาดจริงด้วย sudo du -sh /var/lib/prometheus

Query ช้ามากเมื่อเลือกช่วงเวลากว้าง

หลีกเลี่ยงการใช้ rate() กับช่วงสั้นบนข้อมูลย้อนหลังหลายเดือน ใช้ Recording Rule สร้างเมตริกที่คำนวณไว้ล่วงหน้าแทน

ต้องการวางระบบเฝ้าระวังแบบครบวงจรพร้อมทีมดูแล ติดต่อ THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/

ผู้ให้บริการคลาวด์ไทย
เพื่อธุรกิจของคนไทย

"มุ่งมั่น" และ "มั่นคง"
พร้อมรับมือทุกการเติบโต
Trust Cloud
คลาว์ที่ปลอดภัย
คือรากฐานที่มั่นคง
cloud security