zoukankan      html  css  js  c++  java
  • Docker容器监控

    利用docker compose组合应用并利用scale可以快速对容器进行扩充,而docker compose启动的服务容器都在同一台宿主机上,对于一个宿主机上运行多个容器应用时,容器的运行情况,如:CPU使用率,内存使用率,网络状态,磁盘空间等一系列随时间变化的时序数据信息,都需要进行了解,因此监控是必须的。 

    容器监控方案选择

    对于容器的监控方案可谓多种多样,除了docker本身自带的 docker stats 命令,还有Scout,Data Dog,Sysdig Cloud,Sensu Monitoring Framework,CAdvisor等都可以对容器进行监控。
    通过 docker stats 命令可以很方便的看到当前宿主机上所有容器的CPU,内存,以及网络流量等数据。但 docker stats 命令的缺点是只是统计当前宿主机的所有容器,为获取的数据是实时的,没有地方存储,也没有报警功能。

    img

    而Scout,Data Dog,Sysdig Cloud虽然都提供了教完善的服务,但是它们都是托管的服务且都是收费的,Sensu Monitoring Framework集成度较高,也免费,但是部署过于复杂,综合考虑选择CAdvisor做监控工具。

    CAdvisor出自Google,有点是开源产品,监控指标齐全,部署方便,而且有官方的docker镜像。缺点是集成度不高,默认只在本地保存2分钟数据。不过,可以加上InfluxDB存储数据,对接Grafana展示图表,比较便利搭建容器监控系统,数据收集和图表展示效果良好,对系统性能也几乎没什么影响。

    CAdvisor + InfluxDB + Grafana搭建容器监控系统

    CAdvisor

    CAdvisor是一个容器资源监控工具,包括容器的内存,CPU,网络IO,磁盘IO等,同时提供了一个WEB页面用于查看容器的实时运行状态。CAdvisor默认存储2分钟的数据,而且只是针对单物理机,不过,CAdvisor提供了很多数据集成接口,支持InfluxDB,Redis,Kafka,Elasticsearch等集成,可以加上对应配置将监控数据发往这些数据库存储起来。
    CAdvisor功能主要有两点,展示Host,容器两个层次的监控数据和展示历史变化

    InfluxDB

    InfluxDB是用Go语言编写的一个开源分布式时序,事件和指标数据库,无需外部依赖。
    由于CAdvisor默认只在本地保存最近2分钟的数据,为了持久化数据和统一收集展示监控数据,需要将数据存储到InfluxDB中。InfluxDB是一个时序数据库,专门用于存储时序相关数据,很适合存储CAdvisor数据,而且CAdvisor本身提供了InfluxDB集成的方法,在启动容器时指定配置即可。

    InfluxDB主要功能:

    • 基于时间序列,支持与时间有关的相关函数
    • 可度量性,可以实时对大量数据进行计算
    • 基于事件,支持任意的事件数据

    InfluxDB主要特点:

    • 无结构
    • 可以是任意数量的列
    • 可拓展
    • 支持min,max等一系列的函数,方便统计
    • 原生的HTTP支持,内置HTTP API
    • 强大的类SQL语法

    Granfana

    Grafana是一个开源的数据监控分析可视化平台,支持多种数据源配置(如InfluxDB,MySQL,Elasticserach,OpenTSDB,Graphite等)和丰富的插件及模板功能,支持图表权限控制和报警。

    Grafana主要特点

    • 灵活丰富的图形化选项
    • 可以混合多种风格
    • 支持白天和夜间模式
    • 多数据源

    CAdvisor负责收集容器随时间变化的数据
    InfluxDB负责存储时序数据
    Grafana负责分析和展示时序数据

    安装部署

    部署InfluxDB服务

    启动InfluxDB的服务容器:

    docker run -d --name influxdb -p 8086:8086 
    -v /data/influxdb:/var/lib/influxdb 
    --hostname influexdb 
    influxdb
    

    在容器中创建test数据库和root用户

    docker exec -it influxdb influx
    
    > CREATE DATABASE "test"
    > CREATE USER "root" WITH PASSWORD 'root' WITH ALL PRIVILEGES
    

    img

    部署CAdvisor

    启动CAdvisor的服务容器:

    docker run 
      --volume=/:/rootfs:ro 
      --volume=/var/run:/var/run:ro 
      --volume=/sys:/sys:ro 
      --volume=/var/lib/docker/:/var/lib/docker:ro 
      --volume=/dev/disk/:/dev/disk:ro 
      --publish=8080:8080 
      --detach=true 
      --name=cadvisor 
      google/cadvisor:latest 
      -storage_driver=influxdb 
      -storage_driver_host=influxdb:8086 
      -storage_driver_db=test 
      -storage_driver_user=root 
      -storage_driver_password=root
    

    服务容器起来后可通过浏览器访问 http:///ip:8080

    img

    部署Grafana

    启动Grafana服务容器:

    docker run -d -p 3000:3000 
    -v /data/grafana:/var/lib/grafana 
    --link=influxdb:influxdb 
    --name grafana grafana/grafana
    

    直接运行该命令后有可能会发现容器并没有启起来,通过 docker logs 命令会发现”mkdir: can’t create directory ‘/var/lib/grafana/plugins’: Permission denied“的错误,其实就是没有 数据卷对应的主机上 /data/grafana 的权限,可以在运行启动命令前先创建 /data/grafana 目录并给定权限777,或者通过”docker run —entrypoint “id” grafana/grafana“ 查看uid,gid,groups (默认为472),然后通过”chown -R 472:472 /data/grafana“修改权限。

    img

    Grafana正常启动后就可以 http://ip:3000 访问,出现以下的登录页面,初次访问需要修改密码,默认用户名密码为:admin/admin

    img

    Docker Compose集成部署

    准备docker-compose.yml文件

    version: '3.1'
    volumes:
      grafana_data: {}
    services:
      influxdb:
        image: influxdb
        restart: always
        environment:
          - PRE_CREATE_DB=cadvisor
        ports:
          - "8086:8086"
        expose:
          - "8090"
          - "8099"
        volumes:
          - ./data/influxdb:/data
      cadvisor:
        image: google/cadvisor
        links:
          - influxdb:influxdb-host
        command: -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxdb-host:8086
        restart: always
        ports:
          - "8080:8080"
        volumes:
          - /:/rootfs:ro
          - /var/run:/var/run:rw
          - /sys:/sys:ro
          - /var/lib/docker:/var/lib/docker:ro
      grafana:
        user: "104"
        image: grafana/grafana
        restart: always
        links:
          - influxdb:influxdb-host
        ports:
          - "3000:3000"
        volumes:
          - grafana_data:/var/lib/data
        environment:
          - HTTP_USER=admin
          - HTTP_PASS=admin
          - INFLUXDB_HOST=influxdb-host
          - INFLUXDB_PORT=8086
          - INFLUXDB_NAME=cadvisor
          - INFLUXDB_USER=root
          - INFLUXDB_PASS=root
    

    在docker-compose.yml文件目录运行以下命令启动服务:

    docker-compose up -d
    

    -d指定在后台启动,初次启动可以不加可以在控制台查看启动日志,当然后台启动也可以通过“docker-compose logs”进行查看启动日志。

    服务正常启动后就可以 http://ip:3000 访问Granafa,在Home Dashboard页面点击添加data source

    img

    配置InfluxDB连接信息,当然在配置连接信息前需要进入InfluxDB容器创建相应的cadvisor数据库和用户root/root

    在容器中创建cadvisor数据库和root用户

    docker exec -it influxdb-contianer-id influx
    
    > CREATE DATABASE "cadvisor"
    > CREATE USER "root" WITH PASSWORD 'root' WITH ALL PRIVILEGES
    

    配置连接InfluxDB连接:

    img
    img

    数据源配好之后可以回到Home Dashboard添加添加dashboard图表展示监控信息,Grafana提供了丰富的图片模板对监控数据进行展示。

    添加dashboard:
    img
    img
    可选模板:
    img
    编辑图表:
    img
    配置监控cadvisor容器的内存使用情况的图表展示,配置好之后点击保存就可以了。
    img

  • 相关阅读:
    记录一下最近面试的总结
    网络模块相关面试题
    JVM 之类加载器
    一段简单的关于字符串的 Java 代码竟考察了这么多东西
    LeetCode 链表题 ( Java )
    MD5 加盐加密
    SpringMVC 学习笔记
    [redis]dict和rehash
    [redis]SDS和链表
    [go]包和工程管理
  • 原文地址:https://www.cnblogs.com/coding-diary/p/12069675.html
Copyright © 2011-2022 走看看