如何使用Zabbix官方模板轻松实现Docker容器监控?

2022-06-14 14:46:11 浏览数 (1)

感谢王军 ZCP(Zabbix 高级认证专家)翻译!欢迎投稿分享你的使用经验。

本文将介绍通过Zabbix监控Docker容器。使用官方模板 Docker by Zabbix agent2 template 很容易实现Docker容器监控。模板下载链接和配置步骤可以在 Zabbix 集成页面上找到。

目录

  1. 导入官方Docker模板
  2. 安装并配置Zabbix Agent2
  3. Zabbix Agent2 的特定插件配置
  4. 配置Docker主机
  5. Docker by Zabbix agent 2 template
  6. 验证主机和模板配置
  7. 运行中的Docker模板

导入官方Docker模板

导入Docker by Zabbix agent 2 template

因为要使用官方模板Docker by Zabbix Agent2。首先,我们需要确保这个模板在 Zabbix 中是可用的。*Zabbix 5.0、5.4和6.0**中都提供了该模板。如果你在 *配置->模板 中没有找到这个模板,很有可能是你在升级完Zabbix版本之后,没有将它导入到你的环境里。请记住,Zabbix 在升级过程中不会修改或导入任何模板,因此我们必须手动导入模板。这样的话,只需要从官方Zabbix git(或者直接点击这里)下载并通过使用 配置->模板 页面中的 Import 按钮将其导入到 Zabbix 实例中。

安装并配置Zabbix Agent2

在开始配置主机之前,我们应该先安装Zabbix agent2并按照模板指南来配置。可以按照Zabbix 网站下载页面中的步骤来安装 Zabbix-agent2。根据需要,可以灵活使用其他代理部署方法(比如从源文件编译安装代理)。

从软件包中安装 Zabbix agent2只需要几个简单的步骤:

安装 Zabbix 仓库包:

代码语言:javascript复制
rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/8/x86_64/zabbix-release-6.0-1.el8.noarch.rpm

安装Zabbix agent2软件包:

代码语言:javascript复制
dnf install zabbix-agent2

使用 Zabbix server/proxy 地址来设置 Server 参数。

代码语言:javascript复制
vi /etc/zabbix/zabbix_agent2.conf

### Option: Server
# List of comma delimited IP addresses, optionally in CIDR notation, or DNS names of Zabbix servers and Zabbix proxies.
# Incoming connections will be accepted only from the hosts listed here.
# If IPv6 support is enabled then '127.0.0.1', '::127.0.0.1', '::ffff:127.0.0.1' are treated equally
# and '::/0' will allow any IPv4 or IPv6 address.
# '0.0.0.0/0' can be used to allow any IPv4 address.
# Example: Server=127.0.0.1,192.168.1.0/24,::1,2001:db8::/32,zabbix.example.com
#
# Mandatory: yes, if StartAgents is not explicitly set to 0
# Default:
# Server=

Server=192.168.50.49

Zabbix Agent2 的特定插件配置

Zabbix agent2提供了特定的插件配置参数,通常情况下,与特定插件相关的参数都是可选参数。你可以在 Zabbix 文档中找到相关插件配置参数的完整列表。在新版本的Zabbix agent2中,特定插件的参数被定义在位于 /etc/zabbix/zabbix_agent2.d/plugins.d/ 下单独的插件配置文件中,而在旧版本中,它们直接在 zabbix_agent2.conf 文件中定义。

对于Zabbix agent2 Docker plugin(Docker监控插件),我们必须配置 Docker服务的 unix-socket 文件位置。可以通过下面这个插件参数实现:

代码语言:javascript复制
### Option: Plugins.Docker.Endpoint
# Docker API endpoint.
#
# Mandatory: no
# Default: unix:///var/run/docker.sock
# Plugins.Docker.Endpoint=unix:///var/run/docker.sock

默认安装的Docker 环境套接字位置是正确的——在这种情况下,你可以不用修改配置文件。

在对Zabbix agent2 配置文件做了必要的修改后,启动并启用代理:

代码语言:javascript复制
systemctl enable zabbix-agent2 --now

检查 Zabbix agent2是否运行:

代码语言:javascript复制
tail -f /var/log/zabbix/zabbix_agent2.log

在进入Zabbix前端页面之前,我想提醒你注意一下Docker socket文件权限——Zabbix 用户需要有访问 Docker Docker socket文件的权限。应该将 zabbix 用户添加到 docker 组中,来解决以下错误消息。

代码语言:javascript复制
[Docker] cannot fetch data: Get http://1.28/info: dial unix /var/run/docker.sock: connect: permission denied

ZBX_NOTSUPPORTED: Cannot fetch data.

可以通过执行以下命令将 zabbix 用户添加到 Docker 组:

代码语言:javascript复制
usermod -aG docker zabbix

配置Docker主机

配置Docker主机

导入模板之后,我们需要为Docker实例创建一个主机。设置主机名并分配主机组——我将把它分配给 Linux servers主机组。将 Docker by Zabbix agent 2模板关联到该主机。因为要使用Zabbix agent2模板来采集数据,所以需要在这个主机上添加一个代理接口。接口的地址是运行 Docker 容器的机器地址。单击 Add 按钮完成主机配置。

Docker by Zabbix agent 2 template

docker 模板常规监控项

模板包含一系列常规监控项,用于Docker实例通用指标监控,例如:可用镜像数量,Docker架构信息,容器的总数等等。

除此之外,该模板还使用LLD(低级别发现)规则采集容器和特定镜像的信息。一旦 Zabbix 发现了你的容器和镜像,这些LLD(低级别发现)规则将通过原型为每个容器和镜像创建监控项、触发器和图形。通过这种方法实现容器和特定镜像的指标监控,例如:容器内存、网络信息、容器状态等等。

Docker 模板LLD监控项原型

验证主机和模板配置

我们可以使用 Zabbix get 命令行工具来尝试轮询代理,以验证代理和主机配置是否正确。如果你还没有安装 Zabbix get,可以在 Zabbix server或 Zabbix proxy主机上这样来安装:

代码语言:javascript复制
dnf install zabbix-get

现在我们可以使用 zabbix-get 来验证我们的代理是否能够获得与 docker 相关的指标。执行以下命令:

代码语言:javascript复制
zabbix_get -s docker-host -k docker.info

使用 -s 参数指定你代理主机的IP或主机名, -k 参数定义了我们希望通过zabbix-get轮询代理来获取指标的键值。

代码语言:javascript复制
zabbix_get -s 192.168.50.141 -k docker.info

{"Id":"SJYT:SATE:7XZE:7GEC:XFUD:KZO5:NYFI:L7M5:4RGO:P2KX:QJFD:TAVY","Containers":2,"ContainersRunning":2,"ContainersPaused":0,"ContainersStopped":0,"Images":2,"Driver":"overlay2","MemoryLimit":true,"SwapLimit":true,"KernelMemory":true,"KernelMemoryTCP":true,"CpuCfsPeriod":true,"CpuCfsQuota":true,"CPUShares":true,"CPUSet":true,"PidsLimit":true,"IPv4Forwarding":true,"BridgeNfIptables":true,"BridgeNfIP6tables":true,"Debug":false,"NFd":39,"OomKillDisable":true,"NGoroutines":43,"LoggingDriver":"json-file","CgroupDriver":"cgroupfs","NEventsListener":0,"KernelVersion":"5.4.17-2136.300.7.el8uek.x86_64","OperatingSystem":"Oracle Linux Server 8.5","OSVersion":"8.5","OSType":"linux","Architecture":"x86_64","IndexServerAddress":"https://index.docker.io/v1/","NCPU":1,"MemTotal":1776848896,"DockerRootDir":"/var/lib/docker","Name":"localhost.localdomain","ExperimentalBuild":false,"ServerVersion":"20.10.14","ClusterStore":"","ClusterAdvertise":"","DefaultRuntime":"runc","LiveRestoreEnabled":false,"InitBinary":"docker-init","SecurityOptions":["name=seccomp,profile=default"],"Warnings":null}

此外,我们还可以使用LLD(低级别发现)键值— docker.containers.discovery[false] 来检查LLD(低级别发现)的结果。

代码语言:javascript复制
zabbix_get -s 192.168.50.141 -k docker.containers.discovery[false]

[{"{#ID}":"a1ad32f5ee680937806bba62a1aa37909a8a6663d8d3268db01edb1ac66a49e2","{#NAME}":"/apache-server"},{"{#ID}":"120d59f3c8b416aaeeba50378dee7ae1eb89cb7ffc6cc75afdfedb9bc8cae12e","{#NAME}":"/mysql-server"}]

我们可以看到 Zabbix 将发现并监控两个容器—apache-server and mysql-server。任何代理的LLD(低级别发现)规则或监控项都可以用 zabbix get 进行检查

运行中的Docker模板

在Docker主机上发现的监控项

现在我们已经配置了代理和主机,也应用了 Docker 模板,并验证了一切正常,在前端就能够看到已发现的实体对象。

采集到的Docker容器指标

另外,我们的指标数据也应该收集上来了。我们可以通过查看最新数据来验证数据是否采集正常。

从 Docker 模板继承宏

最后,有一些额外的选项能够进一步修改模板和LLD(低级别)发现的结果。如果你打开主机的宏并选择继承主机宏,你将看到从 Docker 模板继承了4个宏。这些宏用来过滤发现的容器和图像镜像。如果你希望根据自己的需求过滤这些被发现的实体,可以灵活修改这些值。

注意,在模板上容器发现监控项有一个false的参数:

  • docker.containers.discovery[false] – 只发现正在运行的容器
  • docker.containers.discovery[true] – 发现所有容器,不管是什么状态。

至此,我们成功地导入了模板,安装并配置了 Zabbix agent2,创建了一个主机,并应用了 Docker 模板。最终实现了在 Zabbix 中监控Docker 环境! 如果你有任何问题或建议,欢迎在留言交流。

0 人点赞