作者:MeshCloud脉时云架构师 王亚勇
一 引言
近几年来,持续集成、微服务的影响范围不断扩大,微服务架构,已渐渐成为服务器架构的主流。但是在微服务、持续集成的作用下,将会产生成百上千的服务组件;而每个服务组件容器的生命周期管理工作日渐突出。为了提高对容器生命周期、使用内存、Cpu、负载等等指标刻不容缓,尽可能的细化每一个服务使用资源,提高整体资源利用率。传统开源监控系统如Nagios、Zabbix等,虽然这些监控系统支持自定义监控,但是做到如此精细化的监控每个容器相信整个过程会很麻烦。而与此同时Prometheus横空出世,简直是天降奇兵,展现出强大的优势。选择Prometheus,不是为了进行应用程序监视,而是为了更好地了解其某些硬件。我们还会获得容量和性能报告,以告诉我们何时遇到问题,并将其用于预测和增加硬件。
Prometheus优势
- 易于管理
- 轻易获取服务内部状态
- 高效灵活的查询语句
- 支持本地和远程存储
- 采用http协议,默认pull模式拉取数据,也可以通过中间网关push数据
- 支持自动发现
- 可扩展
- 易集成
Prometheus特性
- 多维数据模型:由度量名称和键值对标识的时间序列数据
- PromSQL:一种灵活的查询语言,可以利用多维数据完成复杂的查询
- 不依赖分布式存储,单个服务器节点可直接工作
- 基于HTTP的pull方式采集时间序列数据
- 推送时间序列数据通过PushGateway组件支持
- 通过服务发现或静态配置发现目标
- 多种图形模式及仪表盘支持(grafana)
整体架构
架构说明
- Server端: 提供http server, retrival, TSDB服务
- Special-Purpose exporters, 对多种不同设备,服务提供对应的exporters,参考: Exporters and integrations | Prometheus
- Alertmanager,提供告警规则设置,告警触发,告警分组、抑制,告警通知方式配置等功能
- 可视化组件, 支持自带web UI,grafana,API clients
技术简介
监控是整个产品周期中最重要的一环,随着用户的增多,服务随时可能会被系统oom如何判断web服务是因为用户访问过多达到了瓶颈? 还是程序代码bug导致的?及时预警减少故障避免影响扩大,根据历史数据可以追溯问题根源,并且分析监控数据,可以找出用户体验优化方案。
1.监控维度
- 系统监控 CPU,内存,磁盘,网卡流量,TCP状态,进程数。
- 应用监控 Nginx,Tomcat,PHP,MySQL,Redis 等。
- 日志监控 系统日志,服务日志,访问日志,错误日志。
- 安全监控 WAF,敏感文件监控。
- API监控 可用性,接口请求,响应时间。
- 流量分析 根据流量获取用户相关信息,例如:某页面访问状况,页面停留时间等。
2.监控目的
- 根据历史监控数据,实时反馈数据状态并做出预测
- 发生异常时,及时报警,做出相应措施
- 根据监控报警及时定位问题根源
- 通过可视化图表展示,便于直观获取信息
- 保证服务可靠性安全性,使业务持续稳定运行
实施步骤
- 准备工作
1.明确要查询指标所对应的exporter
2.找到该exporter中相关的指标,并确定该指标的数据类型
mkdir -p /promethues
mkdir -p /promethues/server
mkdir -p /home/promethues/client
- 安装Prometheus Server
wget
tar xvf prometheus-2.31.0.linux-amd64.tar.gz
mv prometheus-2.31.0.linux-amd64 Prometheus
more prometheus.yml
...scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090',’localhost:9100’]
- 创建系统服务
Vi /etc/systemd/system/prometheus.service
[Unit]
Description=prometheus
After=network.target
[Service]
Type=simple
ExecStart=/mnt/Prometheus/prometheus --config.file="/mnt/Prometheus/prometheus.yml" --storage.tsdb.retention.time=18250d --storage.tsdb.path=/data --web.enable-admin-api
LimitNOFILE=65536
PrivateTmp=true
RestartSec=2
StartLimitInterval=0
Restart=always
[Install]
WantedBy=multi-user.target
- 启动服务
systemctl daemon-reload
systemctl enable prometheus.service
systemctl start prometheus.service
- 访问
- 数据备份
/usr/bin/curl -XPOST
计划任务 crontab -e
0 1 * * * /usr/bin/curl -XPOST >>
/home/prometheusbackup.log
- Node_exporter安装配置
wget
tar xvf node_exporter-1.2.2.linux-amd64.tar.gz
mv node_exporter-1.2.2.linux-amd64 node_exporter
- 创建系统服务
vi /etc/systemd/system/node_exporter.service
[Unit]
Description=This is prometheus node exporter
[Service]
Type=simple
ExecStart=/opt/meshcloud/node_exporter/node_exporter --web.listen-address=:10009
ExecReload=/bin/kill -HUP
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
注意:node_exporter目录和配置存放在node_exporter目录下,指定路径不要出错
- 启动服务
Systemctl daemon-reload
Systemctl enable node_exporter.service
Systemctl start node_exporter.service
- 配置prometheus.yml
vim /mnt/Prometheus/prometheus.yml
- job_name: 'node_exporter'
static_configs:
- targets: ['localhost:9090', ’localhost:9100’'120.220.26.2:10009']
- 重启服务
Systemctal restart prometheus.service
TLS的引入和基本身份验证
由于 Metrics 在 Prometheus 中不被视为秘密,长期以来,通过 HTTPS 抓取指标的方法是使用反向代理。大多数的 /metrics 接口都是直接暴露出来的,没什么特别的安全措施,所以需要安全认证。
- 生成自签TLS证书
vi /mnt/node_exporter/mesh.cnf
[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
C = CN
ST = Beijing
L = Mesh
O = Private company
CN = *
[v3_req]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
basicConstraints = CA:TRUE
subjectAltName = @alt_names
[alt_names]
DNS.1 = *
DNS.2 = *.*
DNS.3 = *.*.*
DNS.4 = *.*.*.*
DNS.5 = *.*.*.*.*
DNS.6 = *.*.*.*.*.*
DNS.7 = *.*.*.*.*.*.*
IP.1 = 内网IP
IP.2 = 外网IP
- 生成证书
openssl req -x509 -batch -nodes -newkey rsa:2048 -keyout node_exporter.key -out node_exporter.crt -config mesh.cnf -days 1825
- 添加配置
vim /mnt/node_exporter/web.yml
tls_server_config:
cert_file: node_exporter.crt
key_file: node_exporter.key
basic_auth_users:
device_user1: $2b$12$7smxnPCjLtyzstbSMY9z8O0l2/H1rQa58U1NGVaQRGo3fUiTDFCnq
- 添加启动项
vim /etc/systemd/system/node_exporter.service
[Unit]
Description=This is prometheus node exporter
[Service]
Type=simple
ExecStart=/mnt/node_exporter/node_exporter --web.listen-address=:10009 --web.config=/mnt/node_exporter/web.yml
ExecReload=/bin/kill -HUP
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
- 启动服务
Systemctl start node_exporter.service
- 配置prometheus.yml
vim /mnt/Prometheus
- job_name: 'node_exporter'
scheme: https
basic_auth:
username: device_user1
password: 123456
tls_config:
insecure_skip_verify: true
ca_file: node_exporter.crt
static_configs:
- targets: ['IP:9100']
- 加载服务
killall -HUP prometheus
以上为加密,让监控更安全,成功!
- 基于文件服务自动发现监控
vi etc/prometheus/configs/sd_configs/device_user1.json
[
{
"labels": {
"service": "pcdn",
"env": "prod"
},
"targets": [
"IP地址:9100","IP地址:10009","IP地址:10009"
]
}
]
注:如果在有node节点,只需在这里添加即可,不同分组可以在 } 后边添加。
vi /mnt/Prometheus/prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'device_user1'
scheme: https
basic_auth:
username: device_user1
password: 123456
tls_config:
insecure_skip_verify: true
ca_file: /mnt/Prometheus/node_exporter.crt
file_sd_configs:
- files:
- '/etc/prometheus/configs/sd_configs/device_user1.json'
- 重启prometheus,node服务
systemctl restart node_exporter.service
killall -HUP prometheus
- 验证结果
六 常见问题
- 401问题
只要修改 Prometheus 的配置文件,为其增加 basic_auth的配置项即可。
- no data问题
导入官网下载的模板后发现内存使用率一直显示no data,解决方案:编辑内存使用率的panel,修改查询为如下:
(1 - (node_memory_MemFree_bytes{instance=~"$node"} / (node_memory_MemTotal_bytes{instance=~"$node"})))* 100