用Prometheus开始简单的服务器监控
简介
使用Prometheus开始简单地监视个人服务器。
使用的物品
-
- prometheus
- docker
Prometheus是一种数据按需收集的应用程序,为了获取指标,需要分别使用exporter和应用程序。由于在Prometheus和exporter自己安装会有很多麻烦,所以可以使用Docker容器进行构建。这里没有涉及Grafana。
我这次构建的环境如下所示。
-
- Ubuntu 16.04.1 LTS
-
- Docker 1.13.0
- prometheus 1.5.0
请将以下内容用中文进行适当的改写,只需一种选项:
1. The content is:
– The content of the article is…
– What is written in the article is…
– The information provided is…
– This passage talks about…
– The main idea of the article is…
首先,在这里把所有的工作总结起来,然后再逐一详细写下来。
总结
-
- ここでは下記メトリクスが取得できるようにする
CPU やメモリなどの基本的な項目
docker コンテナそれぞれの基本的な項目
docker のコンテナで構成する
docker の User-defined network を使う
直接外から見られないようにするため
コンテナの IP アドレスを固定するため
prometheus および alertmanger の UI 用にリバースプロキシする
アラート飛ばせるようにする
設定例は gmail
这是理所当然的,但只有一台,如果我自己摔坏了,就没办法了。
构成
容器信息
IP地址可以是任何范围内的,以下是示例。
步骤
创建Docker的用户定义网络
$ docker network create --subnet=172.18.0.0/24 prometheus_nw
获取图像
$ echo "prom/prometheus prom/alertmanager google/cadvisor prom/node-exporter" | xargs -n 1 docker pull
请在 Prometheus 和 exporter 中分别配置必要的设置文件。我们假设这些文件位于 /home/prometheus 目录下。如果需要更改,请同时修改启动参数。
$ pwd
/home/prometheus
$ tree -L 2
.
├── alertmanager
│ ├── alertmanager.yml
│ └── data
└── prometheus
├── alerts.rule
├── data
└── prometheus.yml
4 directories, 3 files
global:
scrape_interval: 15s # By default, scrape targets every 15 seconds.
rule_files:
- alerts.rule
scrape_configs:
- job_name: node
static_configs:
- targets: ['172.18.0.3:9100']
- job_name: docker
static_configs:
- targets: ['172.18.0.6:8080']
ALERT InstanceDown
IF up == 0
FOR 5m
LABELS { severity = "page" }
ANNOTATIONS {
summary = "Instance {{ $labels.instance }} down",
description = "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."
}
设置发送警报的目标。
以下是发送到Gmail时的示例。
通过 Gmail 用 Alertmanager 发送电子邮件
如果针对每个应用程序设置密码时需要帮助
请使用应用密码进行登录
https://support.google.com/accounts/answer/185833?hl=zh-Hans
在这里创建密码
https://security.google.com/settings/security/apppasswords
route:
receiver: hogehoge-mail
receivers:
- name: hogehoge-mail
email_configs:
- to: "hogehoge@example.com"
from: "hogehoge@example.com"
smarthost: smtp.gmail.com:587
auth_username: "hogehoge@example.com"
auth_identity: "hogehoge@example.com"
auth_password: "brabrabrabra"
启动
$ docker run --name=prometheus-container -d --net=prometheus_nw --ip=172.18.0.2 -v /home/prometheus/prometheus:/prometheus prom/prometheus -config.file=/prometheus/prometheus.yml -alertmanager.url=http://172.18.0.4
$ docker run --name=node-exporter-container -d --net=prometheus_nw --ip=172.18.0.3 -v "/proc:/host/proc" -v /sys:/host/sys -v /:/rootfs prom/node-exporter -collector.procfs /host/proc -collector.sysfs /host/sys -collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"
$ docker run --name=alertmanager-container -d --net=prometheus_nw --ip=172.18.0.4 -v /home/prometheus/alertmanager:/alertmanager prom/alertmanager -config.file=/alertmanager/alertmanager.yml -web.external-url=http://alertmanager.example.com
$ docker run --name=cadvisor-container -d --net=prometheus_nw --ip=172.18.0.6 --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --detach=true google/cadvisor:latest
将Nginx配置以便能够查看用户界面。
upstream prometheus {
server 172.18.0.2:9090;
}
upstream alertmanager {
server 172.18.0.4:9093;
}
server {
listen 80
server_name prometheus.example.com;
location / {
proxy_pass http://prometheus;
auth_basic "Prometheus";
auth_basic_user_file ".htpasswd";
}
}
server {
listen 80
server_name alertmanager.example.com;
location / {
proxy_pass http://alertmanager;
auth_basic "AlertManager";
auth_basic_user_file ".htpasswd";
}
}
生成htpasswd文件
$ cd /etc/nginx/
$ sudo htpasswd -c .htpasswd prometheus
验证通过重新加载或重启Nginx,确保prometheus.example.com和alertmanager.example.com可以显示。
然后,我们可以根据个人需求修改设置、安装所需的内容,或使用 Grafana 创建仪表盘。
杂记
关于普罗米修斯
最近,监控服务器的方法有很多种,但据说最热门的是 prometheus。
prometheus 由自身和出口器(exporter)组成。
出口商清单
https://prometheus.io/docs/instrumenting/exporters/
为了运行prometheus,可以使用像apt等软件包管理系统进行安装,但由于它们相对较旧且麻烦,因此决定使用官方提供的docker映像。
顺便提一下,进入apt安装的Prometheus可能与最新版本和配置文件不同,所以在从现有的环境迁移到Docker镜像的Prometheus时需要注意。
Docker 上的 Prometheus
普罗米修斯公式的Docker镜像
https://hub.docker.com/u/prom/
如果仅需要启动 Prometheus,那就先执行这个。
使用Docker
https://prometheus.io/docs/introduction/install/#using-docker
可以使用主机端口,但是直接从外部访问exporter有点可怕。虽然可以通过iptables进行设置,但这次我们使用了Docker的用户定义网络。
另外,如果隨意連接到網絡上,IP地址將在每次啟動時更改。我認為這些部分在prometheus的設定中寫死了,所以需要固定這些地方。這些設置應在容器啟動時進行。我覺得如果一直保持連接到網絡上,則無法固定IP地址。
http://qiita.com/paihu/items/17aa47906dd2bf935a25
– 这是一个 Qiita 上有关于 paihu 的帖子,内容为 “17aa47906dd2bf935a25″。
http://qiita.com/takara@github/items/2349fff473474d7fcf47
– 这是一个 Qiita 上有关于 takara@github 的帖子,内容为 “2349fff473474d7fcf47″。
通过以下命令可以创建一个挂载监视容器的网络。可能只有这一个选项。通过指定这个网络来创建容器或在启动过程中连接到它。如果没有指定,则容器将进入默认的网络。
$ docker network create --subnet=172.18.0.0/24 prometheus_nw
关于Docker容器。
大致上的意思是这样的,当执行docker pull时,可以像下面这样(使用xargs进行简便写法)。
$ echo "prom/prometheus prom/alertmanager google/cadvisor prom/blackbox_exporter prom/node-exporter" | xargs -n 1 docker pull
解释
本次设置如下:将container设置为后缀,以避免与命令等混淆。
启动命令
普罗米修斯 (Pǔ xiū sī)
$ docker run --name=prometheus-container --net=prometheus_nw --ip=172.18.0.2 -d -v /home/prometheus/prometheus:/prometheus prom/prometheus -config.file=/prometheus/prometheus.yml -alertmanager.url=http://172.18.0.4
节点导出器
$ docker run --name node-exporter-container -d --net=prometheus_nw --ip=172.18.0.3 -v "/proc:/host/proc" -v "/sys:/host/sys" -v "/:/rootfs" prom/node-exporter -collector.procfs /host/proc -collector.sysfs /host/sys -collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"
请参考 https://github.com/prometheus/node_exporter
鉴于本次情况下正在运行 Docker,因此请按照 README 中的最后一部分进行启动。
警报管理器
UI的URL根据您的环境进行相应的调整。
$ docker run --name alertmanager-container -d --net=prometheus_nw --ip=172.18.0.4 -v /home/prometheus/alertmanager:/alertmanager prom/alertmanager -config.file=/alertmanager/alertmanager.yml -web.external-url=http://alertmanager.example.com
cAdvisor: cAdvisor监控
$ docker run --name=cadvisor-container --net=prometheus_nw --ip=172.18.0.6 --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --detach=true google/cadvisor:latest
Prometheus的配置
设定文件之类的,将会被放置在主机端。放置的位置可以任意选择。对于我个人而言,由于我原本是使用 apt 安装的 prometheus 用户,所以我将 prometheus 的设定暂时放在了 /home 目录下。
$ pwd
/home/prometheus
$ tree -L 2
.
├── alertmanager
│ ├── alertmanager.yml
│ └── data
└── prometheus
├── alerts.rule
├── data
└── prometheus.yml
4 directories, 3 files
普罗米修斯的设定本身
请提供网址参考
https://prometheus.io/docs/operating/configuration/:
https://prometheus.io/docs/introduction/getting_started/:
https://prometheus.io/docs/operating/configuration/:
https://prometheus.io/docs/introduction/getting_started/将以上链接分别翻译为中文:
https://prometheus.io/docs/operating/configuration/:
https://prometheus.io/docs/introduction/getting_started/:
以下是将node_exporter和docker拉取为设置的内容,如果增加或更改exporter,则需要相应修改此文件。
global:
scrape_interval: 15s # By default, scrape targets every 15 seconds.
rule_files:
- alerts.rule
scrape_configs:
- job_name: node
static_configs:
- targets: ['172.18.0.3:9100']
- job_name: docker
static_configs:
- targets: ['172.18.0.6:8080']
把警报规则写在另一个文件中。
可以查看的网址
https://prometheus.io/docs/zh-cn/alerting/rules/
如果 node_expoter 崩溃了,就发送一个警报的示例。我想要了解关于警报规则的知识。
ALERT InstanceDown
IF up == 0
FOR 5m
LABELS { severity = "page" }
ANNOTATIONS {
summary = "Instance {{ $labels.instance }} down",
description = "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."
}
AlertManager的配置
在这里设置发送警报的目标。
以下是通过Gmail发送的示例。
使用Gmail通过Alertmanager发送电子邮件。
https://www.robustperception.io/sending-email-with-the-alertmanager-via-gmail/
如果您希望为每个应用程序设置密码时需要帮助,请问如何提供帮助?
请使用应用密码进行登录
https://support.google.com/accounts/answer/185833?hl=zh-CN
在这里创建密码:
https://security.google.com/settings/security/apppasswords
因为其他情况也需要处理,所以要设置所需的通知接收方。通过使用 Prometheus 分配的 job 或标签,可以灵活地更改通知接收方和通知消息,因此需要巧妙处理。
route:
receiver: hogehoge-mail
receivers:
- name: hogehoge-mail
email_configs:
- to: "hogehoge@example.com"
from: "hogehoge@example.com"
smarthost: smtp.gmail.com:587
auth_username: "hogehoge@example.com"
auth_identity: "hogehoge@example.com"
auth_password: "brabrabrabra"
关于设定反映的问题
如果更改了通过Docker启动的Prometheus或Exporter的配置,只需要执行docker stop && docker start命令即可。
如果您的系统支持systemd,您可以像以前那样进行配置,然后使用systemctl restart命令进行重启,这也是一个好的选择。
启动的管理和更新
在Ubuntu 16.04.1中使用systemd进行启动管理,如果能够成功实现,则会变得更加方便。
自动启动容器
https://docs.docker.com/engine/admin/host_integration/
设定如下。必须删除运行命令中的 “-d” 或 “–detach=true”。
确保不要使用“-d”参数来运行“detached mode”。从“ExecStart”执行的命令需要在前台运行。
[Unit]
Description=prometheus container
Requires=docker.service
After=docker.service
[Service]
Restart=always
ExecStart=
ExecStart=/usr/bin/docker run --name=prometheus-container --net=prometheus_nw --ip=172.18.0.2 -v /home/prometheus/prometheus:/prometheus prom/prometheus -config.file=/prometheus/prometheus.yml -alertmanager.url=http://172.18.0.4
ExecStop=/usr/bin/docker stop -t 2 prometheus-container
ExecStopPost=/usr/bin/docker rm -f prometheus-container
[Install]
WantedBy=default.target
只要按照以下步骤进行,应用程序的更新就可以轻松完成。
$ docker pull prom/prometheus
$ sudo systemctl restart prometheus-container.service
不过根据下文,也许可以在ExecStartPre阶段进行拉取,但个人不太喜欢只重新启动而不更新,所以没有这样做。
使用systemd来管理docker容器
http://qiita.com/74th/items/e8dc1ac1295140413dc8
用户界面
为了能够查看UI,可以在nginx上进行适当的配置。以下是一个简单的示例。cadviser也有一个UI,如果想要确认cadviser的UI,也可以类似地添加。
为了防止易于被查看,我们简单地添加了基本认证。如果要使用grafana并将prometheus作为数据源指定使用,即使在这种情况下,也可以在grafana的配置中添加基本认证,没有问题。
upstream prometheus {
server 172.18.0.2:9090;
}
upstream alertmanager {
server 172.18.0.4:9093;
}
server {
listen 80
server_name prometheus.example.com;
location / {
proxy_pass http://prometheus;
auth_basic "Prometheus";
auth_basic_user_file ".htpasswd";
}
}
server {
listen 80
server_name alertmanager.example.com;
location / {
proxy_pass http://alertmanager;
auth_basic "AlertManager";
auth_basic_user_file ".htpasswd";
}
}
先创建一个.htpasswd文件。
$ cd /etc/nginx/
$ sudo htpasswd -c .htpasswd prometheus