ubuntu服务器部署prometheus监控

概述

文章介绍了在 ubuntu 服务器上使用 docker 部署服务监控软件普罗米修斯(prometheus),并将其他 linux 主机添加到监控。

认识prometheus

官网:https://prometheus.io/

Github: https://github.com/prometheus/prometheus

普罗米修斯(Prometheus)是云原生计算基金会的一个项目,是一个系统和服务监控系统。它会定期从配置的目标中收集指标,评估规则表达式,显示结果,并且在观察到指定条件时可以触发警报。

pull metrics


pull metrics…
HDD / SSD
HDD / SSD
Pushgateway
Pushgateway
Short-lived jobs
Short-lived jobs
Jobs / Exporters
Jobs / Exporters
Storage
Storage
Retrieval
Retrieval
PromQL
PromQL
Prometheus Server
Prometheus Server
Node
Node
Service Discovery

Service Discovery
             find 
                 targets
find…
Prometheus Server
Prometheus Server
Alertmanager
Alertmanager
push alerts         


push alerts…
Web UI
Web UI
Grafana
Grafana
API clients
API clients
PagerDuty
PagerDuty
Email
Email
  • DNS
  • Kubernetes
  • Consul
  • Custom integration
DNSKubernetesConsul…Custom in…
              notify
              notify
Text is not SVG - cannot display

环境说明

操作系统 架构 CPU 内存 docker版本 IP 部署服务
Ubuntu 24.04 LTS x86_64 4 8G 28.4.0 192.168.2.201 prometheus server&node exporter
Ubuntu 24.04 LTS x86_64 4 8G 28.4.0 192.168.2.202 node exporter
Ubuntu 24.04 LTS x86_64 4 8G 28.4.0 192.168.2.203 node exporter
Ubuntu 24.04 LTS x86_64 2 4G 28.4.0 192.168.2.204 node exporter
Armbian armv7l 4 1G 28.3.1 192.168.2.243 node exporter

安装prometheus

使用 docker 容器化安装 prometheus。

准备prometheus镜像

首先需要准备镜像,本次从docker官网下载 v3.9.1 版本镜像,打开 github 中克隆的 DockerTarBuilder 项目,执行 x86-64 Pull and Save Docker Image 的Action,参数填写 prom/prometheus:v3.9.1 ,运行完成后下载镜像文件。

将镜像文件解压出来,使用 MobaXterm 连接到服务器,将 prometheus 镜像文件 prom_prometheus_v3.9.1-amd64.tar.gz 上传到服务器上。

执行如下命令加载镜像:

1
sudo docker load -i prom_prometheus_v3.9.1-amd64.tar.gz

创建配置文件和挂载目录

我的服务器中 docker 相关的数据存放目录是 /home/wqf31415/docker/data/,在这个目录中创建目录存放 prometheus 相关数据和配置文件:

1
2
cd /home/wqf31415/docker/data/
sudo mkdir -p prometheus/data

创建配置文件:

1
vim prometheus/prometheus.yml

prometheus.yml 内容如下,在初始的配置文件中增加了对 prometheus 自身的监控:

1
2
3
4
5
6
7
8
global:
scrape_interval: 15s # 每15秒收集一次指标
evaluation_interval: 15s # 每15秒评估一次规则

scrape_configs:
- job_name: 'prometheus' # 第一个抓取任务:监控Prometheus自己
static_configs:
- targets: ['localhost:9090']

准备docker-compose配置文件

创建 docker-compose-prometheus.yml 文件,填写内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
services:
prometheus:
image: prom/prometheus:v3.9.1
container_name: prometheus
user: "root"
restart: unless-stopped
network_mode: host
volumes:
# 将本地配置文件挂载到容器内,方便修改
- /home/wqf31415/docker/data/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
# 将数据目录挂载出来,确保数据持久化,不随容器删除而丢失
- /home/wqf31415/docker/data/prometheus/data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/etc/prometheus/console_libraries'
- '--web.console.templates=/etc/prometheus/consoles'
- '--storage.tsdb.retention.time=30d' # 可选项:设置数据保留30天
````

#### 启动prometheus容器

运行命令启动容器:

```bash
sudo docker compose -f docker-compose-prometheus.yml up -d

查看容器运行状态,状态为 Up 说明启动正常:

1
sudo docker ps

如果容器运行异常,使用 sudo docker logs prometheus 查看日志,分析错误原因。

容器运行正常,可以用浏览器访问服务器的 9090 端口,我的访问地址是 http://192.168.2.201:9090,查看 prometheus 页面,在页面的 Status -> Target Health 页面中能看到监控的 prometheus 自身服务,State 为 UP 说明监控正常。

安装node-exporter

二进制安装

访问官方 github 的发布地址:https://github.com/prometheus/node_exporter/releases ,根据操作系统和CPU架构选择合适的版本,我这里根据章节 环境说明 中信息选择了 node_exporter-1.10.2.linux-amd64.tar.gznode_exporter-1.10.2.linux-armv7.tar.gz,可以直接下载后导入到服务器,或者复制文件连接,在服务器上使用 wget 下载,我这里复制文件链接,在服务器上下载:

1
sudo wget https://github.com/prometheus/node_exporter/releases/download/v1.10.2/node_exporter-1.10.2.linux-amd64.tar.gz

解压文件:

1
tar -zxvf node_exporter-1.10.2.linux-amd64.tar.gz

创建独立用户,拷贝可执行程序到 /usr/local/bin 目录,修改

1
2
3
4
5
6
# 创建专用用户(提升安全性)
sudo useradd --no-create-home --shell /bin/false node_exporter

# 复制二进制文件并设置权限
sudo cp node_exporter /usr/local/bin/
sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter

配置 Systemd 服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo tee /etc/systemd/system/node_exporter.service <<EOF
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter

[Install]
WantedBy=multi-user.target
EOF

启动 node-exporter:

1
2
3
4
sudo systemctl daemon-reload
sudo systemctl enable node_exporter
sudo systemctl start node_exporter
sudo systemctl status node_exporter # 确保状态为 active (running)

docker安装

参考章节 准备prometheus镜像 从 docker 官方仓库下载镜像 prom/node-exporter:v1.10.2 ,将镜像导入到需要部署的服务器上。

准备 docker-compose 配置文件 docker-compose-node-exporter.yml ,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
services:
node_exporter:
image: prom/node-exporter:v1.10.2
container_name: node_exporter
restart: unless-stopped
network_mode: host # 必须使用 host 网络,否则无法获取宿主机真实指标
pid: host # 允许访问宿主机进程信息
privileged: true # 需要特权以读取部分内核指标
command:
- '--path.rootfs=/host' # 指定根文件系统路径
volumes:
- '/:/host:ro' # 将宿主机根目录挂载为只读

创建并启动容器:

1
sudo docker compose -f docker-compose-node-exporter.yml up -d

查看容器启动情况,状态为 Up 说明启动正常:

1
sudo docker ps

验证 node_exporter 功能:

1
curl http://localhost:9100/metrics

修改prometheus服务配置

修改 prometheus 服务配置文件 sudo vim /home/wqf31415/docker/data/prometheus/prometheus.yml,在 scrape_configs 中新增任务配置,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
global:
scrape_interval: 15s # 每15秒收集一次指标
evaluation_interval: 15s # 每15秒评估一次规则

scrape_configs:
- job_name: 'prometheus' # 第一个抓取任务:监控Prometheus自己
static_configs:
- targets: ['localhost:9090']

# 新增:监控服务器
- job_name: 'linux-server'
static_configs:
- targets: ['192.168.2.201:9100']
labels:
name: 'ubuntu-01'
system: 'ubuntu'
arch: 'x86_64'
- targets: ['192.168.2.202:9100']
labels:
name: 'ubuntu-02'
system: 'ubuntu'
arch: 'x86_64'
- targets: ['192.168.2.203:9100']
labels:
name: 'ubuntu-03'
system: 'ubuntu'
arch: 'x86_64'
- targets: ['192.168.2.204:9100']
labels:
name: 'ubuntu-04'
system: 'ubuntu'
arch: 'x86_64'
- targets: ['192.168.2.243:9100']
labels:
name: 'onecloud'
system: 'armbian'
arch: 'armv7l'

修改配置文件后,重启 prometheus 容器:

1
sudo docker restart prometheus

浏览器访问 prometheus 页面的 Status -> Target Health,查看已添加的监控节点状态,State 为 UP 说明节点监控正常。

安装Grafana可视化监控

创建目录和配置文件

创建容器挂载目录和数据源配置文件:

1
2
3
cd /home/wqf31415/docker/data # 进入docker数据目录
sudo mkdir grafana/data
sudo mkdir grafana/provisioning/{datasources,dashboards}

provisioning/datasources 目录中创建 prometheus 数据源配置文件 prometheus.yaml 内容如下:

1
2
3
4
5
6
7
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
url: http://localhost:9090
isDefault: true

准备grafana镜像

参考章节 准备prometheus镜像 从 docker 官方仓库下载镜像 grafana/grafana:main ,将镜像导入到需要部署的服务器上。

准备 docker-compose 配置文件 docker-compose-grafana.yml ,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
services:
grafana:
image: grafana/grafana:main
container_name: grafana
restart: unless-stopped
network_mode: host # 与 Prometheus 保持一致,使用主机网络
environment:
# 强制修改 Grafana 的 HTTP 服务端口为 3001(或其他你喜欢的可用端口)
- GF_SERVER_HTTP_PORT=9091
# 设置管理员初始密码,请务必在生产环境中修改!
- GF_SECURITY_ADMIN_PASSWORD=123456
# (可选)禁止 Grafana 自动尝试使用 3000 端口,避免启动日志报错
- GF_SERVER_PROTOCOL=http
user: "root" # 避免潜在的权限问题,与你的 Prometheus 容器保持一致
volumes:
# 持久化存储 Grafana 的所有数据(配置、仪表盘、插件等)
- /home/wqf31415/docker/data/grafana/data:/var/lib/grafana
# (可选)如果你想预先配置数据源,可以挂载一个配置文件
- /home/wqf31415/docker/data/grafana/provisioning:/etc/grafana/provisioning

volumes:
grafana_data: # 命名卷,确保数据安全持久

注:
上述 docker-compose 配置文件中环境变量中添加的 GF_SERVER_HTTP_PORT=9091 是将 web 访问端口修改成 9091,是因为 grafana 默认端口 3000 和已有的其他程序冲突了,如果端口不冲突可以删除这个配置。

启动grafana

运行命令创建并启动 grafana 容器:

1
sudo docker compose -f docker-compose-grafana.yml up -d

浏览器访问 grafana 页面,我这里修改过访问端口,所以访问地址为 http://192.168.2.201:9091/ ,用户名为 admin,密码是配置的 123456

由于在创建容器时添加了 prometheus 的数据源,所以在 grafana 页面的 Connections -> Data sources 页面可以看到名为 Prometheus 的数据源。

注:如果没有添加数据源配置文件,可以在 Data sources 页面手动添加。

创建可视化监控面板

Grafana 官网提供了很多看板模板,可以复制模板的 ID 或 json 描述数据,导入到本地使用,地址:https://grafana.com/grafana/dashboards

进入 grafana 页面的 Dashboards 页面,点击 New -> Import ,模板ID 填写 1860,点击 Load 加载模板,加载完成后选择已添加的 prometheus 数据源,保存后就可以在 Dashboards 页面查看监控面板。