概述

因为已经熟悉了 Prometheus 的模式,所以平时一些服务器软件和小应用都是通过 Prometheus 来监控的,虽然经常搭建 Prometheus 环境,但是没有总结一下,所以每次都需要跑各个地方去找配置(systemd、prometheus、nginx 配置等),所以最近刚好有个新环境,需要重新搭建一下,所以趁机也就顺便记录一下安装配置 prometheus 和 grafana 的过程。

这个搭建包括安装使用 Docker 部署 prometheus 和 grafana,同时映射本地的磁盘目录(prometheus 数据可能会不少,所以我是额外使用挂载的磁盘),然后还包括 Nginx 的反向代理,以及 prometheus 的简单配置,这里我会写一个简单的 service discovery 服务,通过替换配置文件的方式提供,因为我的抓取目标是一个内部容器平台,目标的 ip 会经常变动,所以需要有一个简单的动态变更管理。

如果你只想了解如何安装部署 Grafana 的话,可以参考我之前写过的一篇指导:安装部署 Grafana,它包含了部署一个 systemd 管理的 Grafana,以及使用 Nginx 代理的步骤。

compose 运行 prometheus 和 grafana

安装 Docker 和 compose

  1. [root@liqiang.io]# swapoff -a
  2. [root@liqiang.io]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  3. [root@liqiang.io]# yum install -y docker-ce
  4. [root@liqiang.io]# systemctl start docker
  5. [root@liqiang.io]# systemctl enable docker
  6. [root@liqiang.io]# sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/sbin/docker-compose
  7. [root@liqiang.io]# sudo chmod +x /usr/local/sbin/docker-compose

环境准备

  1. [root@liqiang.io]# mkdir -p /data/monitoring/{software,configs,grafana,prometheus}
  2. [root@liqiang.io]# mkdir -p /data/monitoring/configs/{grafana,prometheus}
  3. [root@liqiang.io]# cd /data/monitoring/software && tar -xvf prometheus-2.42.0.linux-amd64.tar.gz && ln -s prometheus-2.42.0.linux-amd64 prometheus
  4. [root@liqiang.io]# cp /data/monitoring/software/prometheus/prometheus.yml /data/monitoring/configs/prometheus/prometheus.yml
  5. [root@liqiang.io]# cat > /data/monitoring/configs/grafana/grafana.ini <<EOF
  6. [server]
  7. protocol = http
  8. http_addr = 0.0.0.0
  9. http_port = 3000
  10. domain = grafana.liqiang.io
  11. enforce_domain = true
  12. serve_from_sub_path = true
  13. root_url = http://%(domain)s:%(http_port)s/grafana
  14. EOF

运行 prometheus 和 grafana

  1. [root@liqiang.io]# cat <<EOF >/data/monitoring/software/docker-compose.yaml
  2. version: "3.7"
  3. services:
  4. prometheus:
  5. image: prom/prometheus:latest
  6. user: "${UID}:${GID}"
  7. volumes:
  8. - /data/monitoring/configs/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
  9. - /data/monitoring/prometheus:/prometheus
  10. command:
  11. - '--web.enable-lifecycle'
  12. - '--config.file=/etc/prometheus/prometheus.yml'
  13. - '--storage.tsdb.path=/prometheus'
  14. - '--web.console.libraries=/usr/share/prometheus/console_libraries'
  15. - '--web.console.templates=/usr/share/prometheus/consoles'
  16. ports:
  17. - 9090:9090
  18. grafana:
  19. image: grafana/grafana:latest
  20. user: "${UID}:${GID}"
  21. volumes:
  22. - /data/monitoring/configs/grafana/grafana.ini:/etc/grafana/grafana.ini
  23. - /data/monitoring/grafana:/var/lib/grafana
  24. ports:
  25. - 3000:3000
  26. links:
  27. - prometheus
  28. EOF
  29. [root@liqiang.io]# cd /data/monitoring/software/ && docker-compose up -d

到此,Prometheus 和 Grafana 都已经安装部署完毕,你可以通过 http://localhost:3000 访问 Grafana 了。但是,我习惯用 Nginx 代理一下,这样就无需额外指定端口了。

配置 Nginx

因为我已经安装有 Nginx 了,所以就无需再安装了,如果你没有安装的话,简单的选择就是用 docker-compose 再运行一个 Nginx,或者直接用 Linux 的包管理软件安装一个,例如我之前就是直接用 Yum 安装的:

  1. [root@liqiang.io]# yum install -y nginx
  2. [root@liqiang.io]# mkdir -p /etc/nginx/grafana
  3. [root@liqiang.io]# cat> /etc/nginx/grafana/grafana.conf << EOF
  4. location /grafana {
  5. proxy_pass http://127.0.0.1:3000;
  6. proxy_set_header X-Real-IP $remote_addr;
  7. proxy_set_header Host $host;
  8. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  9. proxy_http_version 1.1;
  10. proxy_set_header Upgrade $http_upgrade;
  11. proxy_set_header Connection "upgrade";
  12. proxy_redirect off;
  13. }
  14. EOF
  15. [root@liqiang.io]# echo "Please add 'include /etc/nginx/grafana/*.conf;' to your nginx.conf"
  16. [root@liqiang.io]# nginx -t
  17. [root@liqiang.io]# nginx -s reload

配置 Grafana

打开浏览器:http://grafana.liqiang.io/grafana,然后就看到这个界面了:

图 1:Grafana 登陆界面

grafana 的默认帐号密码是:

然后会让你修改密码,最好还是修改一下。

服务发现程序

Prometheus 支持非常多种服务发现方式,例如常见的:

但是这些服务发现的特点都是,你需要采集的 Target 的 URL Path 是固定的,只能服务发现 Endpoint 的列表,也就是说你只能用于发现特定服务的 Container 数量,而不能动态地增减服务的种类。

举个例子:你有两个服务:Order 和 Account,那么 Prometheus 的服务发现支持你动态变更这两个服务的 Container 数量,例如从 100 个扩展到 150 个。但是,如果你增加了一个新的服务:Item,那么这个 Prometheus 提供的服务发现是不能支持的。

那么我们要怎么做才能动态地实现服务的扩展,这里我选择的是编写一个程序,然后动态地做服务元数据的工作,然后根据实际情况(例如服务的部署平台),扩展这个程序,做 Endpoint 的动态发现工作:

服务元数据发现

服务元数据发现的实现关键点有两个:

由于代码比较长,就不贴代码了,有兴趣的可以直接打开 Github Repo: devops/prometheus/service_discovery 自己看一下~,然后实践的话,就是在 docker-compose.yaml 的后面加上一个 service:

  1. [root@liqiang.io]# cat docker-compose.yaml
  2. ... ...
  3. service-discovery:
  4. image: liqiangliu/prometheus-service-discovery:0.3.0
  5. user: "${UID}:${GID}"
  6. environment:
  7. - PROMETHEUS_ADDR=http://prometheus:9090
  8. volumes:
  9. - /data/monitoring/configs/prometheus:/etc/prometheus
  10. ports:
  11. - 5555:5555

然后尝试添加一个服务看看:

  1. [root@liqiang.io]# curl --location --request POST 'http://127.0.0.1:5555/services' --header 'Content-Type: application/json' --data-raw '{
  2. "name": "prometheus-default",
  3. "endpoints": [
  4. {
  5. "host": "prometheus",
  6. "port": 9090
  7. }
  8. ]
  9. }'

总结

至此,我们的一个基于 docker compose 的 prometheus 和 grafana 监控系统就算搭建完毕了,同时,还支持了一个简单的服务发现功能,这个服务发现的应用很简单,所以你自己进行更多的扩展也是没啥问题的。