乐趣区

关于docker:基于dockercompose搭建prometheus与grafana监控环境

手把手式小白入门 prometheusgrafana监控零碎搭建

整体架构

采集与监控流程

  • 存在一个具体的主机或者服务,存在一些能够被采集的指标,比方 linux 零碎下面的 CPU 内存等指标
  • 部署了对应服务或主机的采集程序 Exporter,该程序同时提供一个对外裸露的http 接口用于提供采集到的数据,通常是凋谢一个 http://{host}:{port}/metrics 接口
  • Prometheus负责定期数据收集,存储以及对外提供查问服务
  • grafana提供监控数据可视化面板(dashboard),用于监控数据精美展现

docker服务配置

新建 compose.yaml 如下

services:
  prometheus: 
    image: prom/prometheus:latest
    container_name: demo-prometheus
    restart: unless-stopped
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus-data:/prometheus
    networks:
      - demo
      
  grafana:
    image: grafana/grafana-enterprise:latest
    container_name: demo-grafana
    restart: unless-stopped
    ports:
      - "3000:3000"
    volumes:
      - grafana-data:/var/lib/grafana
      - grafana-config:/etc/grafana
    networks:
      - demo
  
  node-exporter:
    image: quay.io/prometheus/node-exporter:latest
    container_name: demo-node-exporter
    command:
      - '--path.rootfs=/host'
    network_mode: host
    pid: host
    restart: unless-stopped
    volumes:
      - '/:/host:ro,rslave'

networks:
  demo:
    name: "demo"
    external: false

volumes:
  grafana-data: {}
  grafana-config: {}
  prometheus-data: {}

提供三个服务

  • prometheus服务,用于收集 metrics 数据

    • 默认凋谢 9090 端口
    • ./prometheus.yml:/etc/prometheus/prometheus.yml:须要内部挂载一个配置文件到容器指定地位,用于定义采集服务的信息等(该文件前面会具体解释)
    • prometheus-data:/prometheus: 须要把保留的数据挂载进去,免得容器再次启动时数据失落

      通过执行如下命令能够大抵晓得数据卷地位,能够看到镜像定义的 volumes 的参数只有/prometheus

      启动命令中也看不到由别的什么须要长久化的数据门路,剩下的 /etc/prometheus//usr/share/prometheus/ 能够在查看后自行感觉是否挂载

      $ docker image inspect prom/prometheus:latest
      ...
      "Cmd": [
          "--config.file=/etc/prometheus/prometheus.yml",
          "--storage.tsdb.path=/prometheus",
          "--web.console.libraries=/usr/share/prometheus/console_libraries",
          "--web.console.templates=/usr/share/prometheus/consoles"
      ],
      "Image": "sha256:c306a8110e4d13dbe51ddeb37b0746b6238819256a338d1cc5d226e04b02a06a",
      "Volumes": {"/prometheus": {}
      },
  • grafana服务

    • 默认凋谢端口3000
    • volumes参数:

      查看容器信息如下,发现门路较多,所以目前只挂载 /var/lib/grafana 以及/etc/grafana

      $ docker image inspect grafana/grafana-enterprise
      ...
       "Env": [
           "GF_PATHS_CONFIG=/etc/grafana/grafana.ini",
           "GF_PATHS_DATA=/var/lib/grafana",
           "GF_PATHS_HOME=/usr/share/grafana",
           "GF_PATHS_LOGS=/var/log/grafana",
           "GF_PATHS_PLUGINS=/var/lib/grafana/plugins",
           "GF_PATHS_PROVISIONING=/etc/grafana/provisioning"
       ],
       "Cmd": null,
       "Image": "","Volumes": null,
  • node-exporter作为采集程序(prometheus组织官网提供专门用于采集主机服务指标的程序,能够采集CPU,内存,磁盘,网卡等性能数据)

    • 网络模式应用 host 模式以便获取到宿主机实在网卡信息
    • pid配置为 host 与宿主机应用雷同的 pid 命名空间,这样能够获取到宿主机所有程序信息
    • 以只读形式挂载零碎根目录到容器当中,用于获取零碎磁盘数据,否则容器外部获取的是容器外部磁盘信息导致数据谬误
    • 服务默认凋谢端口 9100,当初能够去浏览器拜访地址 http://127.0.0.1:9100/metrics 查看该服务采集到的零碎数据
    • metrics提供的数据模式如下

      第一行是 # HELP结尾,用于解释以后指标的含意

      第二行是 # TYPE 结尾,阐明以后指标的数据类型

      剩下的就是具体采集到的数据

      # HELP node_cooling_device_cur_state Current throttle state of the cooling device
      # TYPE node_cooling_device_cur_state gauge
      node_cooling_device_cur_state{name="0",type="Processor"} 0
      node_cooling_device_cur_state{name="1",type="Processor"} 0
      node_cooling_device_cur_state{name="10",type="Processor"} 0
      node_cooling_device_cur_state{name="11",type="Processor"} 0
      node_cooling_device_cur_state{name="12",type="intel_powerclamp"}

prometheus采集配置

与下面的 compose.yaml 文件雷同目录下,新建 prometheus.yml 文件,该文件会被挂载到 prometheus 容器当中

global:
  # 配置全局默认收集 metrics 距离
  scrape_interval: 15s
  # 当与内部零碎通信的时候,会把该配置下的 `label` 信息附加到数据中
  external_labels:
    monitor: 'codelab-monitor'

# 收集数据的配置
scrape_configs:
    # 定义收集 job 名称,此处采集 prometheus 本人自身的 metrics
  - job_name: 'prometheus'
    # 收集距离会笼罩下面的全局配置
    scrape_interval: 5s
    # 配置采集的 http 的接口地位,这个中央只须要填写 IP 和端口即可
    # 采集的时候 prometheus 会加上 url 门路拜访 http://localhost:9090/metrics 获取数据
    static_configs:
      - targets: ['localhost:9090']
  
  - job_name: 'host-node'
    static_configs: 
      - targets: ['172.17.0.1:9100']

host-node解释

  • 该采集程序是由 compose.yaml 文件中配置的服务 node-exporter 提供的,凋谢 9100 端口
  • 因为其处于 host 宿主机网络命名空间,而 prometheus 处于 docker 外部的一个桥接网络 demo 网络环境中,所以不能通过 127.0.0.1 或者 node-exporter 拜访到对应的 node-exporter 采集程序,所以 targets 参数须要填写 docker0IP来示意宿主机网络空间下的prometheus

    查看 docker0IP如下,个别在 linux 上装置 docker 之后,默认 docker0 网卡的 IP 是固定的 172.17.0.1,其余操作系统或环境可能是别的IP,此处配置须要具体注意,依照理论的IP 地址批改

    $ ip addr show docker0 
    14: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
        link/ether 02:42:49:57:88:25 brd ff:ff:ff:ff:ff:ff
        inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
           valid_lft forever preferred_lft forever

服务启动

$ docker compose up -d
[+] Running 7/7
 ⠿ Network demo                   Created          0.1s
 ⠿ Volume "prom_prometheus-data"  Created          0.0s
 ⠿ Volume "prom_grafana-data"     Created          0.0s
 ⠿ Volume "prom_grafana-config"   Created          0.0s
 ⠿ Container demo-grafana         Started          0.5s
 ⠿ Container demo-node-exporter   Started          0.2s
 ⠿ Container demo-prometheus      Started          0.4s

查看 docker 网络命名空间

$ docker network ls
NETWORK ID     NAME     DRIVER    SCOPE
61ff0fdec0df   demo     bridge    local
0812cab7929c   host     host      local
....

查看 demo 网络命名空间外面的容器

$ docker network inspect demo
[
    {
        "Name": "demo",
        ....
        "Containers": {
            "774dd4e703f541872b5ed513996020c4e2239694663df62b50c5c83451938368": {
                "Name": "demo-grafana",
                "EndpointID": "73c2c67e833446363cdde52b2536d9981ca6b813342638697616bfce42bc1e6f",
                "MacAddress": "02:42:c0:a8:a0:02",
                "IPv4Address": "192.168.160.2/20",
                "IPv6Address": ""},"ed204573a64bc2601f4310cb5dbfe4952ac1c2b310a218ced63b578ff6ef49dc": {"Name":"demo-prometheus","EndpointID":"f8e4f5c42ccfdd2387f9a76392f3e6bbcbba1efe850a8392fdcbf47cafe29a09","MacAddress":"02:42:c0:a8:a0:03","IPv4Address":"192.168.160.3/20","IPv6Address":""}
        },
        ....
]

查看 docker host 网络命名空间的容器

$ docker network inspect host
[
    {
        "Name": "host",
        ...
        "Containers": {
            "bde02aced39fd6bfc6017647b05d187d1eb94b5f7155cb026bead1cbc9038d19": {
                "Name": "demo-node-exporter",
                "EndpointID": "07d90ac1f8ebc897035c0cfde1b54210c85c442ea2125625c4f32090e3e28700",
                "MacAddress": "","IPv4Address":"",
                "IPv6Address": ""
            }
        },
        ...
    }
]

采集程序服务验证

  • prometheus服务自带采集程序,浏览器拜访地址 http://localhost:9090/metrics 查看是否返回数据
  • node-exporter凋谢端口 9100,浏览器拜访地址 http://localhost:9100/metrics 查看是否返回数据

grafana减少dasboard

拜访 http://localhost:3000/ 进入到 grafana 登录页面,输出账号密码 admin/admin 登录

导航到 Configuration/Data Sources,新增一个data source,点击Add data source 按钮之后在弹出的列表当中抉择Prometheus

填写根本的名称参数以及 Prometheus 的地址

因为 grafana 以及 prometheus 都处于 dockerdemo网络环境中,所以在填写 prometheusIP地址时须要间接填写 prometheus 进行拜访

填写实现之后点击最上面的 Save & test 按钮

最初点击 Dashboards 配置图表,发现有三个默认的图表,间接点击 import 即可

最初保留退出,去拜访 Dashboards/Browse 查看图表

目前因为 Grafana metrics 没有被蕴含到 prometheus 的采集配置 yml 文件中,所以该图表是没有数据的,当初能够点击 Prometheus 2.0 stats 查看图表

grafana减少 node exporterdashboard

首先去拜访 grafanadashboradshttps://grafana.com/grafana/dashboards/ 获取一个 node exporter 的配置 json 文件

之后回到 grafana 的页面点击 Import 按钮,在弹出的新页面中导入下载的 json,能够间接上传json 或者拖动 json 文件到页面

最初配置抉择数据源 Prometheus,配置实现之后点击Import 按钮

最初 Dashboard 的列表页面就新增实现了 Node Exporter Full 的选项,点击进去就看到了 node exporter 的数据图表

至此,服务启动与根本配置实现

参考浏览

prometheus/node_exporter我的项目仓库readme.md

Prometheus Getting Started官网文档

grafana图表库

退出移动版