10 - Metrics - 观察系统的健康指标 (4/6) - 使用 Metricbeat 掌握 Infrastructure 的健康状态 Docker 篇

Metrics - 观察系统的健康指标 系列文章


本篇学习重点

  • 如何使用 Docker 来布署 Metricbeat
  • 使用 Metricbeat 在 Docker 环境中,如何取得宿主实体机器或是整体 Docker Containers 的系统 Metrics
  • 如何透过 Metricbeat 轻松的来掌握 Docker 环境内的各 Containers 运作服务的健康状态

使用 Docker 部署 Metricbeat

这篇要介绍的主题是 Docker ,因此这边我们先来介绍如何使用 Docker 来部署 Metricbeat。[1]

Docker Image

Elastic 官方在 Docker @ Elastic 发布了两种版本的 Metricbeat Docker Image,底层是使用 CentOS 7。

  • beats/metricbeat
  • beats/metricbeat-oss

差别是什麽,老实说我稍微查了一下找不出差异,官方说授权的部份参考 Subscription 页面,不过里面针对 Metricbeat 的部份没有描述到不同,不过大概可以确定的是 X-Pack 基本上是 Elastic License 的功能,所以 OSS 这个 Open Source 的版本应该是没有 X-Pack 的功能的,至於其他的部份可能要再另外深入挖掘才知道。

不过由於 Elastic License 目前已经很宽松了,除了是要提供 SaaS 的服务,不然不太会踩到 License 的问题,接下来会用一般 Elastic License 的版本来操作。

可以透过 docker pull 取得 Docker Image,让这个 image 下载到本机端。

docker pull docker.elastic.co/beats/metricbeat:7.15.0

透过 Docker 环境执行 Metricbeat 的 Setup

由於 Metricbeat 在第一次运行之前,我们会需要执行下面两个动作:

  • 在 Elasticsearch 设定好 Metricbeat 要使用的 Index Template
  • 在 Kibana 汇入 Metricbeat 内建好的 Dashboard

这两动作我们需要执行 ./metricbeat setup 的使令,所以在 Docker 的环境中,我们也要先单独执行一次这个指令:

docker run \
docker.elastic.co/beats/metricbeat:7.15.0 \
setup -E setup.kibana.host=kibana:5601 \
-E output.elasticsearch.hosts=["elasticsearch:9200"]

这边的 kibana:5601elasticsearch:9200 的位置,要自己视情况修改成正确的 Kibana 与 Elasticsearch 的位置。

使用 Docker 运行 Metricbeat

要开始运作 Metricbeat 也就是执行 docker run 并执行 metricbeat -e 的 Command:

docker run -d \
  --name=metricbeat \
  --user=root \
  --network=testnet \
  --volume="$(pwd)/metricbeat.docker.yml:/usr/share/metricbeat/metricbeat.yml:ro" \
  --volume="/var/run/docker.sock:/var/run/docker.sock:ro" \
  docker.elastic.co/beats/metricbeat:7.15.0 metricbeat -e \
  -E output.elasticsearch.hosts=["elasticsearch:9200"]  

启动时有几个参数可能会需要设置:

  • --user=root: 如果有使用 System Module 时,有些 socket 或是 system process 的资讯,会需要有足够的权限才能存取,这部份的权限管理会需要留意。
  • --volume: 若是有独立准备 metricbeat.yml 的 config 档,会需要 mount 到 /usr/share/metricbeat/metricbeat.yml 的路径上。
  • -E coutput.elasticsearch.hosts=: 如果没有在 metricbeat.yml 特别设定,要使用环境变数指定 Elasticsesarch 的位置时,也要记得加上。
  • --net=: 如果有要透过 Metricbeat 去收集其他运作在 Docker Container 内服务的 Metrics,要记得 Network 的部份能够存取得到。

在 Docker 环境中,Metricbeat 的设定方式

使用 Metricbeat 运行在 Docker Container 之中时,一般会有三大类要收集的 Metrics:

  1. 运行 Container 的实体主机的 System Metrics
  2. 每个 Docker Containers 的系统 Metrics
  3. 其他 Docker Containers 的服务 Metrics

以下我们分别来说明这些配置上的方式。

让 Metricbeat 在 Docker Container 内取得实体主机的 System Metrics

由於 System Module 针对不同的 Metricset 会从几个不同的系统位置取得资讯:

  • /proc: System Module 的许多资讯其实是来自这个 Linux proc filesystem 的位置。
  • /sys/fs/cgroup: System process 的 metricset 会从这个位置取得 process 的资讯。
  • /proc/net/dev: System network 的 metricset 会从这个位置取得网路的资讯。

因此我们会需要将这些主机实体位置,mount 到 Docker container 之中,让运作在 Docker container 内的 Metricbeat 可以存取得到实体主机的这些资讯。

ocker run \
	--user root --cap-add sys_ptrace --cap-add dac_read_search \
  --mount type=bind,source=/proc,target=/hostfs/proc,readonly \ 
  --mount type=bind,source=/sys/fs/cgroup,target=/hostfs/sys/fs/cgroup,readonly \ 
  --mount type=bind,source=/,target=/hostfs,readonly \
  docker.elastic.co/beats/metricbeat:7.15.0 -e -system.hostfs=/hostfs

上面的例子是把这些路径都 mount 在 container 内的 /hostfs 里,并且在取後执行 metricbeat 时,加上参数指定这个位置 -system.hostfs=/hostfs

另外如果有使用 System socket 的 metricset 时,因为需要较高的权限,我们会需要特别加上 sys_ptracedac_read_search 的 System capability。

这边要注意,上面提到的 /proc/sys、System capabilies…等设定是针对 Linux 环境,不适用於 Windows 或 MacOS。

使用 Metricbeat 取得整体 Docker Containers 的系统 Metrics

要使用 Metricbeat 来取得 Docker Containers 的资讯时,我们要使用的是 Metricbeat 里的 Docker module。

./metricbeat modules enable docker

并且在要在 metricbeat.yml 里,设定要收集的 docker metricsets,以及相关的配置。

metricbeat.modules:
- module: docker
  metricsets:
    - "container"
    - "cpu"
    - "diskio"
    - "healthcheck"
    - "info"
    #- "image"
    - "memory"
    - "network"
  hosts: ["unix:///var/run/docker.sock"]
  period: 10s
  enabled: true

这边要注意到,由於 docker module 会透过 /var/run/docker.sock 与 docker 沟通,所以我们如果是运行在 Docker container 内的 Metricbeat,我们也会需要把实体主机的 /var/run/docker.sock mount 到 docker container 内,让 Metricbeat 可以存取得到。

docker run -d \
  --volume="/var/run/docker.sock:/var/run/docker.sock:ro" \
  docker.elastic.co/beats/metricbeat:7.15.0 metricbeat -e \
  -E output.elasticsearch.hosts=["elasticsearch:9200"]  

使用 Metricbeat 取得其他 Docker Container 身上服务的 Metrics

要使用 Metricbeat 取得其他 Dockre Containre 所运作的服务的 Metrics 时,可以直接指定网路的位置,并且指定在相同的 docker network,让 Metricbeat 可以存取得到其他服务,或是可以使用 Metricbeat 的 Autodiscover 功能。

由於在 Container 的环境之中,机器可能会时常开关,能够动态的自动监控 Container 会比较实用,因此我们也就会以 Autodiscover 的介绍为主。

设置 Autodiscover 自动找寻需监控的机器 [2]

Metricbeat 的 Autodiscover 有支援两种 Provider - DockerKubernetes ,这篇会以 Docker 为主要说明。

由於 Docker provider 会监听 Docker events [3],在 Docker Container startstop 的时候,去更新需监控机器的列表,因此相关设定上,可以依照 Docker event 的资讯来进行筛选条件的设置,来决定哪些 container 要套用设定。

Docker event 的资讯如下:

{
  "host": "10.4.15.9",
  "port": 6379,
  "docker": {
    "container": {
      "id": "382184ecdb385cfd5d1f1a65f78911054c8511ae009635300ac28b4fc357ce51"
      "name": "redis",
      "image": "redis:3.2.11",
      "labels": {
        "io.kubernetes.pod.namespace": "default"
        ...
      }
    }
  }
}

这边可以用来当筛选条件的栏位也就是:

  • host
  • port
  • docker.container.id
  • docker.container.image
  • docker.container.name
  • docker.container.labels

接下来是要在 metricbeat.yml 当中,设定 Autodiscover,并且依照上面提到的筛选条件,来设定 condition,决定哪些 container 是我们的目标对象。

metricbeat.autodiscover:
  providers:
    - type: docker
      labels.dedot: true
      templates:
        - condition:
            contains:
              docker.container.image: redis
          config:
            - module: redis
              metricsets: ["info", "keyspace"]
              hosts: "${data.host}:6379"

以上面的例子,目标是只要 Docker Image 是使用 redis 的 containers,就会是我们 auto discover 的目标,并且会 Redis module 来收集这些 containers 里的资讯,相关的 Redis module 的设定,也会在 config 里面去指定。

如此一来,在使用 Docker 动态增加或减少特定服务的 containers 时,我们的 Metricbeat 就会自动的去监控并收集 Metrics 的资讯了。

使用 Docker Autodiscover Provider 的 Hints 让找机器更容易

Autodiscover 除了上述的使用 Docker event 方式来筛选之外,有提供针对 Docker Label 的标示来判定是否要监控的机制。

metricbeat.autodiscover:
  providers:
    - type: docker
      hints.enabled: true

要启用这项功能,要把 hints.enabled: true 打开。

并且当我们要运作一个 Docker Container 时,就可以指定 Autodiscover 定义好的标签 co.elastic.metrics,让 Metricbeat 能认得这些 Containers。

以下是 Nginx 的一个例子:

  co.elastic.metrics/module: nginx
  co.elastic.metrics/metricsets: stubstatus
  co.elastic.metrics/hosts: '${data.host}:80'
  co.elastic.metrics/period: 10s

另外这是 Apache Server 的例子,并且实际用 Docker Run 时,如何加上标签:

docker run \
  --label co.elastic.metrics/module=apache \
  --label co.elastic.metrics/metricsets=status \
  --label co.elastic.metrics/hosts='${data.host}:${data.port}' \
  --detach=true \
  --name my-apache-app \
  -p 8080:80 \
  httpd:2.4

在 Kibana 的 Metric Monitoring 掌握 Docker 环境的健康状态

当 Metricbeat 把 Docker Container 相关的资讯开始进行收集後,我们就可以到 Kibana Observability 里的 Metrics Inventory 页面,并且选择 Docker Containers 的呈现方式,来检视 Docker Containers 里的各项服务的状态了。

10-Kibana-Metrics-Inventory-Docker-Container

Kibana Metrics 这边的操作,可以参考前一篇 09 - Metrics - 观察系统的健康指标 (3) - 使用 Metricbeat 掌握 Infrastructure 的健康状态 Host 篇 的介绍,这部份的差异不大,主要是 Docker 会有些特别针对 Docker 环境的数据检视方式,这部份有兴趣的读者可以再去探索看看。

参考资料

  1. 官方文件 - Run Metricbeat on Docker
  2. 官方文件 - Metricbeat Autodiscover
  3. Docker events

查看最新 Elasticsearch 或是 Elastic Stack 教育训练资讯: https://training.onedoggo.com
欢迎追踪我的 FB 粉丝页: 乔叔 - Elastic Stack 技术交流
不论是技术分享的文章、公开线上分享、或是实体课程资讯,都会在粉丝页通知大家哦!


<<:  Day13 For回圈

>>:  大共享时代系列_009_共享农场

Day2-D3基础介绍

轻松的前言看完了,今天我们就来正式进入D3的世界吧! 本篇大纲: 基础介绍与运作原理、使用目的/优缺...

Episode 4 - 变数及型态

如果画面太小或看不清楚,可移驾至 https://www.youtube.com/watch?v=...

Day07,搭配gitlab-ci执行image auto build

正文 今天要设定gitlab上的专案,让他们能够在git commit时自动打包成docker im...

电子书阅读器上的浏览器 [Day27] 无痕模式

原先的 browser 实作就已经包含了无痕模式的细部功能,像是禁止使用 Cookie,和不记录浏览...

Whistle proxy

由於我们在上一篇已经完成了成功载入班次的部分,接下来要做的当然是不正常的情况。虽然港铁间中会有事故,...