大厂的监控系统是怎么做的? (保姆级 4000字带你分析)

  大家好,我是Coder哥,上一篇我们聊了 【DevOps-监控】 Docker可视化监控原理及采集方案,用的可视化方案是容器采集工具是 cAdvisor,但是 cAdvisor有个缺点是,数据并没有持久化,虽然能显示历史数据,但是只能显示2分钟以内的事实图像,这在生产上用还不完善,那么我们今天来聊个详细的全面的监控方案。我们先看以下几个问题:(本文主要基于Docker环境)

  1. 生产环境监控究竟需什么样的功能?
  2. 监控采集软件及方案介绍
  3. (开搞)详细的安装方案

那么我们先聊第一个问题

生产环境监控究竟需什么样的功能?

  我们试想一下,如果部署一个监控系统到生产环境,需要满足哪些功能呢?既然是监控,肯定需要监控我们的主机资源信息包括cpu,内存,网络,磁盘等信息吧,其次还得监控容器的相关资源信息,然后我们可能还需要历史数据 几周,几个月甚至几年的,那么监控到最后如果资源达到某个阈值或者OOM的时候,可以第一时间通知到正在结婚的,正在睡觉的,正在......的你。那么我们总结一下上面的功能:

  1. 监控主机的CPU、内存、磁盘、网络等方面的指标
  2. 监控容器的CPU、内存、磁盘、网络等方面的指标
  3. 指标数据持久化
  4. 指标数据可视化展示
  5. 资源达到某个阈值需要做预警通知(这个这篇不详细展开只预留功能入口)

那么基于上面的这些功能,我们来看看怎么选型?

监控采集软件及方案介绍

  通过上面的介绍我们知道了一个完善的监控大概都需要什么功能,那么接下来我们就开始选合适的软件,这里就直接给结果了,这些是我们k8s里面线上用的一套,当然这些也可以适用于Docker。

  1. 主机监控: 可以选 node-exporter,node_exporter 就是抓取用于采集服务器节点的各种运行指标,目前 node_exporter 支持几乎所有常见的监控点,比如 conntrack,cpu,diskstats,filesystem,loadavg,meminfo,netstat 等。

  2. 容器监控: 说到容器监控我们自然会想到 cAdvisor,上篇文章【DevOps-监控】 Docker可视化监控原理及采集方案,详细的介绍过 cAdvisor 可以提供对容器的实时监控和性能分析,包括CPU、内存、磁盘、网络等方面的指标。

  3. 指标数据持久化: Prometheus Server 用于抓取指标、存储时间序列数据, 可以从满足 prometheus 格式要求的 /metrics 接口中获取所需数据并进行持久化存储。目前大部分采集软件都支持。

  4. 指标数据可视化展示: 这个肯定选grafana, grafana是与prometheus 配套的可视化监控软件,支持各种维度各种形状的可视化组件。

  5. 预警通知:预警通知,可以用premetheus的预警模块:alertmanager,它可以通过 Email、Wechat(Robot)、Dingtalk(webhook)等方式来接受警报通知。

Docker监控系统 如图所示,我们可以通过 node-exporter 可以获取主机数据,cAdvisor 获取主机上的镜像信息,prometheus 定时调用node-exportercAdvisor/metrics 接口获取数据并存储到磁盘,然后grafana展示的时候直接从 prometheus里面获取数据进行展示。我们还可以在premetheus alertmanager 配置相应的规则,当数据达到一定的阈值的时候触发预警策略。

通过上面的了解我们大概知道监控的逻辑是什么样了,那么我们如果基于Docker的话要如何落地实施呢?下面我们来看一下详细的安装脚本及一键部署脚本。

详细的安装方案

一、环境信息

软件 版本 说明
Ubuntu 22.04.1 IP: 192.168.111.37
Docker 20.10.21
Prometheus bitnami/prometheus:2.45.0 开放端口: 8093
node-exporter bitnami/node-exporter:1.6.1 开放端口: 8092
cAdvisor todocoder/cadvisor:v0.47.2 开放端口: 8091
Grafana grafana/grafana:9.5.6 开放端口: 8094

二、安装监控系统

1. cAdvisor 的安装与使用

cAdvisor的简介可以查看上一篇文章【【DevOps-监控】 Docker可视化监控原理及采集方案

下面我们以 cAdvisor 0.47.2 版本为例,演示一下 cAdvisor 的安装与使用。

cAdvisor 官方提供了 Docker 镜像,我们只需要拉取镜像并且启动镜像即可。

由于 cAdvisor 镜像存放在谷歌的 gcr.io 镜像仓库中,国内无法访问到。我把最新版的打好的镜像放在了 Docker Hub。你可以直接使用 docker pull todocoder/cadvisor:v0.47.2 命令从 Docker Hub 拉取。

首先使用以下命令启动 cAdvisor:

$ docker run \
-v=/:/rootfs:ro \
-v=/var/run:/var/run:ro \
-v=/sys:/sys:ro \
-v=/var/lib/docker/:/var/lib/docker:ro \
-v=/dev/disk/:/dev/disk:ro \
-p=8091:8080 \
-d=true \
--privileged=true \
--name=todocoder-cadvisor \
todocoder/cadvisor:v0.47.2

命令说明:

-v,--volume: 挂载本地目录到镜像内目录: 宿主机目录:容器目录

-p,--publish: 指定端口映射,格式为:主机(宿主)端口:容器端口

-d, --detach: 指定容器在后台运行,默认为 false

--privileged=true: 放开容器的权限

--name: todocoder-cadvisor 为容器指定一个名称,名字叫 todocoder-cadvisor ;

可以看到,cAdvisor 已经成功启动,我们可以通过 http://192.168.111.37:8091 访问到 cAdvisor 的 Web 界面。

cadvisor1.png

cAdvisor 查看容器监控

查看Docker容器的使用情况,可以访问 http://192.168.111.37:8091/docker/,在这个页面会显示Docker的基本信息和容器的运行情况,如图:

镜像资源使用情况

上图中的 Subcontainers 下会列出当前主机上Docker运行的所有容器,点击其中一个容器即可查看该容器的详细运行状态,如下图:

cadvisor5.png

cAdvisor的Web界面提供了容器的实时监控信息,包括CPU使用率、内存使用量、网络流量、磁盘IO等指标。你也可以通过界面上的图表和表格来查看这些指标的历史数据和趋势。

总体来说,使用 cAdvisor 监控容器具有以下特点:

  • 可以同时采集物理机和容器的状态;
  • 可以展示监控历史数据;

cAdvisor还提供了RESTful API http://192.168.111.37:8091/metrics,可以通过API获取容器的监控数据,Prometheus 可以通过这个接口来拉取数据。这里就不贴图了

2. 安装node-exporter

node-exporter 主要是用来收集主机的指标信息,比cAdvisor 的数据要全面,node_exporter 支持几乎所有常见的监控点,比如 conntrack,cpu,diskstats,filesystem,loadavg,meminfo,netstat 等。

node-exporter的安装和使用
docker run -d -p 8092:9100 --name todocoder-node \
  -v "/proc:/host/proc:ro" \
  -v "/sys:/host/sys:ro" \
  -v "/:/rootfs:ro" \
  --privileged=true \
  -v /etc/localtime:/etc/localtime \
  bitnami/node-exporter:1.6.1
  # -v /etc/localtime:/etc/localtime 解决时区问题

命令说明:

-v,--volume: 挂载本地目录到镜像内目录: 宿主机目录:容器目录

-p,--publish: 指定端口映射,格式为:主机(宿主)端口:容器端口

-d, --detach: 指定容器在后台运行,默认为 false

--privileged=true: 放开容器的权限

--name:todocoder-node 为容器指定一个名称,名字叫 todocoder-node ;

等待几秒钟,查看端口8092是否起来了

netstat -anpt  | grep 8092

打开页面 http://192.168.111.37:8092/metrics可以看到一些指标数据

3. 安装prometheus

Prometheus 主要是用于抓取指标、存储时间序列数据,对于普通应用只需要能够提供一个满足 prometheus 格式要求的 /metrics 接口就可以让 Prometheus 来接管监控,比如上面的 node-exporter 的 /metrics 接口,prometheus就可以直接应用。

prometheus的安装和使用

1、创建prometheus存储数据目录:

mkdir -p /data/prometheus/data
chmod 777 /data/prometheus/data

2、prometheus 配置文件挂载出来,方便修改,vi /data/prometheus/conf/prometheus.yml

rule_files:
  - rule/record/*.yml
scrape_configs:
  - job_name: "todocoder-prometheus"
    static_configs:
      - targets: ["192.168.111.37:8093"]
  - job_name: "todocoder-cadvisor"
    static_configs:
      - targets: ["192.168.111.37:8091"]
  - job_name: "todocoder-node37" # 这个是监控node
    static_configs:
      - targets: ['192.168.111.37:8092']

job_name: "todocoder-prometheus"配置抓取Prometheus自身相关指标;

job_name: "todocoder-cadvisor" 配置抓取之前配置的cAdvisor组件指标。

job_name: "todocoder-node37"配置抓取Node相关指标;

3、Docker部署Prometheus: docker pull bitnami/prometheus:2.45.0

docker run \
-d=true \
-p=8093:9090 \
--name=todocoder-prometheus \
-v=/data/prometheus/conf:/opt/bitnami/prometheus/conf \
-v=/data/prometheus/data:/opt/bitnami/prometheus/data \
bitnami/prometheus:2.45.0 \
--web.enable-lifecycle --web.enable-admin-api \
--config.file=/opt/bitnami/prometheus/conf/prometheus.yml \
--storage.tsdb.path=/opt/bitnami/prometheus/data

--web.enable-lifecycle --web.enable-admin-api提供rest api接口方式管理prometheus,比如配置热加载:curl -XPOST http://192.168.111.37:8093/-/reload。

注意:这里将prometheus配置文件和存储目录外挂出来,避免容器重启后数据丢失。

我们可以打开web页面:http://192.168.111.37:8093/graph 并输入 container_spec_memory_limit_bytes 查看数据:

prometheus1.png

我们在上面配置了三个 metrics指标,我们看一下效果 http://192.168.111.37:8093/targets

prometheus2.png

4. 安装Grafana

Grafana 是一跨平台的开源的可视化分析工具。目前网络架构和应用分析中最流行的时序数据展示工具,主要用于大规模指标数据的可视化展示。

它可以大大帮助你简化监控的复杂度,你只需要提供你需要监控的数据,它就可以帮你生成各种可视化仪表。同时它还有报警功能,可以在系统出现问题时通知你。

Grafana的安装和使用
docker run \
-d=true \
-p=3001:3000 \
-v=/data/grafana:/var/lib/grafana \
--name todocoder-grafana \
grafana/grafana:9.5.6

# 默认账号/密码:admin/admin
http://192.168.111.37:3001

如果有如下报错

You may have issues with file permissions, more information here: docs.grafana.org/installatio… mkdir: can't create directory '/var/lib/grafana/plugins': Permission denied

# 查询镜像用户ID
docker run --entrypoint "id" grafana/grafana:9.5.6
uid=472(grafana) gid=0(root) groups=0(root)

# 指定uid目录权限
chown -R 472:472 /data/grafana/
# 启动
docker restart todocoder-grafana

grafana7.png

以上是Docker安装的流程,另外还有,一键安装脚本

添加数据集

如图的流程

grafanaaddsource1.png

grafanaaddsource2.png

输入对应的prometheus 服务的地址

grafanaaddsource3.png

添加可视化页面

grafana.com/grafana/das…

1. 打开grafana dashboards页面 -> New -> import

grafanaimport1.png

2. 在import页面输入 官方的模版连接

grafana.com/grafana/das…

grafanaimport6.png

3. 打开页面看一下效果图

grafanaimport3.png

grafanaimport4.png

这个是修改后的显示页面,官方的是基于云服务商集群显示,最新修改后的模板和docker-compose一键部署脚本 地址

结语

本文详细介绍如何在生产环境中实施全套的监控方案,包括使用Docker进行容器化管理,利用Grafana进行可视化监控,使用Prometheus进行数据收集和分析,以及使用cAdvisor和Node-exporter监控容器资源。您将逐步了解每个工具的使用方法,并学会将它们整合到一起,以实现全面的生产环境监控。

感谢各位能看到这里,觉得文章有用的话记得关注一下,别忘了点赞收藏哦,最后打个小广告

微信工号搜: TodoCoder

会不定时分享 Java,Go,Docker,k8s等 技术文章,公号无广告,无推荐,纯分享

猜你喜欢

转载自juejin.im/post/7259945408762806332