มา monitor docker ด้วย grafana กัน
30 November 2024
#บันทึกกันลืม
การจะ monitor docker ด้วย grafana เพื่อจะได้มี dashboard และสามารถแจ้ง alert เวลามีปัญหาขึ้นได้
โดยจะมีขั้นตอนที่ต้องทำอยู่ 4 ขั้นตอน คือ
- แก้ไข config ของ docker ให้สามารถดึงค่า metric ออกมาได้
- ติดตั้ง และ config node-exporter ให้ไปดึงค่ามาจาก docker metric
- ติดตั้ง และ config prometheus ให้ไปดึงค่ามาจาก node exporter
- ติดตั้ง และ config grafana ให้ไปอ่านข้อมูลจาก prometheus
ขั้นตอนแรก
ให้ทำการ config docker เพื่อให้คนอื่นสามารถมาดึงข้อมูล metric ออกไปดูได้ โดยให้แก้ไข file “/etc/docker/daemon.json” ตามนี้ (ถ้าไม่มี file นี้ก็ให้สร้างใหม่ได้เลย)
{
"metrics-addr": "0.0.0.0:9323",
"experimental": true
}
เสร็จแล้วให้ทำการ restart docker โดยใช้คำสั่ง
sudo systemctl restart docker
จากนั้นให้ลองทดสอบเรียกข้อมูล metric ของ docker ออกมาดูโดยใช้คำสั่ง
curl localhost:9323/metrics
ถ้าทุกอย่างถูกต้องเราได้จะ output ออกมาประมาณนี้ ซึ่งเป็นข้อมูลที่ตัว node exporter จะมาเรียกใช้อีกที
ขั้นตอนที่สอง
ที่เครื่อง docker host ให้ทำการติดตั้ง และ config node-exporter ให้ไปดึงค่ามาจาก docker metric โดยให้สร้าง file “docker-compose.yml” ตามนี้
services:
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
ports:
- "9100:9100"
เสร็จแล้วให้ทำการ start service ของ node-exporter โดยใช้คำสั่ง
docker-compose up -d
หลังจาก node-exporter start ขึ้นมาเรียบร้อยแล้วให้ทดสอบด้วยคำสั่ง
curl localhost:9100/metrics
จะได้ output ออกมาหน้าตาประมาณนี้
ขั้นตอนที่สาม
ขั้นตอนนี้จะทำที่เครื่องที่ทำหน้าที่เป็น prometheus server หากเป็นเครื่องเดียวกันกับ node-exporter ก็ให้แก้ไขที่ file “docker-compose.yml” ตัวเดียวกันได้เลย แต่เพื่อให้สามารถรองรับ docker host ได้หลาย ๆ ตัวในอนาคตเลยแยกเครื่องที่ทำหน้าที่เป็น prometheus ออกมาต่างหาก โดยใน file “docker-compose.yml” ให้ใส่ตามนี้
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"
command:
- '--config.file=/etc/prometheus/prometheus.yml'
จากนั้นให้สร้าง file “prometheus.yml” โดยให้ใส่ตามนี้
global:
scrape_interval: 15s # ตั้งค่า interval สำหรับการดึง metrics
scrape_configs:
- job_name: "node-exporter"
static_configs:
- targets: ["<ip ของเครื่อง node-exporter>:9100"] # ชี้ไปที่ node-exporter
- job_name: "docker"
static_configs:
- targets: ["<ip ของเครื่อง docker host>:9323"] # Metrics จาก Docker
ทำการ start prometheus ด้วยคำสั่ง
docker-compose up -d
เมื่อ start เสร็จแล้ว ให้ลองเปิด internet browser เข้าไปที่เครื่อง prometheus server ตามด้วย port 9090 จะขึ้นตามภาพนี้
ให้ลองเลือกไปที่ status > Target health
จะเห็นว่า prometheus สามารถคุยกับเครื่อง docker host ได้แล้ว
ขั้นตอนสุดท้าย
ให้ติดตั้ง grafana โดยเราสามารถแยกเครื่องที่ทำหน้าที่เป็น grafana server แยกต่างหากได้ แต่ใน blog นี้เราจะติดตั้ง grafana ไว้ที่เครื่องเดียวกันกับ prometheus server โดยให้ทำการแก้ไข file docker-compose.yml ตามนี้
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"
command:
- '--config.file=/etc/prometheus/prometheus.yml'
grafana:
image: grafana/grafana:latest
container_name: grafana
ports:
- "3000:3000"
volumes:
- grafana-data:/var/lib/grafana
environment:
- GF_SECURITY_ADMIN_USER=admin # ตั้ง username
- GF_SECURITY_ADMIN_PASSWORD=admin # ตั้ง password
volumes:
grafana-data:
จากนั้นให้ทำการ stop และ start ใหม่โดยให้คำสั่ง
docker-compose down
แล้ว start ใหม่
docker-compose up -d
ก็จะได้ service grafana start ขึ้นมาด้วย
ด้วย config นี้ grafana จะให้บริการอยู่ที่ port “3000” และมี user ชื่อ “admin” password เป็น “admin”
จากนั้นให้เปิด internet browser แล้วเรียกไปที่ grafana server
http://<ip ของ grafana server>:3000"
จะได้หน้า login ของ grafana ขึ้นมา
ให้ใส่ user/password (admin/admin) เข้าไป
เมื่อ login ผ่านแล้ว grafana จะให้เปลี่ยน password ใหม่ ซึ่งถ้าเราไม่เปลี่ยนก็สามารถกดปุ่ม skip เพื่อข้ามไปได้
ถึงตอนนี้ grafana server เราก็พร้อมให้บริการแล้ว
ยัง ๆ ๆ ยังไม่เสร็จ เราต้องการให้ grafana ไปอ่านค่าจาก docker host ของเราโดยเรียกผ่านจากตัว prometheus ดังนั้น ให้เราทำการเพิ่ม data source ที่
Connections > Data sources
กดปุ่ม Add data source
จะเห็นว่าตัว grafana เองรองรับ data source ได้หลายประเภทเลย ตอนนี้ให้เราเลือก prometheus
ตรง Connection ให้เราใส่ url ของเครื่อง prometheus server เข้าไป อย่าลืมใส่ port 9090 ด้วย
เสร็จแล้วให้กดปุ่ม Save & test
ถ้าไม่มีปัญหาเราจะได้ข้อความ Successfully ขึ้นมาตามภาพ
คราวนี้ลองมาดูว่า grafana สามารถอ่านข้อมูลจาก prometheus ได้หรือไม่ โดยให้เลือก menu “Explorer” ในช่อง metric ให้เลือกเป็นค่า “engine_daemon_container_states_containers” แล้วกดปุ่ม Run query (จริง ๆ เมื่อเราเห็น list ในช่อง metric ก็รู้แล้วว่า grafana อ่านค่ามาจาก prometheus ได้แล้ว)
จะได้ output ดังนี้
จะเห็นว่ามีเส้นสีเหลือคือจำนวน container ที่อยู่ในสถานะ “running” มีอยู่ 1 ตัว เพราะที่ docker host เรามี container run อยู่แค่ 1 ตัว
ให้ลองทำการ run container เพิ่มให้มีหลาย ๆ ตัว หลาย ๆ สถานะดู
จากภาพจะเห็นว่าตอนนี้ที่ docker host เรามี container run อยู่ 2 ตัว และมี exited อยู่ 2 ตัว คราวนี้ลองเข้าไปดูจาก grafana อีกครั้ง
จะเห็นว่าตอนนี้ graph เปลี่ยนไปแล้ว โดยเส้นสีเหลือง คือ running อยู่ที่ 2
และสีฟ้า คือ stopped อยู่ที่ 2
ถึงตอนนี้เราก็สามารถ monitor docker ของเราด้วย grafana ได้แล้ว
ตัวอย่าง dashboard
*** เพิ่มเติม ***
มีบาง dashboard ที่เขาทำแจกกัน จะใช้ข้อมูล metric จาก cAdvisor หากว่าเราต้องการก็ให้เพิ่มเข้าไปที่ docker-compose.yml ของเครื่อง docker host ดังนี้
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
container_name: cadvisor
ports:
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /sys:/sys
- /var/lib/docker:/var/lib/docker
และที่เครื่อง prometheus server ให้แก้ไข file prometheus.yml ดังนี้
- job_name: "cadvisor"
static_configs:
- targets: ["<ip ของเครื่อง cAdvisor>:8080"]