基于consul对接prometheus监控docker容器资源(代码片段)

author author     2023-02-09     268

关键词:

部署 cAdvisor

在被监控的Docker节点机器上启动cAdvisor服务,启动方式使用Docker启动:

docker run \\
  --volume=/:/rootfs:ro \\
  --volume=/var/run:/var/run:rw \\
  --volume=/sys:/sys:ro \\
  --volume=/var/lib/docker/:/var/lib/docker:ro \\
  --publish=8080:8080 \\
  --detach=true \\
  --name=cadvisor \\
  google/cadvisor:latest

参数说明:

  • –publish:端口映射,等价于 -p

  • –detach=true:后台运行,等价于 -d

检查服务是否正常启动:docker ps |grep cadvisor

页面访问:http://IP:8080

prometheus 自动发现

感兴趣的同学可以参考Prometheus Operator 通过 consul 实现自动服务发现文章中“ 配置 Prometheus 实现自动服务发现 ”章节。

consul服务

上面步骤中,我们已经完成cadvisor服务部署,我们现在现在使用consul api接口将信息存入 consul 中。

cat > wutf-test-docker-metrics.sh << EOF
#! /bin/bash
## cosul地址填写自己真实的地址,支持http/https
curl --location --request PUT  http://consul.middle:8500/v1/agent/service/register?replace-existing-checks=1 \\
 --header Content-Type: application/json \\
## token填写自己真实的信息
 --header "X-Consul-Token: fe48c9a4-1234-abcd-81df-9f28303012af" \\
 --data 
## 服务器名字
  "ID": "wutf-test",
## prometheus自动发现server name               
  "Name": "consul_exporter",   
  "Tags": [
## prometheus自动发现 tag
    "devops-ci"                  
  ],
## 被监控服务器地址
  "Address": "192.168.1.1", 
## cAdvisor服务监控接口        
  "Port": 8080,
## 自定义标签信息
  "Meta": 
    ## 定义项目信息                      
    "account": "tsp",
    ## 定义服务环境信息,dev/uat/prod
    "group": "dev",
    ## 定义路由报警标签
    "region": "docker-container",
    ## 服务器所在区,园区/公有云
    "vendor": "Newrizon",
    ## grafana看板使用的变量
    "addr": "192.168.1.1"
  ,
  "EnableTagOverride": false,
  "Check": 
## 被监控服务器监控指标获取
    "HTTP": "http://192.168.1.1:8080/metrics",
    "Interval": "10s"
  ,
  "Weights": 
    "Passing": 10,
    "Warning": 1
  

EOF

执行上面脚本:

sh wutf-test-docker-metrics.sh

成功后,我们登入consulconsulmanager即可看到consul_exporter下被监控主机的信息。

Grafana 数据看板

可参考使用docker container & OS node(node_exporter, cadvisor),按照自己实际情况进行更改。

主机部分监控

该主机上 docker 容器监控

告警规则

规则样例consul-docker-container-rules.yaml如下,有需要的同学可以参考下:

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  labels:
    app.kubernetes.io/name: kube-prometheus
    app.kubernetes.io/part-of: kube-prometheus
    prometheus: k8s
    role: alert-rules
  name: consul-docker-container-rules
  namespace: kubesphere-monitoring-system
spec:
  groups:
    - name: docker-container
      rules:
        - alert: ContainerCpuUsage
          expr: (sum by(account, group, region, vendor, instance, name) (rate(container_cpu_usage_seconds_totaljob="consul-endpoints", name=~.+[2m])) * 100) > 90
          for: 2m
          labels:
            severity: 警告
          annotations:
            summary: docker容器CPU使用率超过 90% 。
            description: 主机:  $labels.instance  上的 docker 容器  $labels.name  CPU使用率超过了 90%, 当前值:  $value 。

        #容器内存使用率高: 各个容器内存占用各自容器设置最大限制总内存的比例,(容器已经使用的/限制容器的最大使用内存),>90%
        - alert: ContainerMemoryUsage-各容器占用各自最大限制值比例
          expr: (sum(container_memory_working_set_bytesjob=consul-endpoints, name=~.+) by (account, group, region, vendor, instance, name) / sum(container_spec_memory_limit_bytesjob=consul-endpoints, name=~.+) by (account, group, region, vendor, instance, name) * 100 != +Inf)  > 90
          for: 2m
          labels:
            severity: 警告
          annotations:
            summary: Container Memory usaged 占用限制容器最大内存值超过了 90% 。
            description: 主机:  $labels.instance  上的 docker 容器  $labels.name   Memory usage占用限制容器最大内存比例超过90%,当前值:  $value 。

        #容器内存使用率高: 所有容器已使用的内存总和占用宿主机总内存的比例,(所有容器已经使用的总和/宿主机的总内存),>80%
        - alert: ContainerMemoryUsageAll-all容器已使用内存总和占用宿主机总内存比例
          expr: sum (container_memory_working_set_bytesjob=consul-endpoints, name=~.+) by(instance)/sum (machine_memory_bytes) by(instance) *100 > 80
          for: 2m
          labels:
            severity: 警告
          annotations:
            summary: 所有容器内存总和占用宿主机总内存超过 80% 。
            description: 所有容器内存总和占用宿主机 $labels.instance 总内存比例超过了80%, 当前值:  $value 。
        #注意: 只有上面表达式中加入了 by (instance),即by (标签名),下面 $labels.instance  才能调用到相关的某个主机实例的值

        #容器网络入口(接收)流量速率高(单位:字节/秒),每秒网卡接收多少字节数据,下面除以两个1024转换为M单位,by (标签):按主机实例,容器名,网卡接口划分,划分后,下面才能调用标签的值
        - alert: Netowork-receiveRate-各容器网络接收流量速率(流入速率)
          expr: sum(rate(container_network_receive_bytes_totaljob="consul-endpoints", image!=""[2m])) by (account, group, region, vendor, instance, name, interface)/1024/1024 > 100
          #上面也可使用类似表达式: sum(rate(container_network_receive_bytes_totalimage!=""[1m])) without (interface)
          for: 2m
          labels:
            severity: 警告
          annotations:
            summary: 容器入口(接收)流量过高。
            description: "容器名 $labels.name  的网卡接口 $labels.interface 在实例主机 $labels.instance  每秒入口流量过高,大于100M,当前值为: $value M "

        #容器网络出口(传输)流量速率高(单位:字节/秒),每秒网卡流出(传输)多少字节,下面除以两个1024转换为M单位,by (标签):按主机实例,容器名,网卡接口划分,划分后,下面才能调用标签的值
        - alert: Netowork-trasmitRate-各容器网络传输流量速率(流出速率)
          expr: sum(rate(container_network_transmit_bytes_totaljob="consul-endpoints", image!=""[2m])) by (account, group, region, vendor, instance, name, interface)/1024/1024  > 100
          #上面也可使用类似表达式: sum(rate(container_network_transmit_bytes_totalimage!=“”[1m])) without (interface)
          for: 2m
          labels:
            severity: 警告
          annotations:
            summary: 容器出口(传输)流量过高。
            description: "容器名 $labels.name  的网卡接口 $labels.interface 在实例主机 $labels.instance  每秒出口(传输)流量过高,大于100M,当前值为: $value M。 "

        #容器文件系统磁盘读取速率高(单位:字节/秒),每秒读取多少字节,下面除以两个1024转换为M单位,by (标签):按主机实例,容器名,网卡接口划分,划分后,下面才能调用标签的值
        - alert: Disk-Read-Rate-各容器文件系统磁盘读取速率
          expr: sum(rate(container_fs_reads_bytes_totaljob="consul-endpoints", image!=""[2m])) by (account, group, region, vendor, instance, name, device)/1024/1024 > 50
          #上面也可使用类似表达式: sum(rate(container_fs_reads_bytes_totalimage!=""[2m])) without (device)
          for: 2m
          labels:
            severity: 警告
          annotations:
            summary: 容器文件系统磁盘读取速率过高。
            description: "容器名 $labels.name  的磁盘分区 $labels.device 在实例主机 $labels.instance  每秒读取速率过高,大于50M,当前值为: $value M "

        #容器文件系统磁盘写入速率高(单位:字节/秒),每秒写入多少字节,下面除以两个1024转换为M单位,by (标签):按主机实例,容器名,网卡接口划分,划分后,下面才能调用标签的值
        - alert: Disk-Write-Rate-各容器文件系统磁盘写入速率
          expr: sum(rate(container_fs_writes_bytes_totaljob="consul-endpoints", image!=""[2m])) by (account, group, region, vendor, instance, name, device)/1024/1024 > 50
          #上面也可使用类似表达式: sum(rate(container_fs_writes_bytes_totalimage!=“”[1m])) without (device)
          for: 2m
          labels:
            severity: 警告
          annotations:
            summary: 容器文件系统磁盘写入速率过高。
            description: "容器名 $labels.name  的磁盘分区 $labels.device 在实例主机 $labels.instance  每秒写入速率过高,大于50M,当前值为: $value M "

        #运行容器的数量高(单位:个),实例宿主机上容器数量大于100个报警
        - alert: ContainerNumbers
          expr: count(container_last_seenjob="consul-endpoints", image!="") by (instance) > 100
          for: 1m
          labels:
            severity: 警告
          annotations:
            summary: 实例宿主机上运行容器数量过多。
            description: "实例宿主机 $labels.instance 上运行的容器数量过多,大于100个,当前值为: $value 个。"

部署上述规则文件:

kubectl apply -f consul-docker-container-rules.yaml

报警信息

告警对接飞书,钉钉或微信,可参考我原先的博客文章,这里不再重复叙述。

参考文档

20230315_使用consulmanager管理监控系列(代码片段)

...基于consul服务发现,只需要在consul中维护监控组件配置,prometheus就能够动态发现配置了。prometheus数据源的配置主要分为静态配置和动态发现,常用的为以下几类:1)static_configs:#静态服务发现2)file_sd_configs:#文件服务发现3)dns_sd_c... 查看详情

prometheus+grafana+consul+supervisor搭建监控系统之supervisor搭建(代码片段)

...ix+脚本监控已经不能满足需求,经过一段时间的研究发现prometheus+grafana+consul+supervisor非常不错,supervisor托管非daemod进程,动态注册到consul中,prometheus通过targets发现consul中的服务,Grafan中dataSource配置:Prometheus(http://xxx.xxx.xxx.xx 查看详情

prometheus+consul+grafana监控体系搭建1(代码片段)

Consul搭建(忽略,网上很多例子)Consul用Golang实现,因此具有天然可移植性(支持Linux、windows和MacOSX),它的安装包仅包含一个可执行文件,方便部署,与Docker等轻量级容器可无缝配合。consul启动方式:nohup./consulagent-server-ui-bootstrap-expe... 查看详情

prometheus部署及服务发现(代码片段)

文章目录一、Prometheus部署1.基础环境配置(两个主机都要做)2.安装启动Prometheus3.观察服务状态4.查看默认配置文件5.访问web页面6.部署其他被监控节点6.1启动服务6.2修改Prometheus配置文件6.3重启Prometheus,查看服务二、... 查看详情

prometheus+consul+grafana监控体系搭建1(代码片段)

Consul搭建(忽略,网上很多例子)Consul用Golang实现,因此具有天然可移植性(支持Linux、windows和MacOSX),它的安装包仅包含一个可执行文件,方便部署,与Docker等轻量级容器可无缝配合。consul启动方式:nohup./consulagent-server-ui-bootstrap-expe... 查看详情

20210810-基于centos7/linuxgrafana集成prometheus并实现对clickhouse监控(代码片段)

...境说明:三、安装步骤:1.配置ClickHouse集群对接Prometheus。2.安装Prometheus,Prometheus功能是负责收集各类系统的运行指标。3.安装Grafana,Grafana功能是负责指标数据可视化。4.Grafana集成Prometheus。一、目标:   1.Gr 查看详情

prometheus学习笔记

目录​​​PromQL1​​​​​聚合运算:1​​​​​二元运算:2​​​​​向量匹配:3​​​​​service_discovery(文件|DNS|consule)6​​​​​重新打标签7​​​​​对target重新打标:8​​​​​对抓取到的metric重新打标:11​... 查看详情

基于prometheus的监控

...能进行评估优化,所以其监控系统的建设显得尤为重要。Prometheus作为云原生时代最火的监控软件,很多大数据组件或原生或以第三方插件/exporter的形式对Prometheus做了支持。我使用的大数据平台是基于K8s运行的,有部署灵活管理... 查看详情

prometheus+grafana(代码片段)

一、Prometheus简介、容器监控的实现方对比虚拟机或者物理机来说比大的区别,比如容器在k8s环境中可以任意横向扩容与缩容,那么就需要监控服务能够自动对新创建的容器进行监控,当容器删除后又能够及时的从监控服务中删... 查看详情

基于docker部署prometheus监控平台(代码片段)

一、prometheus介绍Prometheus是一套开源的系统监控报警框架。Prometheus作为新一代的云原生监控系统,相比传统监控监控系统(Nagios或者Zabbix)拥有如下优点。易管理性Prometheus:Prometheus核心部分只有一个单独的二进制文件,可直接在... 查看详情

prometheus详解——prometheus原理与架构

...继续给大家介绍Linux运维相关知识,本文主要内容是Prometheus的原理与架构。一、Prometheus架构Prometheus的监控实现,是基于HTTP周期性的抓取被监控组件的状态,任意组件只要提供符合Prometheus定义的数据格式的HTTP接口... 查看详情

基于prometheus监控k8s集群

本文建立在你已经会安装prometheus服务的基础之上,如果你还不会安装,请参考:prometheus多维度监控容器如果你还没有安装库k8s集群,情参考: 从零开始搭建基于calico的kubenetes前言kubernetes显然已成为各大公司亲睐的容器编排... 查看详情

360基于prometheus的在线服务监控实践

...ttps://mp.weixin.qq.com/s/lcjZzjptxrUBN1999k_rXw 主题简介: Prometheus基础介绍Prometheus打点及查询技巧Prometheus高可用和服务发现经验 初衷 最近参与的几个项目,无一例外对监控都有极强的要求,需要对项目中各组件进行详细... 查看详情

基于prometheus的监控解决方案

一、前言    鄙人就职于某安全公司,团队的定位是研发安全产品云汇聚平台,为用户提供弹性伸缩的云安全能力。前段时间产品组提出了一个监控需求,大致要求:平台对vm实行动态实时监控,输出相应图表界面,并提供... 查看详情

细说metersphere基于prometheus实现的性能监控方案

...方文档,MeterSphere性能压测中的监控数据收集采用了Prometheus。但是它们是如何集成的?设计架构是如何设计的?很多人应该不清楚。这篇文章主要就是向大家介绍这相关的设计。Prometheus是什么?Prometheus是由SoundClo... 查看详情

基于prometheus搭建springcloud全方位立体监控体系

...现方案,这里做一次推演,详细记录一下整个搭建过程。Prometheus是什么Prometheus(普罗米修斯,官网是https://prometheus.io/),是一个开源的系统监控和告警的工具包,其采用Pull方式采 查看详情

极客时间运维进阶训练营第二十周作业-待完成

1、Prometheus基于consul实现服务发现,并总结服务发现过程2、Prometheus监控JAVA服务(Tomcat)、Redis、MySQL、HAProxy3、总结Prometheus基于exporter进行指标数据采集的流程4、Prometheus集合AlertManager实现邮件、钉钉、微信告警基于钉钉告警模板与... 查看详情

vmagent方便的prometheus存储兼容的agent

vmagent只是一个agent,实现了prometheus的remote_write协议,同时强大的地方是支持influx,opentsdb,graphite。。。协议 基于此以及VictoriaMetrics可以灵活的扩展监控的处理参考架构  说明vmagent的功能是很强大的,基于此我们可以... 查看详情