2018年7月12日 工程

使用 Beats 监测 Kubernetes 和 Docker 容器:日志、指标和元数据

作者 Dan Roscigno

本篇博文讲的是如何监测容器环境,容器环境包括 Google Kubernetes Engine (GKE)、IBM Cloud Kubernetes Service 以及任何其他 Kubernetes (k8s) 和 Docker 环境。但是在本篇博文中,我使用的是 IBM Cloud Kubernetes Service。

您可能会纳闷,我为什么要写关于监测 Kubernetes 和 Docker 容器的内容。毫无疑问,基础架构现在由云服务提供商管理,我只需要担心自己的应用程序,对吧?您可能没有错,但我却是一个十分较真的人,即使有人私下向我推荐某家餐厅,我也会到 Yelp 上查看这家餐厅的评价,我觉得拥有的信息越多越好。对于我的应用程序及其所在环境,我希望获得所有相关日志和指标,同时能够对所有这些内容进行搜索、可视化并收到相关通知。常用的容器监测功能固然很好,但是我在这里还要向您展示一种很棒的方法,即使用 Kubernetes 事件和元数据对应用程序的性能图表进行注解,同时还能提供有关规模调整或滚动更新的通知。

在开始之前,我们首先对几个词汇进行定义。

  • 日志:时间戳和消息。日志既包括典型的日志条目,例如 “NGINX started at 13:42”(“NGINX 于 13:42 启动”),也包括 k8s 事件,例如 “There was an NGINX container with a Back-off restarting failed container at 16:20.”(”有一个 NGINX 容器在 16:20 放弃重启失败容器。”)。
  • 指标:在固定时段内收集的数字型测量数据。指标既可以是 “Sales through the eCommerce site were $50,000 over the past ten minutes”(”在过去十分钟内电商网站的销售额为 $50,000”),也可以是 “CPU utilization was 17% from 14:00:00 to 14:00:10.”(“14:00:00 到 14:00:10 期间 CPU 的利用率为 17%。”)。

向 Kubernetes 集群内添加部署

在我的示例中,我要基于 Apache HTTP 服务器、PHP 和 Redis 来使用此应用程序。

k8s-module-1.png

此外,如要监测应用程序和容器基础架构,我们需要拥有下面两项: 

  • Elastic Cloud 中的托管式 Elasticsearch Service 部署。
  • Beats,即在同一 Kubernetes 集群中作为 DaemonSet 来部署的轻量型日志和指标采集器。请注意 Beats 可以代替 Kubernetes 集群内通常部署的 fluentd。

日志和指标

上述应用只是持续产生有用信息的生态系统的一部分,我们要采集的便是该系统产生的这些信息。下面是我们所收集日志和指标的来源的级别:

  1. 编排 (Kubernetes)
  2. 主机
  3. 应用
  4. 容器 (Docker)

k8s-module-2.png

为了收集数据,我们使用 Beats(Filebeat、Metricbeat 和 Packetbeat)和System、Kubernetes、Docker 模块,以及针对应用(Apache 和 Redis)的模块。我们针对每个 Beat 部署了 DaemonSet,并通过 Kubernetes 对其进行管理。尽管这个列表较为冗长,但是不要担心,因为 Beats autodiscover 会让这一切变得很简单。如欲详细了解如何部署 Beats 来监测应用,请参阅此篇博文及其中的视频。实际上,如果您想从头开始,请查看 Elastic 网站上的容器监测页面

托管式 Elasticsearch Service 来对数据进行索引、储存、搜索、分析和可视化。我们的入门页面详细介绍了如何在 Elastic Cloud 中部署 Elasticsearch Service,这和您在自管型系统中部署 Elasticsearch 和 Kibana 一样。

我提到了 Beats 和模块,我们应该对这些内容进行更详细的介绍。Beat 是一款轻量型代理,其会向 Elasticsearch 或 Logstash 发送数据。Beats 有时候部署在数据来源处(譬如在实体或者虚拟系统上),有时会和源内容一起部署,例如作为 DaemonSet(就如我在此处所做的一样)。模块能够简化常见日志格式的收集、解析、索引和可视化过程。

这听起来有点枯燥,我换一种方式来解释吧:Elastic 模块是预配置体验。让我们假设您知道有关管理 Apache HTTPD 服务器的所有知识,但是 NGINX 对您而言是新内容。您可能会找到熟悉 NGINX 的人士并问他们“您在日志中寻找什么内容呢?您关注哪些指标?可以从您的历史文件中给我一些 greps 吗?”这些问题的答案能够让我对 Beat 模块进行定义;预配置仪表板、保存的搜索、解析,以及收集大量内容(例如 Kubernetes、Docker、NGINX、Apache、操作系统和数据库等)的行为。以我的经验来看,这是一个非常强大的能力集合。

k8s 模块会收集与 pod、节点、容量、ReplicaSets 和部署相关的指标。每个指标都附有丰富的元数据集,所以您能将数据关联到应用程序。举例说明,您可能不在乎 pod xyz 的内存使用已经接近限度,但是如果此指标的出现与您应用程序的前端有关,那么您就知道这一指标的业务价值了。它还会收集事件(回想一下,我在上面的日志定义中已经将 Kubernetes 事件包括在内),在下面的视频中,我们便要使用这些事件来丰富性能图表。

Docker 模块收集与容器、主机、内存、网络和健康检查相关的指标。和 Kubernetes 模块一样,在理解您应用程序的性能和环境时,元数据是十分宝贵的信息。

还有很多其他的 Filebeat 模块Metricbeat 模块。而且,Packetbeat 针对多项服务(譬如 Cassandra、Flows、HTTP、MySQL 和 MongoDB 等)提供了很多仪表板。

观看视频并了解将数据转化为可付诸行动的信息有多么简单。视频主要包括下列内容:

  • 通过应用程序性能指标对 Kubernetes 事件进行可视化
  • 深入了解 Metricbeat Kubernetes 模块的事件指标集
  • 在 Kubernetes 事件中进行导览并创建自定义可视化内容