Hướng dẫn cài đặt Prometheus bằng cách sử dụng Docker trên Ubuntu 14.04

1 năm trước

Một bài viết từ người đồng sáng lập Prometheus Julius Volz

 

Giới thiệu

Prometheus là một hệ thống giám sát nguồn mở và CSDL chuỗi thời gian. Nó giải quyết nhiều khía cạnh của việc giám sát như tạo và thu thập số liệu, vẽ đồ thị dữ liệu kết quả trên trang tổng quan và cảnh báo về các bất thường. Để đạt được điều này, nó cung cấp nhiều thành phần được chạy riêng biệt nhưng được sử dụng kết hợp.

Docker cung cấp một cách để bạn đóng gói các tiến trình server bằng cách sử dụng các Linux container (hoặc các công nghệ đóng gói khác) để chúng được quản lý và tách biệt dễ dàng hơn với nhau.

Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách cài đặt ba thành phần chính để sử dụng Prometheus trên Docker. Đó là:

  • Prometheus server để thu thập số liệu và truy vấn chúng 
  • Node Exporter để xuất chỉ số hệ thống theo định dạng tương thích với Prometheus
  • Grafana, một trình xây dựng bảng điều khiển đồ họa dựa trên web hỗ trợ Prometheus trong số các chương trình phụ trợ khác

Có nhiều thành phần khác trong hệ sinh thái Prometheus, nhưng ba phần này cung cấp khởi đầu tốt cho việc sử dụng Prometheus.

 

Điều kiện tiên quyết

Để làm theo hướng dẫn, bạn cần:

  • Ubuntu 14.04 VPS
  • User có quyền truy cập sudo 
  • Docker được cài đặt (tham khảo tại vicloud.vn)

Note: Bài viết này đã được thử nghiệm trên 1 CPU/512 MB RAM Ubuntu 14.04 VPS. Cấu hình  Prometheus nên được điều chỉnh cho các nguồn tài nguyên sẵn có khác nhau như đã nêu trong Bước 1 của bài viết này. 

 

Bước 1 — Cài đặt Prometheus

Phần này sẽ giải thích cách cài đặt Prometheus server chính bằng Docker. Đảm bảo cài đặt Docker trên phần Điều kiện tiên quyết trước khi tiếp tục. Prometheus server là phần trung tâm của hệ sinh thái Prometheus chịu trách nhiệm thu thập và lưu trữ các số liệu cũng như xử lý truy vấn biểu thức và tạo ra các cảnh báo.

Hình ảnh Docker container cho các thành phần Prometheus được lưu trữ trong tổ chức prom trên Docker Hub. Việc chạy hình ảnh Docker prom/prometheus không có bất kỳ tùy chọn nào khác bắt đầu Prometheus server với một tệp cấu hình ví dụ có tại /etc/prometheus/prometheus.yml bên trong container. Nó cũng sử dụng Docker data volume được gắn tại /prometheus trong container để lưu trữ dữ liệu số liệu đã thu thập. Thư mục data volume này thực sự là một thư mục trên máy chủ mà Docker tự động tạo khi container được bắt đầu lần đầu tiên. Dữ liệu bên trong nó được duy trì giữa các lần khởi động lại cùng một container.

Có nhiều cách để ghi đè tệp cấu hình mặc định. Ví dụ, một tệp cấu hình tùy chỉnh có thể được chuyển vào container từ hệ thống tệp lưu trữ dưới dạng Docker data volume hoặc có thể chọn tạo Docker container có nguồn gốc với tệp cấu hình của riêng bạn được đưa vào hình ảnh container. Trong hướng dẫn này, chúng ta sẽ chọn truyền vào một tệp cấu hình từ hệ thống máy chủ.

Có nhiều mẫu khác nhau để tổ chức lưu trữ số liệu. Trong hướng dẫn này, chúng ta sử dụng hành vi mặc định của hình ảnh Docker bằng Docker data volume để lưu trữ các số liệu. Bạn có thể xem xét cách tạo một data volume container nếu phù hợp hơn với nhu cầu của bạn.

Đầu tiên, tạo một tệp cấu hình Prometheus tối thiểu trên hệ thống tệp máy chủ tại ~/prometheus.yml:

nano ~/prometheus.yml 

Thêm các nội dung sau vào tệp (thay thế your_server_ip bằng địa chỉ IP của VPS):

~/prometheus.yml
# A scrape configuration scraping a Node Exporter and the Prometheus server
# itself.
scrape_configs:
# Scrape Prometheus itself every 5 seconds.
- job_name: 'prometheus'
scrape_interval: 5s
target_groups:
- targets: ['localhost:9090']
# Scrape the Node Exporter every 5 seconds.
- job_name: 'node'
scrape_interval: 5s
target_groups:
- targets: ['your_server_ip:9100']

Cấu hình ví dụ này làm cho các số liệu của Prometheus tự xoá (vì Prometheus cũng đưa ra các chỉ số về chính nó trong một định dạng tương thích với Prometheus) cũng như từ một Node Exporter sẽ thiết lập sau này. Trong khi Prometheus có thể kết nối với chính nó trong container bằng tên máy chủ  localhost, sẽ phải cạo Node Exporter bằng IP ngoài của server vì Node Exporter chạy trong một container riêng biệt với không gian tên mạng riêng biệt.

Bắt đầu Prometheus Docker container với tệp cấu hình bên ngoài:

docker run -d -p 9090:9090 -v ~/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus -config.file=/etc/prometheus/prometheus.yml -storage.local.path=/prometheus -storage.local.memory-chunks=10000 

Lần đầu tiên chạy lệnh này, nó sẽ kéo hình ảnh Docker từ Docker Hub.

Lệnh này khá dài và chứa nhiều tùy chọn dòng lệnh. Hãy xem xét chi tiết hơn:

  • Tùy chọn -d bắt đầu Prometheus container ở chế độ tách rời, có nghĩa là container được bắt đầu ở nền và không bị xóa bỏ bằng cách nhấn CTRL+C.
  • Tùy chọn -p 9090:9090 cho thấy cổng web của Prometheus (9090) và cho phép nó truy cập được thông qua địa chỉ IP bên ngoài của hệ thống máy chủ.
  • Tùy chọn -v [...] gắn kết tệp cấu hình prometheus.yml từ hệ thống tệp máy chủ vào vị trí bên trong container nơi Prometheus chờ nó (/etc/prometheus/prometheus.yml).
  • Tùy chọn -config.file được đặt phù hợp với vị trí của tệp cấu hình Prometheus trong container.
  • Tùy chọn -storage.local.path định cấu hình vị trí lưu trữ chỉ số trong container.
  • Cuối cùng, tùy chọn -storage.local.memory-chunks điều chỉnh mức độ sử dụng bộ nhớ của Prometheus với lượng RAM rất nhỏ (chỉ 512MB) và số lượng chuỗi thời gian lưu trữ nhỏ trong hướng dẫn này (chỉ dưới 1000). Nó chỉ thị cho Prometheus chỉ giữ được 10000 khối mẫu trong bộ nhớ (khoảng 10 phần mỗi chuỗi),thay vì mặc định là 1048576. Đây là một giá trị bạn chắc chắn sẽ cần phải điều chỉnh khi chạy Prometheus trên một máy có nhiều RAM hơn và khi lưu trữ nhiều thời gian hơn. 

Bạn có thể liệt kê tất cả các Docker container đang chạy bằng cách sử dụng lệnh sau:

docker ps 

Ví dụ, bạn sẽ thấy điều tương tự như sau cho Prometheus Docker container:

Output of `docker ps`
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 
6a89ac39911e prom/prometheus "/bin/prometheus -con" 2 hours ago Up 2 hours 0.0.0.0:9090->9090/tcp stoic_pike 

Sử dụng container ID được hiển thị trong đầu ra docker ps, bạn có thể kiểm tra các bản ghi của Prometheus server đang chạy bằng lệnh:

docker logs container_id

Trong ví dụ của chúng ta, lệnh sẽ là:

docker logs 6a89ac39911e

Để tìm hiểu vị trí trên hệ thống tệp của máy chủ lưu trữ, khối lượng lưu trữ chỉ số được lưu trữ, bạn có thể chạy thông tin sau với container_id của bạn:

docker inspect container_id

Điều này sẽ xuất thông tin về cấu hình của container của bạn, bao gồm cả đường dẫn lưu trữ của bất kỳ Docker volume được gắn nào.

Tìm một phần trong đầu ra giống như sau:

Output of `docker inspect`
... 
"Mounts": [ 
  { 
  "Source": "/home/sammy/prometheus.yml",
  "Destination": "/etc/prometheus/prometheus.yml",
  "Mode": "", 
  "RW": true 
  }, 
{
  "Name": "821b0abc470a9c758ff35ed5cff69077423a629566082a605a01d8207d57cd6c", 
  "Source": "/var/lib/docker/volumes/821b0abc470a9c758ff35ed5cff69077423a629566082a605a01d8207d57cd6c/_data", 
  "Destination": "/prometheus", 
  "Driver": "local",
  "Mode": "", 
  "RW": true 
  }],
... 

Trong ví dụ này, các chỉ số được lưu trữ trong   /var/lib/docker/volumes/821b0abc470a9c758ff35ed5cff69077423a629566082a605a01d8207d57cd6c/_data trên hệ thống máy chủ. Thư mục này được tạo tự động bởi Docker khi lần đầu tiên bắt đầu Prometheus container. Nó được ánh xạ vào thư mục /prometheus trong container. Dữ liệu trong thư mục này được duy trì trong quá trình khởi động lại cùng một container. Nếu bạn thích, bạn cũng có thể gắn kết một thư mục lưu trữ hiện có để lưu trữ dữ liệu số liệu.

Bây giờ bạn có thể truy cập Prometheus server tại http://your_server_ip:9090/. Xác minh rằng nó đang thu thập số liệu về chính nó bằng cách chuyển đến http://your_server_ip:9090/status trạng thái và định vị điểm cuối http://localhost:9090/metrics cho công việc prometheus trong phần Mục tiêu. Cột trạng thái cho mục tiêu này sẽ hiển thị là HEALTHY. Ngược lại, điểm cuối  http://localhost:9100/metrics (Node Exporter) sẽ vẫn hiển thị dưới dạng UNHEALTHY vì Node Exporter chưa được bắt đầu và do đó không thể được cạo:

The Node Exporter target should be shown as UNHEALTHY

Tóm lại, bây giờ bạn có Prometheus chạy như một Docker container bằng cách sử dụng tệp cấu hình Prometheus tùy chỉnh ~/prometheus.yml, nằm trên hệ thống tệp máy chủ lưu trữ. Dung lượng lưu trữ số liệu nằm trong thư mục /prometheus trong container, sao lưu trên hệ thống máy chủ theo đường dẫn, hiển thị bởi lệnh docker inspect được giải thích trong phần này.

 

Bước 2 — Thiết lập Node Exporter

Trong phần này, chúng ta sẽ cài đặt Prometheus Node Exporter. Node Exporter là server hiển thị các số liệu Prometheus về máy chủ (node) đang chạy. Điều này bao gồm các chỉ số về hệ thống tệp của máy, thiết bị mạng, mức sử dụng bộ xử lý, mức sử dụng bộ nhớ và hơn thế nữa.

Lưu ý rằng việc chạy Node Exporter trên Docker gặp một số khó khăn vì toàn bộ mục đích của nó là để lộ số liệu về máy chủ đang chạy. Nếu chạy nó trên Docker mà không có thêm tùy chọn, Docker namespacing của các nguồn tài nguyên như hệ thống tập tin và các thiết bị mạng sẽ làm cho nó chỉ xuất số liệu về môi trường của containe  khác với môi trường của máy chủ. Vì vậy, nó thường được khuyến khích chạy Node Exporter trực tiếp trên hệ thống máy chủ bên ngoài Docker. Tuy nhiên, nếu có yêu cầu quản lý tất cả các quy trình bằng cách sử dụng Docker, chúng ta sẽ mô tả giải pháp thay thế cung cấp xấp xỉ hợp lý cho xuất khẩu số liệu máy chủ trong Docker.

Để khởi động Node Exporter trên cổng 9100 bằng Docker:

docker run -d -p 9100:9100 -v "/proc:/host/proc" -v "/sys:/host/sys" -v "/:/rootfs" --net="host" prom/node-exporter -collector.procfs /host/proc -collector.sysfs /host/proc -collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)" 

Các cờ Docker và Node Exporter sau được sử dụng để cung cấp xấp xỉ hợp lý cho các số liệu máy chủ:

  • Trên Linux, Node Exporter tập hợp hầu hết các số liệu từ hệ thống tập tin /proc và /sys, được gắn từ máy chủ vào container bên dưới thư mục /host, sử dụng cờ -v của Docker.
  • Thông qua các cờ -collector.procfs và -collector.sysfs của Node Exporter, hướng dẫn Node Exporter tìm kiếm các hệ thống tập tin /proc và /sys ở một vị trí không chuẩn.
  • Để báo cáo số liệu hệ thống tập tin lưu trữ, gắn kết toàn bộ hệ thống tệp gốc (/) vào container (tại /rootfs),một lần nữa bằng cờ -v của Docker.
  • Sử dụng cờ -collector.filesystem.ignored-mount-points của Node Exporter để bỏ qua bất kỳ hệ thống tệp khác trong container không thuộc hệ thống lưu trữ. Tùy chọn này có cụm từ thông dụng của các điểm gắn kết để loại trừ khỏi các chỉ số được báo cáo.
  • Sử dụng cờ --net=host Docker, chúng ta đặt container vào cùng một  ngăn xếp mạng như máy chủ, để đọc từ các tệp như /proc/net/dev sẽ mang lại kết quả tương tự như trên máy chủ (đọc từ /proc hệ thống tập tin được gắn kết từ máy chủ không đủ).

Lưu ý rằng một số chỉ số sẽ vẫn khác so với Node Exporter chạy trực tiếp trên máy chủ. Cụ thể, số liệu được báo cáo về việc sử dụng hệ thống tệp sẽ có tiền tố /rootfs trong giá trị nhãn mountpoint của chúng, do gắn kết trong hệ thống tệp gốc của tiền tố này trong container. Cũng không có gì đảm bảo rằng các giải pháp được mô tả là đủ cho bất kỳ tính năng của Node Exporter trong tương lai, vì vậy hãy chạy Node Exporter trên Docker theo quyết định của riêng bạn.

Prometheus server bây giờ sẽ tự động bắt đầu cạo Node Exporter. Truy cập trang trạng thái của Prometheus server tại http://your_server_ip:9090/status và xác minh rằng  http://your_server_ip:9100/metrics nhằm cho công việc node hiện đang hiển thị trạng thái HEALTHY:

The Node Exporter target should be shown as HEALTHY

 

Bước 3 — Thiết lập Grafana

Cuối cùng, chúng ta sẽ thiết lập Grafana. Grafana là một trình xây dựng bảng điều khiển đồ họa hỗ trợ Prometheus như một phụ trợ để truy vấn dữ liệu để vẽ đồ thị.

Grafana lưu trữ siêu dữ liệu trang tổng quan (chẳng hạn như trang tổng quan nào tồn tại và đồ thị nào sẽ hiển thị) trong CSDL dựa trên SQL có thể định cấu hình. Grafana hỗ trợ sử dụng CSDL SQLite3 được bảo vệ tập tin cục bộ cũng như các máy chủ CSDL bên ngoài như MySQL hoặc PostgreSQL cho việc này.

Trong hướng dẫn này, chúng ta sẽ sử dụng CSDL SQLite3 được hỗ trợ bởi Docker data volume. 

Khởi chạy Grafana dưới dạng Docker container với mật khẩu quản trị viên (admin_password) mà bạn chọn:

docker run -d -p 3000:3000 -e "GF_SECURITY_ADMIN_PASSWORD=admin_password" -v ~/grafana_db:/var/lib/grafana grafana/grafana 

Điều này tải xuống hình ảnh Grafana Docker từ Docker Hub và tạo một Docker volume mới đặt tại   ~/grafana_db trên hệ thống máy chủ và tại /var/lib/grafana trong hệ thống tệp container. Trong container, Grafana sau đó sẽ tự động tạo và khởi tạo CSDL SQLite3 của nó tại   /var/lib/grafana/grafana.db.

Cờ -e cho phép truyền các biến môi trường cho quá trình được khởi chạy bên trong Docker container. Ở đây, chúng ta sử dụng nó để đặt biến môi trường GF_SECURITY_ADMIN_PASSWORD thành mật khẩu quản trị viên bảng điều khiển mong muốn, ghi đè mật khẩu admin mặc định. Các biến môi trường cũng có thể được sử dụng để ghi đè lên bất kỳ cài đặt cấu hình Grafana nào khác. 

Để xác minh Grafana đang chạy đúng, hãy truy cập  http://your_server_ip:3000/. Tên người dùng quản trị viên là admin và password bạn đã chọn khi bắt đầu Docker container trước đó.

Log in to Grafana with your chosen password

Sau khi đăng nhập, bạn sẽ thấy chế độ xem chính của Grafana:

Grafana main view

Xem Grafana documentation để biết thêm về cách bắt đầu với Grafana. Prometheus Grafana documentation cũng cho thấy cách sử dụng Grafana kết hợp với Prometheus một cách cụ thể.

 

Kết luận

Chúc mừng! Bạn đã thiết lập Prometheus server, Node Exporter và Grafana - tất cả đều sử dụng Docker. Mặc dù tất cả hiện đang chạy trên cùng một máy, điều này chỉ dành cho mục đích trình bày. Trong các thiết lập sản xuất, thường chạy Node Exporter trên mỗi máy được giám sát, nhiều Prometheus server(cần thiết bởi tổ chức),cũng như một Grafana serverđơn lẻ để vẽ đồ thị dữ liệu từ các server này.