搭建容器監(jiān)控平臺(tái)
本節(jié),我們上手搭建容器監(jiān)控平臺(tái)。我們監(jiān)控 Docker 主機(jī)上運(yùn)行的容器狀態(tài),并監(jiān)控 cAdvisor 容器,如果此容器關(guān)閉,會(huì)觸發(fā)郵件告警。
1. 實(shí)戰(zhàn)
1.1. 新建目錄
創(chuàng)建如下目錄結(jié)構(gòu)。
1.2 編寫 prometheus 的配置文件 prometheus.yml
# 全局配置
global:
# 每5s收集一次數(shù)據(jù)
scrape_interval: 5s
# 每5s執(zhí)行一次告警規(guī)則檢測(cè)
evaluation_interval: 5s
# 標(biāo)記標(biāo)簽
external_labels:
monitor: 'monitor'
# 告警配置
alerting:
alertmanagers:
- static_configs:
- targets: ['alertmanager:9093']
# 指定規(guī)則配置文件
rule_files:
- rules/*.yml
# 數(shù)據(jù)抓取配置
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['prometheus:9090']
- job_name: 'cadvisor'
static_configs:
- targets: ['cadvisor:8080']
1.3 編寫 Prometheus 的告警規(guī)則 rule_1.yml
groups:
- name: rule-1
rules:
- alert: "服務(wù)運(yùn)行告警"
expr: up{job="cadvisor"} < 1
# 告警等待時(shí)間
for: 1m
labels:
severity: warning
annotations:
summary: "服務(wù)名: {{$labels.alertname}}"
description: "容器cadvisor已停止"
1.4 編輯 alertmanager 配置文件 config.yml
alertmanager 觸發(fā)告警后會(huì)發(fā)送郵件,我們需要先配置郵箱,這里以 QQ 郵箱為例。
登錄郵箱,選擇設(shè)置:
獲取郵箱授權(quán)碼:
Tips:
25 端口用于轉(zhuǎn)發(fā)郵件,沒有考慮認(rèn)證、加密等問題。587 端口專門被設(shè)計(jì)用來提交郵件,傳輸可以加密。這里我們使用 587 端口。
接下來編輯 alertmanager 配置文件 config.yml:
# 全局配置項(xiàng)
global:
resolve_timeout: 5m #處理超時(shí)時(shí)間,默認(rèn)為5min
smtp_smarthost: 'smtp.qq.com:587' # 郵箱smtp服務(wù)器代理,這里以qq郵箱為例
smtp_from: 'xxx@qq.com' # 發(fā)送郵箱名稱
smtp_auth_username: 'xxx@qq.com' # 郵箱賬號(hào)
smtp_auth_password: 'xxxxxxxxxxxx' # 郵箱授權(quán)碼
# 定義模板信息
templates:
- '/etc/alertmanager/templates/*.html'
# 定義路由樹信息
route:
group_by: ['alertname'] # 報(bào)警分組依據(jù)
group_wait: 10s # 最初即第一次等待多久時(shí)間發(fā)送一組警報(bào)的通知
group_interval: 10s # 在發(fā)送新警報(bào)前的等待時(shí)間
repeat_interval: 1m # 發(fā)送重復(fù)警報(bào)的周期 對(duì)于email配置中,此項(xiàng)不可以設(shè)置過低,否則將會(huì)由于郵件發(fā)送太多頻繁,被smtp服務(wù)器拒絕
receiver: 'email' # 發(fā)送警報(bào)的接收者的名稱,以下receivers name的名稱
# 定義警報(bào)接收者信息
receivers:
- name: 'email' # 警報(bào)
email_configs: # 郵箱配置
- to: 'aaa@xxx.com' # 接收警報(bào)的email配置
html: '{{ template "alert.html" . }}' # 設(shè)定郵箱的內(nèi)容模板
headers: { Subject: "[WARN] 報(bào)警郵件"} # 接收郵件的標(biāo)題
1.5 編輯告警郵件模板 alert.html
{{ define "alert.html" }}
<table border="1">
<tr>
<td>報(bào)警項(xiàng)</td>
<td>實(shí)例</td>
<td>報(bào)警內(nèi)容</td>
<td>開始時(shí)間</td>
</tr>
{{ range $i, $alert := .Alerts }}
<tr>
<td>{{ index $alert.Labels "alertname" }}</td>
<td>{{ index $alert.Labels "instance" }}</td>
<td>{{ index $alert.Annotations "description" }}</td>
<td>{{ $alert.StartsAt }}</td>
</tr>
{{ end }}
</table>
{{ end }}
1.6 編寫 DockerCompose.yml
version: "3.8"
services:
cAdvisor:
image: google/cadvisor:v0.33.0
container_name: cadvisor
restart: always
deploy:
resources:
limits:
cpus: '0.20'
memory: 500M
networks:
- monitor
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
- /dev/disk/:/dev/disk:ro
Prometheus:
image: prom/prometheus:v2.19.2
container_name: prometheus
restart: always
deploy:
resources:
limits:
cpus: '0.20'
memory: 500M
volumes:
- ./prometheus/conf:/etc/prometheus:ro
networks:
- monitor
depends_on:
- cAdvisor
ports:
- "9090:9090"
alertmanager:
image: prom/alertmanager:v0.21.0
container_name: alertmanager
restart: always
deploy:
resources:
limits:
cpus: '0.20'
memory: 500M
networks:
- monitor
ports:
- "9093:9093"
depends_on:
- Prometheus
volumes:
- ./alertmanager/conf/config.yml:/etc/alertmanager/config.yml
- ./alertmanager/templates:/etc/alertmanager/templates
command:
- '--config.file=/etc/alertmanager/config.yml'
- '--storage.path=/alertmanager'
- '--log.level=info'
Grafana:
image: grafana/grafana:7.0.5
container_name: grafana
restart: always
deploy:
resources:
limits:
cpus: '0.20'
memory: 500M
networks:
- monitor
environment:
- GF_SECURITY_ADMIN_PASSWORD=123456
depends_on:
- Prometheus
ports:
- "3000:3000"
networks:
monitor:
name: monitornet
driver: bridge
在 compose 配置文件中,我們配置了容器的 cpu 和內(nèi)存限制:
...
deploy:
resources:
limits:
# cpu最多使用20%
cpus: '0.20'
# 內(nèi)存最多使用500M
memory: 500M
...
需要使用--compatibility
兼容模式使它生效。
# 啟動(dòng)
docker-compose --compatibility up -d
# 移除
docker-compose --compatibility down
# 重啟
docker-compose --compatibility restart
1.7 配置 Grafana Dashboard 頁
docker-compose --compatibility up -d
啟動(dòng)之后,使用瀏覽器打開 http://127.0.0.1:3000, 即可訪問 grafana Web 頁面。
使用admin
和 123456
密碼(GF_SECURITY_ADMIN_PASSWORD
指定)登錄。
登錄成功后,配置數(shù)據(jù)源。
選擇 Prometheus 數(shù)據(jù)源:
填寫 Prometheus 地址:
保存配置:
選擇導(dǎo)入 Dashboard:
打開Grafana的官方Dashboard倉庫,找一個(gè)合適的樣式,下載下來。這里我們選擇了這個(gè):
回到 Grafana 管理頁面,將下載的 json 文件導(dǎo)入:
選擇 Prometheus 數(shù)據(jù)源:
import 導(dǎo)入即可看到容器監(jiān)控頁面。
2. 告警測(cè)試
打開 prometheus web UI 頁面 http://127.0.0.1:9090,點(diǎn)擊 alert 標(biāo)簽頁,查看監(jiān)控告警狀態(tài):
我們將監(jiān)控的容器 cadvisor 關(guān)掉。
docker stop cadvisor
幾秒后刷新頁面,發(fā)現(xiàn)告警進(jìn)入 Pending 暫掛狀態(tài):
一分鐘后(rule_1.yml 中 for = 1m 配置)告警進(jìn)入 firing 狀態(tài)。
查收告警郵件:
修復(fù)故障后恢復(fù)正常:
docker start cadvisor
3. 小結(jié)
本節(jié)構(gòu)建了一個(gè)具有郵件告警功能的容器監(jiān)控平臺(tái),由于篇幅有限,僅能在配置文件中,對(duì)一些基本常用的配置進(jìn)行解釋,還有其他更多更全的強(qiáng)大配置功能,需要讀者自行參考各個(gè)服務(wù)的官方文檔。