概述
因为已经熟悉了 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
[root@liqiang.io]# swapoff -a
[root@liqiang.io]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[root@liqiang.io]# yum install -y docker-ce
[root@liqiang.io]# systemctl start docker
[root@liqiang.io]# systemctl enable docker
[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
[root@liqiang.io]# sudo chmod +x /usr/local/sbin/docker-compose
环境准备
[root@liqiang.io]# mkdir -p /data/monitoring/{software,configs,grafana,prometheus}
[root@liqiang.io]# mkdir -p /data/monitoring/configs/{grafana,prometheus}
[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
[root@liqiang.io]# cp /data/monitoring/software/prometheus/prometheus.yml /data/monitoring/configs/prometheus/prometheus.yml
[root@liqiang.io]# cat > /data/monitoring/configs/grafana/grafana.ini <<EOF
[server]
protocol = http
http_addr = 0.0.0.0
http_port = 3000
domain = grafana.liqiang.io
enforce_domain = true
serve_from_sub_path = true
root_url = http://%(domain)s:%(http_port)s/grafana
EOF
运行 prometheus 和 grafana
[root@liqiang.io]# cat <<EOF >/data/monitoring/software/docker-compose.yaml
version: "3.7"
services:
prometheus:
image: prom/prometheus:latest
user: "${UID}:${GID}"
volumes:
- /data/monitoring/configs/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
- /data/monitoring/prometheus:/prometheus
command:
- '--web.enable-lifecycle'
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/usr/share/prometheus/console_libraries'
- '--web.console.templates=/usr/share/prometheus/consoles'
ports:
- 9090:9090
grafana:
image: grafana/grafana:latest
user: "${UID}:${GID}"
volumes:
- /data/monitoring/configs/grafana/grafana.ini:/etc/grafana/grafana.ini
- /data/monitoring/grafana:/var/lib/grafana
ports:
- 3000:3000
links:
- prometheus
EOF
[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 安装的:
[root@liqiang.io]# yum install -y nginx
[root@liqiang.io]# mkdir -p /etc/nginx/grafana
[root@liqiang.io]# cat> /etc/nginx/grafana/grafana.conf << EOF
location /grafana {
proxy_pass http://127.0.0.1:3000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
}
EOF
[root@liqiang.io]# echo "Please add 'include /etc/nginx/grafana/*.conf;' to your nginx.conf"
[root@liqiang.io]# nginx -t
[root@liqiang.io]# nginx -s reload
配置 Grafana
打开浏览器:http://grafana.liqiang.io/grafana,然后就看到这个界面了:
图 1:Grafana 登陆界面 |
---|
grafana 的默认帐号密码是:
- 用户名:admin
- 密码:admin
然后会让你修改密码,最好还是修改一下。
服务发现程序
Prometheus 支持非常多种服务发现方式,例如常见的:
- kubernetes_sd_config
- docker_sd_config
- openstack_sd_config
但是这些服务发现的特点都是,你需要采集的 Target 的 URL Path 是固定的,只能服务发现 Endpoint 的列表,也就是说你只能用于发现特定服务的 Container 数量,而不能动态地增减服务的种类。
举个例子:你有两个服务:Order 和 Account,那么 Prometheus 的服务发现支持你动态变更这两个服务的 Container 数量,例如从 100 个扩展到 150 个。但是,如果你增加了一个新的服务:Item,那么这个 Prometheus 提供的服务发现是不能支持的。
那么我们要怎么做才能动态地实现服务的扩展,这里我选择的是编写一个程序,然后动态地做服务元数据的工作,然后根据实际情况(例如服务的部署平台),扩展这个程序,做 Endpoint 的动态发现工作:
- 服务元数据发现:这个通过替换 Prometheus 的主配置文件,并让 Prometheus 重新加载配置实现;
- Endpiont 服务发现:这个通过 Prometheus 自带的服务发现接口实现,因为我使用的平台不支持所有的这些 API 服务发现,所以我选择 filesd 的形式实现;
服务元数据发现
服务元数据发现的实现关键点有两个:
- 获取服务元数据:这一步与部署平台相关,所以因人而异了
- 构造 Prometheus 的配置:这一步是固定的,一旦我们确定了服务元数据,即可通过配置模板渲染而来
由于代码比较长,就不贴代码了,有兴趣的可以直接打开 Github Repo: devops/prometheus/service_discovery 自己看一下~,然后实践的话,就是在 docker-compose.yaml 的后面加上一个 service:
[root@liqiang.io]# cat docker-compose.yaml
... ...
service-discovery:
image: liqiangliu/prometheus-service-discovery:0.3.0
user: "${UID}:${GID}"
environment:
- PROMETHEUS_ADDR=http://prometheus:9090
volumes:
- /data/monitoring/configs/prometheus:/etc/prometheus
ports:
- 5555:5555
然后尝试添加一个服务看看:
[root@liqiang.io]# curl --location --request POST 'http://127.0.0.1:5555/services' --header 'Content-Type: application/json' --data-raw '{
"name": "prometheus-default",
"endpoints": [
{
"host": "prometheus",
"port": 9090
}
]
}'
总结
至此,我们的一个基于 docker compose 的 prometheus 和 grafana 监控系统就算搭建完毕了,同时,还支持了一个简单的服务发现功能,这个服务发现的应用很简单,所以你自己进行更多的扩展也是没啥问题的。