我正在努力发现和监控跨多个物理服务器的动态(即移动)容器,并将结果与容器服务关联起来,而不是运行它的代理所运行的服务器。
我有 2 台服务器:A 和 B;我有一个容器:C。C 可以在 A 或 B 上运行,我的编排引擎(Swarm、Kubernetes、Rancher 等)负责确保它至少在一个地方运行。
我在 A 和 B 上都有一个 zabbix 代理,因此我可以监控 CPU、文件系统、内存以及所有常见的东西。
我想监控两件事:
- C 的可用性。我不关心它在哪里,但我想知道它是否正在运行。
- 检查 C 中的进程。我有一个检查状态的脚本。
如何配置 Zabbix 和代理,以便它报告 C 及其进程的状态,而不管它在哪里运行?
我的假设是:
- 我将 C 视为主机,而不是 A 或 B。
- 我将 C 内部进程的发现及其状态指定为 C 的项目。
我的问题是:
- 如何将 C 设置为自动从 A 或 B 发现为主机?我可以使用自己的脚本或https://github.com/monitoringartist/Zabbix-Docker-Monitoring使用过滤器仅挑选我关心的容器。
- 如何设置进程检查以在 A 和 B 代理上运行?
简而言之,我如何将其设置为作为主机运行容器自动发现,然后对每个容器进行进程检查,以便它们在给定组/模式中的代理的每个服务器上运行,然后将输出关联到 C 容器而不是代理正在运行的 A 或 B 服务器?
编辑:感谢第一响应者,我理解了“元主机”的想法。但这又带来了新的问题:
- 如果我在创建 C“元主机”时必须添加 IP,那么我该如何创建它?它可以是 A 或 B 的 IP!
- 如何根据规则通过发现自动创建 C?
- 既然 Zabbix 会向 A 和 B 分别发出“运行这些测试”的通知,那么它如何知道是让 A 运行这些测试还是让 B 运行这些测试呢?
如果我能说“在‘Docker’组中的所有主机上运行发现”,这将更容易,这将发现所有 C(和 D 等)容器并将它们添加为主机。然后还说“在所有自动发现的容器上运行进程检查脚本”,也许通过知道哪个代理当前可以访问容器(即它现在在哪里运行)。
我越来越觉得 Zabbix 非常适合监控与特定服务器绑定的应用程序,而不太适合监控移动的应用程序?还是我误解了?
答案1
免责声明:我是https://github.com/monitoringartist/Zabbix-Docker-Monitoring
设立标准Zabbix-Docker-监控在 A 和 B 上。
编辑 Docker 模板 - 根据需要过滤发现的容器 + 删除任何触发原型。
创建新的计算项,将 A 和 B 中的每个 C 相关项聚合到新的 C 计算项中(您可以在 Zabbix 中创建 C“元主机”) - 在这些新的 C 指标之上设置新的触发器。
更新:使用计算项对于聚合 - 例如sum(docker.up[cid])
从 A 和 B 聚合 - 然后触发条件“容器 cid 未运行”将是sum(docker.up[cid])<1
。请阅读 Zabbix 文档以了解正确的语法。
LLD 会发现您的容器目前在哪里运行,并会相应地更新项目/触发器。如果您想消除任何错误警报,请不要忘记调整 LLD/触发器的时间。
答案2
自 Zabbix 版本 5 以来,Zabbix 代理 2可用。它在 Zabbix 中原生添加了 docker 监控支持。此代理或多或少是旧代理的替代品。安装后,将用户 zabbix 添加到受监控系统上的 docker 组,以使代理能够访问 docker 服务器。使用以下命令测试代理的 docker 可用性zabbix_get。这必须从允许访问的服务器完成。通常是 zabbix 服务器或代理。
$ zabbix_get -s some.host.tld -k docker.info
这应该返回一个包含 docker.info 数据的 json 输出。
测试成功后,转到 Zabbix 服务器上的配置。您有两种添加发现的选项 - 要么将模板添加到主机,要么将模板添加到您自己的模板之一(将 docker discover 添加到使用您模板的所有主机)。我们只讨论将模板添加到主机:打开主机的配置。添加Docker by Zabbix agent 2 模板导入Templates/Applications
到您的主机。如果您的 Zabbix 服务器上未安装模板,请转到链接并下载原始.yaml
文件并导入模板。如果您的 Zabbix 服务器较旧且已升级到版本 5 或更高版本,则模板可能不可用。这是因为Zabbix 永远不会升级您的模板。
添加模板后,将收集新项目。检查Latest Data
您的主机。