2018年6月19日 工程

Beats 推出基于提示的 Docker 和 Kubernetes 自动发现

作者 Carlos Pérez-Aradros

从 6.0 开始,我们开始为 Beats 添加新功能,改善对容器监测的支持。我们最近推出了一项新功能:在 [Filebeat] (https://www.elastic.co/cn/guide/en/beats/filebeat/6.3/configuration-autodiscover.html) 和 Metricbeat 中自动发现,支持 Docker 和 Kubernetes。自动发现允许您定义一组配置,当您希望运行这些配置时,Beats 就会动态启动它们。由于容器的动态特性,此功能对于监视容器特别有用。

容器监测的挑战

使用传统基础架构,您通常会设置一台新主机,配置所有服务在其上运行,并配置监测代理定期查询它们。配置管理工具有助于完成这项任务,但仍然属于非常静态的管理模式。

在容器架构中,一切都成了移动目标。部署是动态的,会增长、收缩和消失,容器从一个节点到另一个节点来回移动。没有固定的 IP 来检索您的指标。

我们需要特定的工具来追踪。

Beats autodiscover schematics

自动发现

让我们看看它是如何工作的,这是一个配置示例:

metricbeat.autodiscover:
  providers:
   - type: docker
     templates:
       - condition.contains:
           docker.container.image: etcd
         config:
          - module: etcd
            metricsets: ["leader", "self", "store"]
            hosts: "${data.host}:2379"

output.elasticsearch:
  hosts: [“localhost:9200”]

这是将 Metricbeat 配置为使用 docker 自动发现提供程序。您可以定义要使用的模板列表,与触发模板的条件相关联。在这种情况下,条件是匹配包含 etcd 的容器图像(我们使用 contains,因为图像字段存储的是“名称:标签”对)。创建 etcd 容器时,Metricbeat 将启动 etcd 模块对其进行监测,用容器 IP 地址替换 ${data.host} 变量。

让我们详细看看这一切是如何工作的:

1.自动发现事件

Beats 自动发现支持多个提供商,目前有 Kubernetes 和 Docker。提供商实现了在特定平台上监视事件的方式。一旦有事件发生,提供商会发布一个自动发现事件,其中包含您可能需要对其做出反应的所有信息。

2.条件匹配

使用与处理器相同的配置格式,根据条件列表检查每个事件。如果一个条件与事件匹配,它将为其生成给定的配置集。

3.变量展开

配置模板可能包含变量,这些变量被触发条件的事件的实际值所替代。此机制允许您定义动态配置,这些配置可能取决于容器的状态,如 IP 地址。但是,通过使用标签和注释,它也允许更复杂的配置。

4.配置开始/停止

创建最终配置后,自动发现过程将启动该配置。有效的配置包括 Metricbeat 和 Filebeat 中的模块以及后者中输入的信息。

有启动和停止事件,因此一旦容器离开,自动发现启动的配置将自动停止。这不需要任何特殊的配置。

当使用自动发现时,一个很好的附加特性是,它产生的所有事件都将自动由 Doker 或 Kuberness 元数据丰富,因此不需要使用 add_docker_metadata or add_kubernetes_metadata 处理器。本元数据将有助于导航日志和指标,允许您过滤日志和指标并关注重要的事情。

介绍提示

6.3 版本发布后,您现在可以使用提示来定义如何监测您的容器。传统上,您需要更新 Beats 设置文件来配置对新部署的应用程序的监测。

基于提示的自动发现通过允许您将监测设置存储在应用程序容器旁边而不是中央位置,来反转监测设置的控制。这意味着团队建设和部署应用程序获得授权负责定义如何监测它。

此配置支持库本内特斯容器日志的基于提示的自动发现(例如,此更改可以在我们的参考库本内特斯文件清单中完成):

filebeat.autodiscover:
  providers:
    - type: kubernetes
      hints.enabled: true

就是这样,您可以使用 Kubernetes Pod 注释或码头标签来告诉 Filebeat 和 Metricbeat 如何处理您的容器日志。例如,如果您在 Pod 中运行 Java 应用程序,您可以向 Pod 中添加以下注释:

annotations:
  co.elastic.logs/multiline.pattern: '^\['
  co.elastic.logs/multiline.negate: 'true'
  co.elastic.logs/multiline.match: after

当 Pod 启动时,Filebeat 将处理注释,并开始以给定的多行模式读取日志,将 Java 堆栈跟踪放在一起。您可以查看文档以获得可用提示的完整列表。

您也可以使用模块将日志处理成结构化数据,例如,如果您运行的是 NGINX 服务器,只需添加此注释,所有日志都将被处理,让您了解您的访问情况:

annotations:
  co.elastic.logs/module: nginx
  co.elastic.logs/fileset.stdout: access
  co.elastic.logs/fileset.stderr: error

如您所见,日志输出的每个流都映射到不同的文件集。您还可以通过仅定义 co.elastic.logs/fileset. 将所有流映射到单个文件集

在使用 Metricbeat 时,您也可以从提示中受益,这就是您将如何配置同一个 NGINX,以使 Metricbeat 从中获取指标的实例。如您所见,变量扩展在这里也可用,${data.host} 用于获取容器的 IP 地址。

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

考虑到如果您同时运行 Filebeat 和 Metricbeat,您可以同时使用两组提示。

总结

基于提示的自动发现将监测设置的配置移动到要监测的应用程序旁边。这为团队带来了正确的工具,尤其是在多租户场景中。它还提供了一套简单的操作说明,使体验变得简单、高效。

我们只是说明了您可以使用自动发现的一些最简单的功能。我们希望得到您的反馈,并了解您如何使用它!不要犹豫,来我们的 [Beats 论坛],告诉我们您的体验吧。