Prometheus là hệ thống giám sát mã nguồn mở và cơ sở dữ liệu chuỗi thời gian, với nhiều tính năng nổi bật như tạo và thu thập số liệu, vẽ biểu đồ dữ liệu hay cảnh báo các sự kiện bất thường. Trong hướng dẫn này, Vietnix sẽ hướng dẫn bạn cách cài đặt Prometheus bằng Docker trên CentOS 7.
Yêu cầu để cài đặt Prometheus bằng Docker trên CentOS 7
Để có thể thực hiện hướng dẫn này, cần có:
- CentOS 7.1 Droplet.
- User có quyền sudo.
- Docker đã được cài đặt trên máy.
Lưu ý: Những hướng dẫn dưới đây đã được thử nghiệm trên máy có CPU/512 MB RAM chạy CentOS 7.1 Droplet. Bạn nên điều chỉnh cấu hình của Prometheus cho lượng tài nguyên khả dụng khác nhau, sẽ được đề cập cụ thể ở bước 2 trong bài hướng dẫn.
Cài đặt Docker trên VPS là một gợi ý hoàn hảo cho những ai muốn triển khai các ứng dụng trên môi trường ảo hóa. Đặc biệt, nó còn có thể giúp bạn quản lý và triển khai các ứng dụng một cách hiệu quả hơn. Vietnix hiện đang cung cấp dịch vụ VPS tốc độ cao với mức giá phải chăng, giúp bạn chủ động cài đặt và quản lý ứng dụng gồm: VPS NVMe, VPS Giá Rẻ, VPS Phổ Thông, VPS Cao Cấp và VPS GPU.
Nhanh tay liên hệ Vietnix để được tư vấn gói VPS phù hợp với nhu cầu phát triển ngay hôm nay.
Các bước cài đặt Prometheus bằng Docker trên CentOS 7
Docker cung cấp cho người dùng cách để “đóng gói” (encapsulate) các tiến trình của máy chủ bằng việc dùng bộ container Linux hoặc các công nghệ tương tự khác để dễ dàng quản lý và cách ly các quy trình.
Trong hướng dẫn này, Vietnix sẽ hướng dẫn cài đặt ba thành phần chính để sử dụng Prometheus trên Docker gồm:
- Server Prometheus để thu thập và truy vấn số liệu.
- Node Exporter để xuất số liệu hệ thống theo một định dạng tương thích với Prometheus.
- Grafana, một dashboard xây dựng giao diện dựa trên web hỗ trợ Prometheus, đồng thời cũng là một trong số các backend.
Bước 1 – Cài đặt Prometheus
Trước khi tiếp tục, hãy chắc chắn bạn đã cài đặt Docker trên mỗi máy chủ đúng cách để thực hiện các bước tiếp theo. Server Prometheus chính là phần trung tâm của hệ sinh thái Prometheus và chịu trách nhiệm cho việc thu thập và lưu trữ số liệu cũng như việc xử lý truy vấn biểu thức, tạo cảnh báo.
Image của Docker container cho mọi thành phần của Prometheus được nắm giữ, quản lý bởi tổ chức prom trên Docker Hub. Khởi chạy Image prom/prometheus
không cần thêm bất kì tùy chọn khác sẽ khởi chạy server Prometheus với file cấu hình ở /etc/prometheus/prometheus.yml
bên trong container.
Ngoài ra Docker còn sử dụng data volume Docker được mount trong /prometheus
để lưu trữ dữ liệu metric (dạng số liệu). Thư mục (directory) của data volume này chính là mục nằm trên host được Docker tự động tạo khi container khởi động lần đầu. Dữ liệu bên trong đó vẫn được lưu trữ sau mỗi lần container restart lại.
Có rất nhiều cách để ghi đè file cấu hình mặc định. Chẳng hạn bạn có thể truyền một file cấu hình tùy chỉnh vào container từ filesystem host như một data volume. Hoặc bạn có thể chọn tạo một container Docker gốc với file cấu hình được đưa vào image container. Trong bài viết này, Vietnix sẽ hướng dẫn bạn cách truyền một file cấu hình từ host system.
Bên cạnh đó, ta cũng có nhiều cách khác nhau để tổ chức lưu trữ các số liệu. Ta sẽ sử dụng thiết lập mặc định của image Docker là dùng một data volume của Docker để lưu trữ các số liệu. Ngoài ra, bạn có thể tham khảo cách tạo container cho data volume tùy theo nhu cầu.
Đầu tiên, tạo một file cấu hình Prometheus tối thiểu trên host filesystem ở ~/promethues.yml:
nano ~/prometheus.yml
Thêm các nội dung sau vào file (Thay your_server_ip
bằng IP của bạn):
~/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']
Trong ví dụ này, cấu hình yêu cầu Prometheus sẽ gom (scrape) các số liệu từ chính nó (Vì Prometheus cũng hiển thị các metric về chính nó ở định dạng tương thích với Prometheus) cũng như từ Node Exporter. Do Prometheus có thể kết nối với chính nó trong container bằng tên localhost
, Prometheus sẽ cần scrape Node Exporter bằng cách sử dụng địa chỉ IP server bên ngoài, vì Node Exporter sẽ chạy trong một container riêng với namespace mạng riêng.
Khởi động container Docker của Prometheus với file cấu hình 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
Khi khởi chạy lệnh này lần đầu, Prometheus sẽ pull image của Docker từ Docker Hub. Đây là một lệnh khá dài và chứa rất nhiều dòng lệnh tùy chọn:
- Option
-d
khởi động container của Prometheus ở chế độ tách rời, nghĩa là container sẽ chạy ở background và sẽ không bị kết thúc nếu dùng tổ hợp phímCTRL+C
. - Option
-p 9090:9090
hiển thị cổng web của Prometheus (9090) và cho phép truy cập vào cổng web thông qua địa chỉ IP bên ngoài của host system. - Option
-v [...]
mount file cấu hìnhprometheus.yml
từ filesystem host vào vị trí bên trong container(/etc/prometheus/prometheus.yml)
. - Option
-config.file
được đặt tương ứng với vị trí của file cấu hình Prometheus bên trong container. - Option
-storage.local.path
cấu hình vị trí lưu trữ metric trong container. - Cuối cùng, option
-storage.local.memory-chunks
điều chỉnh mức sử dụng bộ nhớ của Prometheus với dung lượng RAM rất nhỏ của hệ thống host (chỉ 512MB) và số lượng nhỏ chuỗi thời gian lưu trữ trong hướng dẫn này (dưới 1000). Option này yêu cầu Prometheus chỉ giữ 10000 chunk mẫu trong bộ nhớ (khoảng 10 chunk mỗi chuỗi), thay vì giá trị mặc định là 1048576. Nếu máy bạn có nhiều RAM và cần lưu trữ nhiều chuỗi hơn thì bạn có thể tăng giá trị này lên mức tương ứng. Có thể liệt kê tất cả Docker container bằng lệnh dưới đây:
docker ps
Chẳng hạn, bạn sẽ thấy hiển thị tương tự dưới đây cho container Docker của Prometheus:
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 ID của container trong output docker ps
để kiểm tra log của server Prometheus đang hoạt động cách dùng lệnh:
docker logs container_id
Trong ví dụ này, dòng lệnh sẽ là:
docker logs 6a89ac39911e
Để xác định nơi mà phân vùng lưu trữ chứa số liệu trên filesystem của host được lưu trữ, dùng lệnh sau đây với container_id
của bạn:
docker inspect container_id
Output sẽ hiển thị thông tin về cấu hình container bao gồm cả đường dẫn host của bất kỳ lượng Docker được mount kèm.
Tìm trong output phần hiển thị giống như sau:
Output of `docker inspect ...` ... "Mounts": [ { "Source": "/home/vietnix/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 } ], ...
Ở đây, metric được lưu trữ ở /var/lib/docker/volumes/821b0abc470a9c758ff35ed5cff69077423a629566082a605a01d8207d57cd6c/_data
trên hệ thống host. Directory này được tự động tạo bởi Docker khi lần đầu khởi chạy container của Prometheus. Directory chứa số liệu được ánh xạ vào directory /prometheus
trong container. Dữ liệu trong đó được duy trì trong các lần restart của cùng một container. Nếu muốn, bạn cũng có thể mount một directory host sẵn có để lưu trữ dữ liệu về các thông số.
Tiếp theo, kết nối với sever Prometheus bằng địa chỉ IP của http://your_server_ip:9090/
. Bạn có thể xác thực việc thu thập số liệu bằng cách điều hướng tới http://your_server_ip:9090/status
và cố định endpoint của http://localhost:9090/metrics
cho job prometheus trong phần Target. Cột State cho nên hiển thị trạng thái HEALTHY. Ngược lại, endpoint của http://localhost:9100/metrics
(Node Exporter) nên hiển thị trạng thái UNHEALTHY vì Node Exporter vẫn chưa được khởi chạy nên không thể scrape số liệu.
Sau khi hoàn thành Bước 1, bạn đã có Prometheus hoạt động như container của Docker bằng cách sử dụng file cấu hình tùy chỉnh của Prometheus ~/prometheus.yml
, nằm trên filesystem của host. Vùng lưu trữ số liệu nằm ở directory /prometheus
trong container, được sao lưu trên host theo đường dẫn bởi lệnh docker inspect đã được nêu ở trên.
Bước 2 – Thiết lập Node Exporter
Node Exporter là một server hiển thị số liệu của Prometheus về máy host (node) đang chạy. Bao gồm cả số liệu về filesystem của máy, thiết bị mạng, lượng sử dụng truy cập, lượng sử dụng bộ nhớ,…
Lưu ý khởi chạy Node Exporter trên Docker sẽ có một số khó khăn vì mục đích chính của Node Exporter là hiển thị các số liệu về host mà đang chạy. Nếu khởi chạy trên Docker mà không có thêm tùy chọn, cụm không gian tài nguyên của Docker (như filesystem và các thiết bị mạng) sẽ khiến Node Exporter chỉ xuất số liệu về môi trường container chứ không phải môi trường host.
Do đó lời khuyên cho người dùng là nên chạy Node Exporter trực tiếp trên host system bên ngoài Docker. Tuy nhiên, nếu cần quản lý mọi tiến trình bằng cách sử dụng Docker thì có thể làm theo các bước sau để xuất metric host từ bên trong Docker.
Nhập lệnh dưới đây để khởi động Node Exporter trên cổng 9100 sử dụ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 flag Docker và Node Exporter sau được sử dụng để cung cấp các giá trị tương đối hợp lý cho các metric của host:
- Trên Linux, Node Exporter thu thập hầu hết số liệu từ filesystem
/proc
và/sys
. Những filesystem này được mount từ host vào container ở directory/host
bằngflag-v
của Docker. - Thông qua các flag
-collector.procfs
và-collector.sysfs
, ta đã yêu cầu Node Exporter tìm filesystem/proc
và/sys
ở một vị trí không quy chuẩn (non-standard). - Để báo cáo số liệu của filesystem host cũng cần phải mount toàn bộ root (
/
) của filesystem vào trong container (ở/rootfs
) bằng flag-v
. - Sử dụng flag
-collector.filesystem.ignored-mount-points
của Node Exporter để bỏ qua các filesystem khác bên trong container mà không thuộc hệ thống host. Tùy chọn này lấy một biểu thức chính quy của các điểm mount để loại trừ khỏi các metric được báo cáo. - Sử dụng flag
–net=host
của Docker để đặt container vào cùng một stack mạng với host. Làm như vậy việc đọc các file như/proc/net/dev
sẽ mang lại kết quả giống như trên host (chỉ đọc từ filesystem/proc
được mount từ host là không đủ).
Nên biết rằng một vài số liệu vẫn sẽ khác so với khi Node Exporter chạy trực tiếp trên host. Cụ thể là những số liệu về việc sử dụng filesystem với tiền tố /rootfs
trong giá trị của label mountpoint
, vì ta đã mount filesystem root theo tiền tố này trong container.
Bên cạnh đó, ta cũng không thể đảm bảo rằng giải pháp này sẽ đáp ứng được tất cả tính năng của Node Exporter trong tương lai. Do đó hãy cần nhắc kĩ trước khi làm theo cách này.
Giờ thì server Prometheus có thể tự scrape Node Exporter. Điều hướng trang trạng thái của server Prometheus đến http://your_server_ip:9090/status
và xác thực rằng trang đích http://your_server_ip:9100/metrics
cho node job đang hiện ở trạng thái HEALTHY:
Bước 3 – Thiết lập Grafana
Grafana là trình tạo đồ họa dashboard dựa trên web hỗ trợ Prometheus như một backend cho việc truy vấn cho dữ liệu để tạo đồ thị.
Grafana lưu trữ metadata của dashboard (như dashboard nào còn hiện hữu, đồ thị nào nên được hiển thị) trong một database cấu hình được dựa trên SQL. Grafana hỗ trợ sử dụng local file-backed database SQLite 3 cũng như các server database bên ngoài như MySQL hay PostgreSQL.
Trong bài viết này, Vietnix sẽ hướng dẫn cách sử dụng một database SQLite3 dựa trên lượng dữ liệu của Docker.
Triển khai Grafana như một container Docker với mật khẩu admin mà bạn đặt (admin_password
):
docker run -d -p 3000:3000 -e "GF_SECURITY_ADMIN_PASSWORD=admin_password" -v ~/grafana_db:/var/lib/grafana grafana/grafana
Dòng lệnh này sẽ bắt đầu việc tải Grafana image Docker từ Docker Hub và một volume Docker mới trong ~/grafana_db
trên system host, và ở /var/lib/grafana
trong filesystem container. Trong container, Grafana sẽ tự động tạo và khởi tạo database SQLite 3 ở var/lib/grafana/grafana.db
.
Flag -e
cho phép truyền vào các biến môi trường để xử lý việc triển khai bên trong container Docker. Tại đây, sử dụng flag -e để đặt biến môi trường GF_SECURITY_ADMIN_PASSWORD
thành mật khẩu quản trị viên của dashboard mong muốn, ghi đè lên mật khẩu mặc định của admin. Các biến môi trường cũng có thể được dùng để ghi đè các cấu hình cài đặt khác của Grafana.
Để xác thực rằng Grafana đang hoạt động chính xác, điều hướng tới trang http://your_server_ip:3000/
. Username của quản trị viên là admin
và mật khẩu là mật khẩu bạn đã đặt khi khởi chạy container Docker trước đây.
Sau khi đăng nhập, màn hình chính của Grafana sẽ hiển thị:
Vietnix với hơn 10 năm hoạt động đã đồng hành với hơn 50.000 khách hàng cá nhân và doanh nghiệp. Đến năm 2022 Vietnix vinh dự được nhận giải Thương hiệu Việt Nam xuất sắc nhất. Đồng thời, với tỷ lệ 97% khách hàng sau khi sử dụng dịch vụ tại Vietnix đã giới thiệu đến bạn bè, đồng nghiệp cũng là một minh chứng cho chất lượng dịch vụ luôn đáp ứng được mọi nhu cầu của khách hàng.
Nhanh tay đăng ký VPS NVMe ngay và trải nghiệm dịch vụ ổn định, tốc độ cao, hỗ trợ nhanh chóng với nhiều ưu đãi hấp dẫn nhất.
- Địa chỉ: 265 Hồng Lạc, Phường 10, Quận Tân Bình, Thành Phố Hồ Chí Minh.
- Hotline: 1800 1093.
- Email: sales@vietnix.com.vn
Lời kết
Cuối cùng bạn đã có một server Prometheus, Node Exporter và Grafana đều sử dụng Docker. Dù trong bài viết này, tất cả chúng chỉ được cài đặt và hoạt động trên một máy, nhưng trong thực tế thì Node Exporter thường được sử dụng trên mọi máy được giám sát, nhiều server Prometheus và một server Grafana duy nhất để vẽ biểu đồ dữ liệu từ các server. Chúc bạn thành công.