• cAdvisor+InfluxDB+Grafana 搭建 Docker . Swarm集群性能监控平台


    1、基本概念

    ​ 既然是对Docker的容器进行监控,我们就不自己单独搭建cAdvisor、InfluxDB、Grarana了,本文中这三个实例,主要以Docker容器方式运行。

    本文中的案例会有四台机器,他们的Host和IP地址如下,四台机器的集群搭建可以参考<Centos7的Docker Swarm集群的简单实例>

    c1 -> 10.0.0.31
    c2 -> 10.0.0.32
    c3 -> 10.0.0.33
    c4 -> 10.0.0.34
    

    1.1、什么是cAdvisor?

    cAdvisor 为Docker容器用户提供了了解运行时容器资源使用和性能特征的工具。cAdvisor的容器抽象基于Google的lmctfy容器栈,因此原生支持Docker容器并能够“开箱即用”地支持其他的容器类型。cAdvisor部署为一个运行中的daemon,它会收集、聚集、处理并导出运行中容器的信息。这些信息能够包含容器级别的资源隔离参数、资源的历史使用状况、反映资源使用和网络统计数据完整历史状况的柱状图。

    1.2、什么是InfluxDB?

    InfluxDB 是一个开源分布式时序、事件和指标数据库。使用 Go 语言编写,无需外部依赖。其设计目标是实现分布式和水平伸缩扩展。

    其主要特色功能

    • 基于时间序列,支持与时间有关的相关函数(如最大,最小,求和等)
    • 可度量性:你可以实时对大量数据进行计算
    • 基于事件:它支持任意的事件数据

    InfluxDB的主要特点

    • 无结构(无模式):可以是任意数量的列
    • 可拓展的
    • 支持min, max, sum, count, mean, median 等一系列函数,方便统计
    • 原生的HTTP支持,内置HTTP API
    • 强大的类SQL语法
    • 自带管理界面,方便使用

    1.3、什么是Grafana?

    Graphite 是一款开源的监控绘图工具。可以实时收集、存储、显示时间序列类型的数据(time series data),有些类似Kibana的东西。

    以下是官方的说明

    • 用于可视化大型测量数据的开源程序,他提供了强大和优雅的方式去创建、共享、浏览数据。dashboard中显示了你不同metric数据源中的数据。
    • 常用于因特网基础设施和应用分析,但在其他领域也有机会用到,比如:工业传感器、家庭自动化、过程控制等等。
    • 有热插拔控制面板和可扩展的数据源,目前已经支持Graphite、Cloudwatch、Prometheus、InfluxDB、Elasticsearch。

    2、开始安装Docker性能监控组件

    2.1、创建一个overlay网络

    ​ 在docker 1.12以前, swarm集群需要一个额外的key-value存储(consul, etcd etc). 来同步网络配置, 保证所有容器在同一个网段中. 在docker 1.12已经内置了这个存储, 集成了overlay networks的支持。

    ​ 下面我们创建一个名为logging的overlay网络,用于后面的容器间相互通信。

    ➜ /Users/lion >docker network create --driver overlay logging
    451negncg10ahru13hgn2k9nt
    ➜ /Users/lion >docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    1299968d22b6        bridge              bridge              local
    60g7y3cbkdfe        docker-net          overlay             swarm
    4d7292be91ca        docker_gwbridge     bridge              local
    e1b111616be1        host                host                local
    dxo4vcd9mig1        ingress             overlay             swarm
    451negncg10a        logging             overlay             swarm
    bc0a8040cae6        none                null                local
    

    ​ 在docker network ls列表中,可以看到logging网络的SCOPEswarm,表示在整个swarm集群是生效的。如果是在多台主机的集群中,overlay网络在没有被使用的时候,只会在manage节点出现,使用后会自动同步到其他节点。

    2.2、安装InfluxDB 0.13

    ​ 我们第一个先安装 InfluxDB,在用于收集swarm性能数据

    docker service create --network logging 
    -p 8083:8083 -p 8086:8086 
    --mount source=influxdb-vol,type=volume,target=/var/lib/influxdb 
    --name=influxdb 
    --constraint 'node.hostname==c1' 
    tutum/influxdb
    

    8086用于Influxdb数据读写,8083用于数据库管理界面

    --constraint 'node.hostname==c1' 对服务进行约束,指定在c1机器上运行

    —mount 挂载一个类型为volume的目录到容器上,实现数据持久化。在c1上运行docker volume ls命令可以查看目录的情况,运行docker volume inspect influxdb-vol命令,可以查看目录的详细信息

    ​ InfluxDB容器创建成功后,可以通过http://10.0.0.31:8083/打开管理界面。点击右上角的齿轮图标,登录到InfluxDB数据库,默认用户名是root,密码是root,然后点击save进行保存

    ​ 创建cadvisor数据库,用于收集存储Docker Swarm的性能数据,在输入框输入CREATE DATABASE "cadvisor"然后按回车,执行命令。

    ​ 在输入框输入SHOW DATABASES,可以看到我们刚才创建的数据库

    2.3、安装cAdvisor 0.24.1

    ​ 创建cAdvisor容器,并连接到InfluxDB。​

    docker service create --network logging 
    --name cadvisor 
    -p 8080:8080 
    --mode global 
    --mount source=/var/run,type=bind,target=/var/run,readonly=false 
    --mount source=/,type=bind,target=/rootfs,readonly=true 
    --mount source=/sys,type=bind,target=/sys,readonly=true 
    --mount source=/var/lib/docker,type=bind,target=/var/lib/docker,readonly=true 
    google/cadvisor:v0.24.1 -storage_driver=influxdb -storage_driver_host=influxdb:8086 -storage_driver_db=cadvisor
    

    --mode global 在集群中的每个节点创建一个服务,能够收集每一台机器的docker性能数据

    --mount 挂载本地docker socket用于监控docker性能

    -storage_driver=influxdb 指定存储驱动,使cadvisor将数据存储到数据库中,更多存储插件,请参考这里

    -storage_driver_host=influxdb:8086 InfluxDB数据库的地址

    -storage_driver_db=cadvisor 数据库名称

    如果要指定用户名可以用-storage_driver_user参数,默认是root

    如果要指定密码可以用-storage_driver_password参数,默认是root

    cAdvisor运行以后,可以通过http://10.0.0.31:8080/查看到Docker运行的机器和容器情况。

    ​ 通过http://10.0.0.31:8080/docker/,可以看到Docker服务器的基本信息,如Host、镜像数据、窗口数据等情况。多刷新几次会发现,每次都是不同的Host Name,这是因为Docker Swarm会默认使用到集群的任意一台机器上。稍后我们会介绍如何通过Grafana获取指定机器的数据指标。

    ​ 验证cAdvisor是否已经向InfluxDB存入数据。打开http://10.0.0.31:8083/的InfluxDB管理界面,点击右上角Database切换到cadvisor数据库,然后在输入框输入SHOW MEASUREMENTS可以看到已经创建了很多个表。

    ​ 假如我们要查询CPU数据,可以在输入框输入select * from cpu_usage_system limit 100,可以看到结果集如下:

    2.4、安装Grafana

    ​ 安装Grafana,连接到InfluxDB容器

    docker service create --network logging 
    -p 3000:3000 
    --name grafana 
    -e INFLUXDB_NAME=cadvisor 
    -e INFLUXDB_USER=root 
    -e INFLUXDB_PASS=root 
    -e GF_SMTP_ENABLED=true 
    -e GF_SMTP_SKIP_VERIFY=true 
    -e GF_SMTP_HOST=smtp.163.com:25 
    -e GF_SMTP_USER=static@163.com 
    -e GF_SMTP_PASSWORD=fuck123 -e GF_SMTP_FROM_ADDRESS=static@163.com 
    --constraint 'node.hostname==elk2' 
    grafana/grafana
    

    默认admin的用户名和密码是admin/admin

    也可以通过-e "GF_SECURITY_ADMIN_PASSWORD=passwd"参数来指定一个admin用户名的密码

    2.5、登录到Grfana,并配置数据源

    ​ 运行起Grfana容器后,通过浏览器打开http://10.0.0.31:3000,输入用户名admin,密码admin进行登录

    ​ 点击左上角图标, 选择Data Sources, 然后点击Add data source,添加完以上信息后,点击Add,会看到提示Success Data source is working,如下图

    在Name输入influxdb_source

    在Type选择InfluxDB

    在Url输入http://influxdb:8086

    在Database输入cadvisor

    在User输入root

    在Password输入root

    2.6、配置Grafana的Docker监控

    ​ 现在是比较有趣的部分,让我们来用Grafana绘制,cAdvisor存储到InfluxDB的数据图表。

    2.6.1、Filesystem storage limit and usage

    ​ 点击左上角的图标,鼠标移动到Dashboard菜单,在展开的菜单中,点击New。然后在切换的页面中,点击Graph

    ​ 在接下来的页面中,点击图形的Panel Title,在弹出的菜单中选择Edit

    ​ 在General面板中的Title处,输入Filesystem storage limit and usage

    ​ 在Metrics面板的 Panel data source选择Influxdb_source,点击右侧的Add query

    A query:SELECT mean("value") FROM "fs_limit" WHERE "com.docker.swarm.node.id" = 'cjip6qvmbfvf4sk4wzc1a37h0' AND $timeFilter GROUP BY time($interval) fill(null)
    B query:SELECT mean("value") FROM "fs_usage" WHERE "com.docker.swarm.node.id" = 'cjip6qvmbfvf4sk4wzc1a37h0' AND $timeFilter GROUP BY time($interval) fill(null)
    

    其中cjip6qvmbfvf4sk4wzc1a37h0c1的nodeID,通过docker node ls可以获取到

    ​ 在Axes面板,Left Y->Unit->data(Metric)->bytes, Right Y->Unit->data(Metric),最后点击Graph右侧的X进行关闭,就可以看到状态了。

    2.6.2、CPU Usage

    ​ 鼠标移到屏幕左侧的三个小点,点击Add Panel,创建一个Graph绘图,点击图形的Panel Title,在弹出的菜单中选择Edit,在General面板的Title输入CPU Usage

    ​ 在Metrics面板选择influxdb_source数据源。

    ​ query的内容如下:

    A query:SELECT mean("value") FROM "cpu_usage_system" WHERE "com.docker.swarm.node.id" = 'cjip6qvmbfvf4sk4wzc1a37h0' AND "com.docker.swarm.task.name" = 'cadvisor.0' AND $timeFilter GROUP BY time($interval) fill(null)
    B query:SELECT mean("value") FROM "cpu_usage_system" WHERE "com.docker.swarm.node.id" = 'cjip6qvmbfvf4sk4wzc1a37h0' AND "com.docker.swarm.task.name" = 'influxdb.1' AND $timeFilter GROUP BY time($interval) fill(null)
    

    注意替换node.id

    com.docker.swarm.task.name是选择监控的容器名称,示例中只监控运行在c1机器上的cadvisorinfluxdb服务

    ​ 在Axes面板,Left Y->Unit->time->Hertz(1/s), Right Y->time->Hertz(1/s),最后点击Graph右侧的X进行关闭,就可以看到状态了,到现在我们已经产生两个给图如下:

    2.6.3、Memory Usage

    ​ 点击屏幕上的ADD ROW,继续创建一个Graph绘图,点击图形的Panel Title,在弹出的菜单中选择Edit,在General面板的Title输入Memory Usage

    ​ 在Metrics面板选择influxdb_source数据源,query如下:

    A query:SELECT mean("value") FROM "memory_usage" WHERE "com.docker.swarm.node.id" = 'cjip6qvmbfvf4sk4wzc1a37h0' AND "container_name" = 'cadvisor.0.4go1l7pbtq7gcgfxjcxhpzbtu' AND $timeFilter GROUP BY time($interval) fill(null)
    B query:SELECT mean("value") FROM "memory_usage" WHERE "com.docker.swarm.node.id" = 'cjip6qvmbfvf4sk4wzc1a37h0' AND "container_name" = 'influxdb.1.5mfb5qoownsfms9vkfgowlsaq' AND $timeFilter GROUP BY time($interval) fill(null)
    

    ​ 在Axes面板,Left Y->Unit->data(Metric)->bytes, Right Y->Unit->data(Metric),最后点击Graph右侧的X进行关闭。

    2.6.4、Network Traffic

    ​ 鼠标移到新创建这一行屏幕左侧的三个小点,点击Add Panel,创建一个Graph绘图,点击图形的Panel Title,在弹出的菜单中选择Edit,在General面板的Title输入Network Traffic

    ​ 在Metrics面板选择influxdb_source数据源,query如下:

    A query:SELECT mean("value") FROM "rx_bytes" WHERE "com.docker.swarm.node.id" = 'cjip6qvmbfvf4sk4wzc1a37h0' AND $timeFilter GROUP BY time($interval) fill(null)
    B query:SELECT mean("value") FROM "tx_bytes" WHERE "com.docker.swarm.node.id" = 'cjip6qvmbfvf4sk4wzc1a37h0' AND $timeFilter GROUP BY time($interval) fill(null)
    

    ​ 在Axes面板, Left Y->Unit->data rate->bytes/sec, Right Y->Unit->time->bytes/sec,最后点击Graph右侧的X进行关闭。

  • 相关阅读:
    JS 弹窗“是否删除”
    input file 保存图片
    Form之action提交不刷新不跳转
    checkbox实现单选
    最近的项目系之2——core3.0整合Autofac
    最近的项目系列1——core整合SPA
    最近的项目之开篇
    短信验证码“最佳实践”
    Asp.net core使用MediatR进程内发布/订阅
    记一次带层级结构列表数据计算性能优化
  • 原文地址:https://www.cnblogs.com/flyhgx/p/8572427.html
Copyright © 2020-2023  润新知