Franciss Espenido 2020-08-26
无论您的 Kubernetes 环境是什么样子,日志记录和监控都是您在开启 Kubernetes 之旅时需要首先解决的主要挑战之一。无论您是在本地 PC 上运行的单节点集群、托管开发环境的小型节点集合,还是托管生产应用的大规模多主节点集群,能够访问监控数据和日志对于排查问题和优化性能都至关重要。
鉴于 Kubernetes 由如此多的不同组件构成,知道在哪里查找这些数据以及如何解读它们可能颇具挑战性。事实上,Kubernetes 的日志记录和监控需要处理多个数据源和多种工具,因为 Kubernetes 会以多种方式生成日志。
本文概述了 Kubernetes 的日志记录。它涵盖了 Kubernetes 中可用的日志数据类型以及如何访问这些数据。正如我们将看到的那样,大多数类型的 Kubernetes 日志数据都有多种访问方法。本文将解释如何评估您的日志记录需求,并制定适合这些需求的日志策略。
以下大部分信息适用于任何类型的 Kubernetes 环境。不过,为了使讨论更具体,我们将在相关之处引用 IBM Cloud Kubernetes Service(IKS)——用以说明我们所讨论的工具和实践如何应用于现实世界的生产级 Kubernetes 服务。
什么是 Kubernetes?
如果您正在阅读这篇关于 Kubernetes 日志记录的文章,您很可能已经知道 Kubernetes 是什么。但简要说明一下它的功能仍然值得,因为理解 Kubernetes 能做什么、不能做什么,是将您的日志策略扩展到支持它的第一步。
Kubernetes 提供了几个关键功能:
- 应用托管:Kubernetes 首要的功能就是托管应用程序。通常,这些应用程序以容器形式托管,尽管也可以使用 Kubernetes 运行其他类型的工作负载(例如虚拟机)。
- 负载均衡:Kubernetes 自动在不同的应用实例之间分配流量,以优化性能和可用性。
- 存储管理:Kubernetes 可以管理应用程序用于存储有状态数据的存储池的访问。
- 自我修复:当出现问题时(例如应用程序故障),Kubernetes 会尝试自动修复。但它并不总能成功,这也是 Kubernetes 日志记录如此重要的原因之一。
Kubernetes 还具备其他功能,但上述是其提供的核心功能领域。
Kubernetes 与日志记录:情况复杂
您可能会注意到,日志记录和监控并未列在 Kubernetes 的核心功能列表中。这并不是因为 Kubernetes 完全不提供任何日志记录和监控功能。实际上它确实提供了一些,但情况比较复杂。
一方面,Kubernetes 通过 kubectl 提供了一些非常基础的功能,用于检查集群中对象的状态(我们将在下文讨论)。它还会为某些类型的数据生成日志,并以某种方式暴露其他类型的数据,以便第三方日志工具可以收集这些数据。
另一方面,Kubernetes 并未提供一个功能完备的原生日志解决方案。与 Amazon Web Services(AWS)拥有内置日志解决方案 CloudWatch,或 OpenStack 拥有自己全面的日志解决方案不同,标准 Kubernetes 既没有完整的原生日志服务,也没有首选的第三方日志记录方法。相反,它期望您使用外部工具来收集和解读日志数据。
话虽如此,某些 Kubernetes 发行版确实附带了基于第三方工具构建的内置日志扩展,或者至少支持一种首选的日志记录方法。例如,正如我们将在下文看到的,IBM Cloud Kubernetes Service(IKS)集成了 IBM Log Analysis with LogDNA,用于收集 Kubernetes 日志数据,并通过 LogDNA 实现实时分析和日志管理。
在大多数情况下,即使在具有首选或原生集成日志解决方案的 Kubernetes 发行版上,您也可以使用替代的日志记录方法。然而,供应商支持的方法通常更容易实现。
在 Kubernetes 中应该记录什么
无论您选择哪种日志记录选项,Kubernetes 中都可以收集几种日志数据类型。
应用程序日志
首要的是在 Kubernetes 上运行的应用程序所产生的日志。这些日志中存储的数据是您的应用程序在运行时输出的信息。通常,这些数据被写入到运行该应用程序的容器内的 stdout。
我们将在下面的“查看应用程序日志”部分介绍如何访问这些数据。
Kubernetes 集群日志
构成 Kubernetes 本身的若干组件也会生成自己的日志:
- Kube-apiserver
- Kube-scheduler
- Etcd
- Kube-proxy
- Kubelet
这些日志通常存储在运行相应服务的服务器上的 /var/log 目录下的文件中。对于大多数服务而言,该服务器是 Kubernetes 主节点。然而,Kubelet 运行在工作节点上。
如果您遇到集群级别的问题(而不是仅影响某个容器或 Pod 的问题),这些日志是寻找线索的好地方。例如,如果您的应用程序在访问配置数据时遇到问题,您可以查看 Etcd 日志,看看问题是否出在 Etcd 上。如果某个工作节点未能按预期上线,其 Kubelet 日志可能会提供有用的信息。
Kubernetes 事件(Events)
Kubernetes 会跟踪其所称的“事件”,这些事件可能是集群中对象状态的正常变更(例如创建或启动容器),也可能是错误(例如资源耗尽)。
事件提供的上下文和可见性有限。它们告诉您某事发生了,但对为什么会发生却几乎不提供信息。尽管如此,它们仍是快速获取集群内各种对象状态信息的有用方式。
Kubernetes 审计日志(Audit Logs)
Kubernetes 可以配置为记录对 Kube-apiserver 的请求。这些请求包括人类用户发起的请求(例如请求列出正在运行的 Pod 列表)以及 Kubernetes 资源发起的请求(例如容器请求访问存储)。
审计日志记录了是谁或什么发起了请求、请求的内容以及结果。如果您需要排查与 API 请求相关的问题,审计日志可提供大量可见性。它们还可用于检测异常行为,例如用户反复尝试失败地访问集群中的不同资源,这可能表明有人试图利用配置不当的安全资源进行攻击。(这也可能反映出您的身份验证配置或证书存在问题。)
如何访问 Kubernetes 日志数据
上述各种类型的日志数据可以通过不同方式访问。
查看应用程序日志
与应用程序日志数据交互主要有两种方式。第一种是运行如下命令:
kubectl logs pod-name
其中 “pod-name” 是托管您想访问日志的应用程序的 Pod 名称。
kubectl 方法适用于快速查看日志数据。但如果您希望持久化存储日志并进行系统化分析,那么使用像 IBM Log Analysis with LogDNA 这样的外部日志工具来收集和解读日志会更为合适。最简单的方法是运行一个所谓的“边车容器”(sidecar container),它与应用程序并行运行,收集其日志,并将其提供给外部日志工具。在 IKS 上,您可以通过命令行或在 IKS Web 控制台中执行几个步骤,设置一个 LogDNA 实例来为应用程序日志(以及 Kubernetes 本身的日志)执行此功能。完整说明请参阅 IBM Cloud 文档。
查看集群日志
查看集群日志有多种方式。您可以直接登录到托管所需日志的服务器(如前所述,在大多数情况下是 Kubernetes 主节点服务器),然后使用文本编辑器、less、cat 或您喜欢的任何命令行工具直接打开各个日志文件。或者,您可以使用 journalctl 来检索并显示特定类型的日志。
最用户友好的解决方案仍然是使用像 IBM Log Analysis with LogDNA 这样的外部日志工具。如前所述,IBM Cloud 与 LogDNA 的集成使得收集 Kubernetes 集群日志和应用程序日志并通过集中式界面进行分析变得非常简单,而无需通过命令行繁琐地从每个节点逐一收集日志。
查看事件
您可以通过 kubectl 查看 Kubernetes 事件数据,例如使用如下命令:
kubectl get events -n default
其中 -n 标志指定您要查看事件的命名空间(上例中为 default)。命令
kubectl describe my-pod
将显示特定 Pod 的事件数据。
由于事件数据的上下文有限,您可能不会觉得记录所有事件特别有用。不过,您始终可以将 kubectl 的 CLI 输出重定向到日志文件中,然后使用日志分析工具进行分析。
查看审计日志
与其他类型的 Kubernetes 日志数据相比,查看和管理审计日志的方式在更大程度上取决于您使用的 Kubernetes 发行版以及您希望用来收集这些日志的日志收集器。没有一种通用且直接的方法可以通过 kubectl 直接收集审计日志。
在 IKS 上,审计事件会被路由到一个 webhook URL。然后,您可以按照这些说明,通过 IKS 原生的 LogDNA 集成来收集日志数据。
如何构建 Kubernetes 日志解决方案
如上所述,Kubernetes 中有多种类型的日志数据可用,但访问这些数据也有多种方法。制定最适合您的 Kubernetes 日志策略和工具集需要权衡以下几个因素:
- 您需要收集哪些类型的 Kubernetes 日志? 某些类型的数据对您来说可能更重要或更不重要。例如,如果您运行的是不生成有意义监控数据的简单应用程序,那么应用程序日志可能不如 Kubernetes 集群日志重要。
- 您的日志目标是什么? 如果您只是想快速查看一个日志文件,
kubectl(或在某些情况下使用journalctl)就足够了。但如果您需要长期的日志管理,则需要一个外部日志收集器。 - 您是否需要可视化? 当您访问 Kubernetes 日志文件时,您只是在寻找特定信息(例如 API 请求的来源),还是希望可视化数据以识别趋势或比较日志?如果是后者,则需要一个提供日志收集和可视化的外部工具或工具组合。
- 您是否需要聚合日志? 您的目标是访问单个日志文件,还是希望将多个日志聚合在一起并进行整体分析?后者需要外部工具。
- 您需要保留日志多长时间? Kubernetes 内部存储的大多数日志数据都会在一定时间后被删除,具体时间取决于日志类型和您的日志配置。因此,如果您希望长期保留历史日志数据,则需要将其导出到外部日志平台。
结论
Kubernetes 的日志记录涉及大量细节。尽管 Kubernetes 提供了一些基本的内置日志记录和监控功能,但距离一个功能完备的日志解决方案还相差甚远。要充分利用 Kubernetes 日志记录,您需要一个外部的日志收集、分析和管理工具。