热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一键部署Prometheus,并预置仪表盘和数据源

【摘要】一键部署Prometheus+Grafana+cAdvisor+node-exporter,搭建主机或容器监控。利用grafana的provisioning方式,通过配置的

【摘要】一键部署Prometheus + Grafana + cAdvisor + node-exporter,搭建主机或容器监控。利用grafana的provisioning方式,通过配置的方式预置仪表盘和数据源。


零、前言


当中秋节遇上教师节,那就是双倍的祝福和快乐~~键客小盒子祝大家中秋节圆满!教师节快乐!

 

一、概述

Prometheus 是一个开源的系统监控和报警系统,现在已经加入到 CNCF 基金会,成为继 k8s 之后第二个在 CNCF 托管的项目,在 kubernetes 容器管理系统中,通常会搭配 prometheus 进行监控,同时也支持多种 exporter 采集数据,还支持 pushgateway 进行数据上报,Prometheus 性能足够支撑上万台规模的集群。
Grafana 是一个跨平台的开源的度量分析和可视化工具,可以将采集的数据可视化的展示,并及时通知给告警接收方。它主要有以下六大特点:
  • 展示方式:快速灵活的客户端图表,面板插件有许多不同方式的可视化指标和日志,官方库中具有丰富的仪表盘插件,比如热图、折线图、图表等多种展示方式;
  • 数据源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch 和KairosDB 等;
  • 通知提醒:以可视方式定义最重要指标的警报规则,Grafana 将不断计算并发送通知,在数据达到阈值时通过 Slack、PagerDuty 等获得通知;
  • 混合展示:在同一图表中混合使用不同的数据源,可以基于每个查询指定数据源,甚至自定义数据源;
  • 注释:使用来自不同数据源的丰富事件注释图表,将鼠标悬停在事件上会显示完整的事件元数据和标记。


node-exporter 可以采集机器(物理机、虚拟机、云主机等)的监控指标数据,能够采集到的指标包括 CPU, 内存,磁盘,网络,文件数等信息

cAdvisor对Node机器上的资源及容器进行实时监控和性能数据采集,包括CPU使用情况、内存使用情况、网络吞吐量及文件系统使用情况,cAdvisor集成在Kubelet中,当kubelet启动时会自动启动cAdvisor,即一个cAdvisor仅对一台Node机器进行监控。

二、监控逻辑图




三、部署说明

Prometheus的几种安装方式

  • 二进制安装
  • 容器安装(docker/k8s)
  • Helm安装
  • Prometheus Operator
  • kube-Prometheus Stack

镜像准备

    监控主机基础信息的镜像:docker pull prom/node-exporter:v1.3.1
    监控主机容器信息的镜像:docker pull zcube/cadvisor:v0.39.3
    收集主机信息的镜像:docker pull prom/prometheus:v2.33.5
    展示主机信息的镜像:docker pull grafana/grafana:8.4.3

    镜像打包

      docker save -o docker_images/node-exporter.tar node-exporter:v1.3.1
      docker save -o docker_images/cadvisor.tar cadvisor:v0.39.3
      docker save -o docker_images/prometheus.tar prometheus:v2.33.5
      docker save -o docker_images/grafana.tar grafana:8.4.3

      四、准备相关文件及脚本

       4.1 制作docker-compose-monitoring.yml文件

      version: "3.7"

      services:
        node-exporter:
          image: prom/node-exporter:v1.3.1
          container_name: bdyh-node-exporter
          restart: on-failure
          privileged: true
          deploy:
            resources:
              limits:
                memory: 1024M
              reservations:
                memory: 300M
          environment:
            TZ: Asia/Shanghai
          volumes:
            - /proc:/host/proc:ro
            - /sys:/host/sys:ro
            - /:/rootfs:ro
          ports:
            - "9100:9100"
          networks:
            - pk_net
        cadvisor:
          image: zcube/cadvisor:v0.39.3
          container_name: bdyh-cadvisor
          restart: on-failure
          privileged: true
          deploy:
            resources:
              limits:
                memory: 1024M
              reservations:
                memory: 300M
          environment:
            TZ: Asia/Shanghai
          volumes:
            - /:/rootfs:ro
            - /var/run:/var/run:ro
            - /sys:/sys:ro
            - /var/lib/docker/:/var/lib/docker:ro
            - /dev/disk/:/dev/disk:ro
            - /cgroup:/cgroup:ro      
          ports:
            - "9080:8080"
          networks:
            - pk_net
        prometheus:
          image: prom/prometheus:v2.33.5
          container_name: bdyh-prometheus
          restart: on-failure
          privileged: true
          deploy:
            resources:
              limits:
                memory: 1024M
              reservations:
                memory: 300M
          environment:
            TZ: Asia/Shanghai
          volumes:
            - /data/monitoring/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
          ports:
            - "9090:9090"
          depends_on:
            - node-exporter
            - cadvisor
          networks:
            - pk_net
        grafana:
          image: grafana/grafana:8.4.3
          container_name: bdyh-grafana
          restart: on-failure
          privileged: true
          deploy:
            resources:
              limits:
                memory: 1024M
              reservations:
                memory: 300M
          environment:
            TZ: Asia/Shanghai
          volumes:
            - /data/monitoring/grafana/grafana-storage:/var/lib/grafana
            #利用grafana的provisioning方式,通过配置方式添加datasource和dashboard,预置仪表盘和数据源
            - /data/monitoring/grafana/provisioning:/etc/grafana/provisioning
            - /data/monitoring/grafana/json:/tmp/dashboards
          ports:
            - "3000:3000"
          depends_on:
            - prometheus
          networks:
            - pk_net
      networks:
        pk_net:
          external: true


      注:利用grafana的provisioning方式,通过配置方式添加datasource和dashboard,预置仪表盘和数据源。

       4.2 配置文件及json文件

      prometheus.yml配置文件内容如下:

      global:
        scrape_interval:     60s
        evaluation_interval: 60s
       
      scrape_configs:
        - job_name: prometheus
          static_configs:
            - targets: ['bdyh-prometheus:9090']
              labels:
                instance: prometheus
        
        - job_name: linux
          static_configs:
            - targets: ['bdyh-node-exporter:9100']
        
        - job_name: docker
          static_configs:
            - targets: ['bdyh-cadvisor:8080']

      Docker主机监控.json 、Liunx主机监控.json从官网下载即可,需要调整里面的uid,自定义一个名称,此名称要和datasources.yaml文件中保持一样。如下示例:

          ...
            "datasource": {
              "type""prometheus",
              "uid""bdyh-prometheus-9090"
            }
          ...

      datasources下用于存放数据源的配置文件(可以配置多个),如下datasources.yaml所示:

      # # config file version
      apiVersion: 1

      # # list of datasources that should be deleted from the database
      deleteDatasources:
         - name: Prometheus
           orgId: 1

       # list of datasources to insert/update depending
       # on what's available in the database
      datasources:
          name of the datasource. Required
       - name: Prometheus
          datasource type. Required
         type: prometheus
          access mode. direct or proxy. Required
         access: proxy
          org id. will default to orgId 1 if not specified
         orgId: 1
          自定义UID,可以用于在配置的其他部分引用此数据源,如果没有指定,将自动生成
         uid: bdyh-prometheus-9090
          url
         url: http://bdyh-prometheus:9090
          database password, if used
         password:
          database user, if used
         user:
          database name, if used
         database:
          enable/disable basic auth
         basicAuth: false
          basic auth username
         basicAuthUser: ''
          basic auth password
         basicAuthPassword: ''
          enable/disable with credentials headers
         withCredentials: false
          mark as default datasource. Max one per org
         isDefault: false
          fields that will be converted to json and stored in json_data
         jsonData:
            graphiteVersion: "1.1"
            tlsAuth: false
            tlsAuthWithCACert: false
            httpHeaderName1: "Authorization"
          json object of data that will be encrypted.
         secureJsonData:
           tlsCACert: "..."
           tlsClientCert: "..."
           tlsClientKey: "..."
           
           httpHeaderValue1: "Bearer xf5yhfkpsnmgo"
         version: 1
          allow users to edit datasources from the UI.
         editable: true

      dashboards.yaml文件如下所示:

      apiVersion: 1
      providers:
       - name: 'default'
         orgId: 1
         folder: ''
         type: file
         updateIntervalSeconds: 10
         options:
           path: /tmp/dashboards

      注:/tmp/dashboards下放的是仪表盘的json文件。如:Docker主机监控.json和Liunx主机监控.json


       4.3 一键部署脚本

      过滤Docker是否存在此自定义网络脚本:install-network.sh

      #!/bin/bash
      ###############################################################
      # 作者:键客小盒子
      # 脚本名:install-network.sh
      # 时间:2022-09-10
      # 功能描述:过滤Docker是否存在此自定义网络
      ###############################################################
      echo -e '\n\n-----------------------执行install-network start-----------------------'
      echo ""
      #自定义一个网络名称变量
      network_name="pk_net"

      filterName=`docker network ls | grep $network_name | awk '{ print $2 }'`

      if [ "$filterName" == "" ]; then
          echo "不存在pk_net,将创建一个自定义的网络pk_net,如下所示:"
       echo ""
          #不存在就创建一个自定义的网络pk_net,此处的10.139可以自定义,不冲突即可
          sudo docker network create --driver bridge --subnet 10.139.0.0/16 --gateway 10.139.0.1 pk_net
      else
          echo "已存在网络pk_net"
      fi
      echo -e '\n\n-----------------------执行install-network end-----------------------'


      一键部署主机及容器监控:install-monitoring.sh

      #!/bin/bash
      ###############################################################
      # 作者:键客小盒子
      # 脚本名:install-monitoring.sh
      # 时间:2022-09-10
      # 功能描述:一键部署主机及容器监控(Prometheus+Grafana+cAdvisor+node-exporter)
      ###############################################################
      echo -e '\n\n-----------------------Docker install monitoring start-----------------------'
      cd `dirname $0`
      SH_PATH=`pwd`
      BASE_PATH=${SH_PATH%/*}
      echo ""
      echo ""
      echo "#########################################################"
      echo "# 导入监控镜像  -- 开始                                 #"
      echo "#########################################################"    
      sudo docker load -i ./docker_images/node-exporter.tar
      sudo docker load -i ./docker_images/cadvisor.tar
      sudo docker load -i ./docker_images/prometheus.tar
      sudo docker load -i ./docker_images/grafana.tar
      echo "#########################################################"
      echo "# 导入监控镜像  --  结束                                #"
      echo "#########################################################"

      echo ""
      echo ""
      echo "#########################################################"
      echo "# 创建docker自定义网络 -- 开始                          #"
      echo "#########################################################"
      #预先创建一个自定义的网络pk_net,此处的10.139可以自定义,不冲突即可
      sudo chmod u+x *.sh
      sudo bash ./install-network.sh
      sleep 2s
      echo "#########################################################"
      echo "##创建docker自定义网络 -- 结束                          #"
      echo "#########################################################"

      echo ""
      echo ""
      echo "#########################################################"
      echo "# 创建 monitoring目录 -- 开始                                #"
      echo "#########################################################"
           
      sudo mkdir -p $BASE_PATH/monitoring/prometheus
      sudo mkdir -p $BASE_PATH/monitoring/grafana/grafana-storage
      sudo mkdir -p $BASE_PATH/monitoring/grafana/provisioning
      sudo mkdir -p $BASE_PATH/monitoring/grafana/json
      sudo mkdir -p $BASE_PATH/docker-compose-file
      sudo cp ./monitoring/prometheus/prometheus.yml $BASE_PATH/monitoring/prometheus/prometheus.yml
      sudo cp -r ./monitoring/grafana/provisioning/* $BASE_PATH/monitoring/grafana/provisioning/
      sudo cp -r ./monitoring/grafana/json/* $BASE_PATH/monitoring/grafana/json/
      sudo cp -r $BASE_PATH/pkulaw/docker/docker-compose-monitoring.yml $BASE_PATH/docker-compose-file
      sudo chmod -R 777 $BASE_PATH/monitoring
      sudo chmod -R 777 $BASE_PATH/monitoring/grafana/grafana-storage
      echo "#########################################################"
      echo "# 创建 monitoring目录 -- 结束                                #"
      echo "#########################################################"

      echo ""
      echo ""
      echo "#########################################################"
      echo "# 根据实际路径调整docker-compose中的映射路径 -- 开始    #"
      echo "#########################################################"
      BASE_COMPOSE_URL1=$BASE_PATH/monitoring/prometheus
      BASE_COMPOSE_URL2=$BASE_PATH/monitoring/grafana
      sudo sed -i "s#/data/monitoring/prometheus#$BASE_COMPOSE_URL1#" $BASE_PATH/docker-compose-file/docker-compose-monitoring.yml
      sudo sed -i "s#/data/monitoring/grafana#$BASE_COMPOSE_URL2#" $BASE_PATH/docker-compose-file/docker-compose-monitoring.yml
      echo "#########################################################"
      echo "# 根据实际路径调整docker-compose中的映射路径-- 结束     #"

      echo ""
      echo ""
      echo "#########################################################"
      echo "# 安装 monitoring -- 开始                                    #"
      echo "#########################################################"
      docker-compose -p monitoring --compatibility -f $BASE_PATH/docker-compose-file/docker-compose-monitoring.yml up -d
      echo "#########################################################"
      echo "# 安装 monitoring -- 结束                                    #"
      echo "#########################################################"

      echo ""
      echo ""
      echo "#########################################################"
      echo "# monitoring开放端口 -- 开始                                 #"
      echo "#########################################################"
      sudo firewall-cmd --permanent --add-port=9100/tcp
      sudo firewall-cmd --permanent --add-port=9080/tcp
      sudo firewall-cmd --permanent --add-port=9090/tcp
      sudo firewall-cmd --permanent --add-port=3000/tcp
      sudo firewall-cmd --reload
      echo "#########################################################"
      echo "# monitoring开放端口 -- 结束                                 #"
      echo "#########################################################"
      echo -e '\n\n-----------------------Docker install monitoring end-----------------------'


      完整目录结构如下:


      注:上面grafana-storage文件是grafana的原有配置,保持不动挂载进去即可。

       4.4 一键部署

      $ chmod +x install-monitoring.sh
      $ ./install-monitoring.sh


      推荐阅读
      • 本文详细介绍如何在华为鲲鹏平台上构建和使用适配ARM架构的Redis Docker镜像,解决常见错误并提供优化建议。 ... [详细]
      • Flutter 核心技术与混合开发模式深入解析
        本文深入探讨了 Flutter 的核心技术,特别是其混合开发模式,包括统一管理模式和三端分离模式,以及混合栈原理。通过对比不同模式的优缺点,帮助开发者选择最适合项目的混合开发策略。 ... [详细]
      • 本文总结了一次针对大厂Java研发岗位的面试经历,探讨了面试中常见的问题及其背后的原因,并分享了一些实用的面试准备资料。 ... [详细]
      • 深入理解Dockerfile及其作用
        Dockerfile是一种文本格式的配置文件,用于定义构建Docker镜像所需的步骤。通过使用`docker build`命令,用户可以将Dockerfile中的一系列指令转换成一个可执行的Docker镜像。 ... [详细]
      • 高效的JavaScript异步资源加载解决方案
        本文探讨了如何通过异步加载技术处理网页中大型第三方插件的加载问题,避免将大文件打包进主JS文件中导致的加载时间过长,介绍了实现异步加载的具体方法及其优化。 ... [详细]
      • 在Java开发中,保护代码安全是一个重要的课题。由于Java字节码容易被反编译,因此使用代码混淆工具如ProGuard变得尤为重要。本文将详细介绍如何使用ProGuard进行代码混淆,以及其基本原理和常见问题。 ... [详细]
      • 电商高并发解决方案详解
        本文以京东为例,详细探讨了电商中常见的高并发解决方案,包括多级缓存和Nginx限流技术,旨在帮助读者更好地理解和应用这些技术。 ... [详细]
      • RTThread线程间通信
        线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
      • 尽管Medium是一个优秀的发布平台,但在其之外拥有自己的博客仍然非常重要。这不仅提供了另一个与读者互动的渠道,还能确保您的内容安全。本文将介绍如何使用Bash脚本将Medium文章迁移到个人博客。 ... [详细]
      • 本文总结了近年来在实际项目中使用消息中间件的经验和常见问题,旨在为Java初学者和中级开发者提供实用的参考。文章详细介绍了消息中间件在分布式系统中的作用,以及如何通过消息中间件实现高可用性和可扩展性。 ... [详细]
      • DirectShow Filter 开发指南
        本文总结了 DirectShow Filter 的开发经验,重点介绍了 Source Filter、In-Place Transform Filter 和 Render Filter 的实现方法。通过使用 DirectShow 提供的类,可以简化 Filter 的开发过程。 ... [详细]
      • vue引入echarts地图的四种方式
        一、vue中引入echart1、安装echarts:npminstallecharts--save2、在main.js文件中引入echarts实例:  Vue.prototype.$echartsecharts3、在需要用到echart图形的vue文件中引入:   importechartsfrom"echarts";4、如果用到map(地图),还 ... [详细]
      • 深入解析Pod中的容器关系
        容器之间的紧密协作如何实现?本文探讨了Kubernetes中Pod的概念及其在处理容器间超亲密关系中的作用。 ... [详细]
      • 微服务优雅上下线的最佳实践
        本文介绍了微服务上下线的正确姿势,避免使用 kill -9 等粗暴手段,确保服务的稳定性和可靠性。 ... [详细]
      • 为什么多数程序员难以成为架构师?
        探讨80%的程序员为何难以晋升为架构师,涉及技术深度、经验积累和综合能力等方面。本文将详细解析Tomcat的配置和服务组件,帮助读者理解其内部机制。 ... [详细]
      author-avatar
      heimao
      这个家伙很懒,什么也没留下!
      PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
      Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有