Cách cài đặt Prometheus sử dụng Docker trên CentOS 7

3 năm trước

 

Giới thiệu

Prometheus là một hệ thống giám sát nguồn mở và cơ sở dữ liệu chuỗi thời gian,
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 đưa ra cách để bạn đóng gói các tiến trình máy chủ 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à:

  • Máy chủ Prometheus để thu thập số liệu và thảo luậ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 một điểm 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 này, bạn cần:

Lưu ý: Bài viết này đã được thử nghiệm trên 1 CPU/512 MB RAM CentOS 7.1 Droplet. Cấu hình Prometheus nên được điều chỉnh cho các nguồn sẵn có khác nhau như nêu trong Bước 2.

 

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

Phần này sẽ giải thích cách cài đặt máy chủ Prometheus 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. Máy chủ Prometheus là phần trung tâm của hệ sinh thái Prometheus và 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 quảng cáo trên Docker Hub. Chạy hình ảnh prom/prometheus Docker mà không có bất kỳ tùy chọn nào khác bắt đầu máy chủ Prometheus 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 bên trong container để lưu trữ 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 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 suy ra 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ẽ sử dụng hành vi mặc định của hình ảnh Docker bằng cách sử dụng Docker data volume để lưu trữ các số liệu. Bạn có thể xem xét cách tạo data volume 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 Droplet):

~/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ừ Node Exporter sẽ thiết lập sau này. Trong khi Prometheus có thể tự kết nối trong container bằng tên máy chủ localhost, cần phải cạo Node Exporter bằng IP ngoài của máy chủ vì Node Exporter sẽ chạy trong container riêng biệt với namespace nối 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 khi 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 sẽ được bắt đầu ở nền và không bị chấm dứt 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 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 đợi nó (/etc/prometheus/prometheus.yml).
  • Tùy chọn -config.file được đặt cho 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 việc sử dụng bộ nhớ của Prometheus với số 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ị Prometheus chỉ giữ được 10000 khối mẫu trong bộ nhớ (khoảng 10 khối mỗi chuỗi),thay vì mặc định là 1048576. Đây là giá trị bạn chắc chắn sẽ cần phải điều chỉnh khi chạy Prometheus trên máy có RAM nhiều hơn và khi lưu trữ nhiều thời gian hơn. Tham khảo tài liệu lưu trữ của Prometheus để biết thêm chi tiết về điều này.

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 một điều tương tự như sau đối với 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, có thể kiểm tra các bản ghi của máy chủ Prometheus đang chạy bằng lệnh:

docker logs container_id

Trong ví dụ này, lệnh sẽ là:

docker logs 6a89ac39911e

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

docker inspect container_id

Điều này sẽ xuất thông tin về cấu hình 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.

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 container Prometheus. Nó được map 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 máy chủ Prometheus của mình 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 và định vị điểm cuối http://localhost:9090/metrics cho công việc prometheus trong phần  Targets. Cột State cho mục tiêu này sẽ hiển thị trạng thái của mục tiêu 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 scrape:

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, được sao lưu trên hệ thống máy chủ theo đường dẫn được 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à một server hiển thị các số liệu Prometheus về máy chủ (node) mà nó đ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 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 container, mà khác với môi trường của máy chủ. Vì vậy, 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 bạn có yêu cầu quản lý tất cả các quy trình của bạn bằng cách sử dụng Docker, chúng ta sẽ mô tả giải pháp cung cấp một sự xấp xỉ hợp lý cho xuất số liệu máy chủ từ 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 cung cấp sự 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, chúng ta 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ữ, chúng ta cũng gắn kết toàn bộ hệ thống tệp gốc (/) vào container (tại /rootfs),lại sử dụng cờ -v của Docker.
  • Sử dụng cờ -collector.filesystem.ignored-mount-points của Node Exporter để bỏ qua các 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ờ Docker --net=host , đặt container vào cùng một ngăn xếp mạng như máy chủ, để việc đọ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ủ là 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 trong hệ thống tệp gốc dưới 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ả sẽ đủ cho bất kỳ tính năng nào của Node Exporter tương lai, vì vậy hãy chạy Node Exporter trên Docker theo cách của riêng bạn.

Máy chủ Prometheus bây giờ sẽ tự động bắt đầu cạo Node Exporter. Truy cập trang trạng thái của máy chủ Prometheus của bạn tại http://your_server_ip:9090/status và xác minh rằng http://your_server_ip:9100/metrics  nhằm cho 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ợ thảo luận dữ liệu để vẽ đồ thị.

Grafana lưu trữ siêu dữ liệu trang tổng quan của nó (chẳng hạn như trang tổng quan nào tồn tại và đồ thị nào sẽ hiển thị) trong cơ sở dữ liệu dựa trên SQL có thể định cấu hình. Grafana hỗ trợ sử dụng cơ sở dữ liệu SQLite3 bảo vệ tập tin cục bộ cũng như các máy chủ cơ sở dữ liệu 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 một cơ sở dữ liệu 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 sẽ tải xuống hình ảnh Grafana Docker từ Docker Hub và tạo Docker volume mới được đặ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 cơ sở dữ liệu 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 mặc định admin. 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. Xem Sử dụng biến môi trường để biết thêm chi tiết.

Để xác minh Grafana đang chạy đúng, hãy truy cập http://your_server_ip:3000/ . Tên người dùng là admin và mật khẩu là mật khẩu 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 tài liệu Grafana để biết thêm về cách bắt đầu với Grafana. Tài liệu của Prometheus Grafana 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

Xin chúc mừng! Bạn đã thiết lập máy chủ Prometheus, Node Exporter và Grafana - tất cả đều sử dụng Docker. Mặc dù tất cả những điều này 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 diễn. Trong các thiết lập sản xuất, người ta thường chạy Node Exporter trên mỗi máy được giám sát, nhiều máy chủ Prometheus (khi cần thiết bởi tổ chức),cũng như một máy chủ Grafana đơn lẻ để vẽ đồ thị dữ liệu từ các máy chủ này

Để tìm hiểu thêm về cách sử dụng Prometheus nói chung, hãy tham khảo tài liệu của nó.