这篇要介绍的主题是 Docker ,因此这边我们先来介绍如何使用 Docker 来部署 Metricbeat。[1]
Elastic 官方在 Docker @ Elastic 发布了两种版本的 Metricbeat Docker Image,底层是使用 CentOS 7。
差别是什麽,老实说我稍微查了一下找不出差异,官方说授权的部份参考 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
由於 Metricbeat 在第一次运行之前,我们会需要执行下面两个动作:
这两动作我们需要执行 ./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:5601
与 elasticsearch:9200
的位置,要自己视情况修改成正确的 Kibana 与 Elasticsearch 的位置。
要开始运作 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 的部份能够存取得到。使用 Metricbeat 运行在 Docker Container 之中时,一般会有三大类要收集的 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_ptrace
与 dac_read_search
的 System capability。
这边要注意,上面提到的
/proc
、/sys
、System capabilies…等设定是针对 Linux 环境,不适用於 Windows 或 MacOS。
要使用 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 取得其他 Dockre Containre 所运作的服务的 Metrics 时,可以直接指定网路的位置,并且指定在相同的 docker network,让 Metricbeat 可以存取得到其他服务,或是可以使用 Metricbeat 的 Autodiscover 功能。
由於在 Container 的环境之中,机器可能会时常开关,能够动态的自动监控 Container 会比较实用,因此我们也就会以 Autodiscover 的介绍为主。
Metricbeat 的 Autodiscover 有支援两种 Provider - Docker
与 Kubernetes
,这篇会以 Docker 为主要说明。
由於 Docker provider 会监听 Docker events [3],在 Docker Container start
或 stop
的时候,去更新需监控机器的列表,因此相关设定上,可以依照 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"
...
}
}
}
}
这边可以用来当筛选条件的栏位也就是:
接下来是要在 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 的资讯了。
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
当 Metricbeat 把 Docker Container 相关的资讯开始进行收集後,我们就可以到 Kibana Observability 里的 Metrics Inventory 页面,并且选择 Docker Containers
的呈现方式,来检视 Docker Containers 里的各项服务的状态了。
Kibana Metrics 这边的操作,可以参考前一篇 09 - Metrics - 观察系统的健康指标 (3) - 使用 Metricbeat 掌握 Infrastructure 的健康状态 Host 篇 的介绍,这部份的差异不大,主要是 Docker 会有些特别针对 Docker 环境的数据检视方式,这部份有兴趣的读者可以再去探索看看。
查看最新 Elasticsearch 或是 Elastic Stack 教育训练资讯: https://training.onedoggo.com
欢迎追踪我的 FB 粉丝页: 乔叔 - Elastic Stack 技术交流
不论是技术分享的文章、公开线上分享、或是实体课程资讯,都会在粉丝页通知大家哦!
轻松的前言看完了,今天我们就来正式进入D3的世界吧! 本篇大纲: 基础介绍与运作原理、使用目的/优缺...
如果画面太小或看不清楚,可移驾至 https://www.youtube.com/watch?v=...
正文 今天要设定gitlab上的专案,让他们能够在git commit时自动打包成docker im...
原先的 browser 实作就已经包含了无痕模式的细部功能,像是禁止使用 Cookie,和不记录浏览...
由於我们在上一篇已经完成了成功载入班次的部分,接下来要做的当然是不正常的情况。虽然港铁间中会有事故,...