【DevOps-监控】生产环境是如何落地一套全方位的监控系统的 (保姆级 4000字带你分析)

TodoCoder大约 11 分钟devopsdocker监控dockergrafanaprometheus

转载请注明:
作者:TodoCoder
出处: https://www.todocoder.com/posts/009.htmlopen in new window
公众号转载微信搜: TodoCoder

Docker监控系列文章
【DevOps-监控】Docker可视化监控原理及采集方案open in new window
【DevOps-监控】生产环境是如何落地一套全方位的监控系统的 (保姆级 4000字带你分析)open in new window
【DevOps-监控】生产环境是如何设计一个全方位的监控系统 (保姆级)open in new window

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

  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可视化监控原理及采集方案open in new window,详细的介绍过 cAdvisor 可以提供对容器的实时监控和性能分析,包括CPU、内存、磁盘、网络等方面的指标。

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

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

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

Docker监控系统
Docker监控系统

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

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

详细的安装方案

一、环境信息

软件版本说明
Ubuntu22.04.1IP: 192.168.111.37
Docker20.10.21
Prometheusbitnami/prometheus:2.45.0开放端口: 8093
node-exporterbitnami/node-exporter:1.6.1开放端口: 8092
cAdvisortodocoder/cadvisor:v0.47.2开放端口: 8091
Grafanagrafana/grafana:9.5.6开放端口: 8094

二、安装监控系统

1. cAdvisor 的安装与使用

cAdvisor的简介可以查看上一篇文章【Docker可视化监控原理及落地方案open in new window

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

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

由于 cAdvisor 镜像存放在谷歌的 gcr.ioopen in new window 镜像仓库中,国内无法访问到。我把最新版的打好的镜像放在了 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:8091open in new window 访问到 cAdvisor 的 Web 界面。

cAdvisor 查看容器监控

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

镜像资源使用情况
镜像资源使用情况

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

![镜像资源使用情况](/Users/bingju328/Documents/study/shipin/Video_download/app/text/md/lagoujiaoyu/由浅入深吃透 Docker/第1章-模块一:基础概念与操作//posts/devops/cadvisor5.png)

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

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

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

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

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/metricsopen in new window可以看到一些指标数据

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。open in new window

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

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

prometheus graph
prometheus graph

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

prometheus target
prometheus target

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: http://docs.grafana.org/installation/docker/#migrate-to-v51-or-lateropen in new window 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
grafana7

以上是Docker安装的流程,另外还有,docker-compose 一键安装脚本, 文末关注公众号回复 201 可获取一键部署源码和最新的模板数据

docker-compose
docker-compose
添加数据集

如图的流程

输入对应的prometheus 服务的地址

添加可视化页面

https://grafana.com/grafana/dashboards/8919-1-node-exporter-for-prometheus-dashboard-cn-0413-consulmanageropen in new window

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

http://192.168.111.37:3001/dashboardsopen in new window

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

https://grafana.com/grafana/dashboards/8919-1-node-exporter-for-prometheus-dashboard-cn-0413-consulmanageropen in new window

3. 打开页面看一下效果图
docker-node-exporter
docker-node-exporter
docker-node-exporter
docker-node-exporter

这个是修改后的显示页面,官方的是基于云服务商集群显示,最新修改后的json。关注公众号回复 201 可获取一键部署源码和最新的模板数据

docker-compose
docker-compose

结语

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

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

微信工号搜: TodoCoder

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

微信搜索关注公众号 TodoCoder 回复 201 可获取一键部署源码和最新的模板数据

可截图扫描关注
可截图扫描关注