如何快速从 Kubernetes 事件中找到有价值的信息

共 3872字,需浏览 8分钟

 ·

2022-11-01 17:16

文章作者:Nate Matherson,ContainIQ 联合创始人和首席执行官

对于当今的工程团队来说,太多的监视和警报疲劳是一个真正的问题。现在有很多开源和第三方工具可以解决这些问题。这听起来总是像是真的,而且很可能是真的。但是,如果我告诉你,我最喜欢的一个替代方案就在你面前,并且几乎可以立即从 Kubernetes API 访问,你会怎么做呢?我说的是 Kubernetes 事件。

Kubernetes 事件为集群运行状况和性能提供了独特而清晰的见解。在数据太多的日子里,我发现 Kubernetes 事件在没有太多干扰的情况下提供了清晰的见解。

在本文中,我们将了解 Kubernetes 事件类型,帮助你访问和存储事件,并建议一些大多数团队(无论大小)都会觉得有用的提醒。

什么是 Kubernetes 事件?类型和例子

Kubernetes 事件是一个对象,它显示了集群、节点、pod 或容器中正在发生的事情。这些对象通常是根据 K8s 系统中发生的更改而生成的。Kubernetes API Server 允许所有核心组件创建这些事件。通常,每个事件都伴随着一条日志消息。然而,这两者是非常不同的,不会以任何其他方式影响彼此。

关于 Kubernetes 事件需要注意的一件重要的事情是,它们在默认情况下会在一段时间后被删除,通常在一个小时以内。因此,你必须在重要事件发生时观察并收集它们。

访问 Kubernetes 事件可以使用如下命令:

kubectl get event

结果是这样的:

新启动节点的事件

正如你所看到的,许多 Kubernetes 事件都是由节点状态的改变引起的。每个事件都有一个 Reason 字段。你可以使用这个字段来确定 K8s 事件对象的类型。以下是一些基于事件原因的标准分类。

失败事件

当 K8s 创建容器或其他资源失败时,将生成失败事件。这可能是由于错误的镜像、输入错误、不充分的原因,以及许多不同的原因。几乎可以肯定的是,失败事件会导致应用的功能失效;因此,监视这些类型的事件是必要的。

FailedToCreateContainer、FailedToStartContainer、FailedToPullImage、FailedToKillPod 等都是失败事件的例子。

驱逐事件

驱逐事件经常发生,因为 K8s 经常会介入并驱逐流氓容器和 pod(那些不必要地消耗大量资源的容器和 pod)。虽然这是预期的行为,但你仍然需要注意这些事件的发生。大量的驱逐表明你没有在系统中设置适当的阈值。通常情况下,K8s 可能无法确定要驱逐的最佳实体,从而导致不相关的驱逐,从而损失正常运行时间。

与节点相关的事件

许多 K8s 事件都基于节点及其生命周期活动。你可能已经注意到上面示例中的 NodeHasSufficientMemory、NoteHasSufficientPID、NodeReady 和其他事件。这些信息传递与节点相关的状态变化,在查找系统不稳定行为的来源时可以派上用场。

与存储相关的事件

所有基于云的应用都以这样或那样的方式利用存储空间。K8s 主要通过 Docker 连接 AWS、GCP 等外部服务或内部资源进行存储。在某些情况下,pod 可能无法挂载存储资源。你应该查看 FailedMount 和 FailedAttachVolume 事件,以确定错误的存储挂载情况。

调度事件

调度事件可以洞察资源管理策略的效率。如果你没有很好地管理你的资源,可能没有任何剩余来分配给新的 pod。内存或 CPU 不足通常是罪魁祸首,在大多数情况下,你会收到一个 FailedScheduling 事件,其中清楚地描述了为什么调度不能发生。

访问 Kubernetes 事件

要访问 Kubernetes 事件,可以对 pod 执行如下命令:

kubectl describe <podname>

或者,如果需要根据事件类型或其他字段查看更大的事件集合,可以执行以下命令:

kubectl get events –field-selector type!=Normal

虽然这些命令为你提供了命令行上的最新事件,但对于需要进行历史数据分析的大规模部署,它们将不会有帮助。可以使用如下命令导出 Kubernetes API 中的事件数据,进行详细分析:

kubectl get events -o json

这将导出最新的事件到一个 JSON 文件,你可以导入到你最喜欢的可视化工具,以获得更多的见解。

如何收集和存储事件

上面讨论的最后一种方法是从 Kubernetes 导出事件的最原始的方法之一。还有其他各种技术可以用来安全地收集和存储事件。下面是一些最常见的。

原生观看和导出事件

Kubectl 提供了另一个方便的命令来监视系统中发生的事件:

kubectl get events –watch

这将开始流事件到你的终端。同样,这对于分析和可视化不是很有用。因此,你应该考虑将其与第三方日志操作器(如Banzai Cloud 的[1])耦合起来进行分析。

KubeWatch

KubeWatch[2]是一个很棒的开源工具,可以观看 K8s 的活动并将其流媒体到第三方工具和网络钩子上。你可以将其配置为在 Slack 通道中发送重要状态更改的消息。你还可以使用它将事件发送到分析和提醒工具(如 Prometheus)。

你可以通过 kubectl 或 helm 等你最喜欢的 Kubernetes 工具来安装 KubeWatch。下面是 KubeWatch 的 Slack 通知的简图:

KubeWatch Slack Notifications(来源:KubeWatch)

KubeWatch 提供了简单的设置过程,但不提供独立的存储或管理功能。此外,你也没有获得任何度量或日志记录功能。

Event Exporter

Kubernetes Event Exporter[3]是 K8s 中原生观看方法的一个很好的替代方案。它允许你持续监视 K8s 事件,并在需要时列出它们。它还从收集的数据中提取了大量的指标,如事件计数、独特事件计数等,并为你提供了基本的监视设置。它安装起来非常容易,在使用一个更全面的工具之前,可以先试用它。

EventRouter

EventRouter[4]是另一个收集 Kubernetes 事件的开源工具。它可以轻松地设置和将 Kubernetes 事件流到多个目标。然而,就像 KubeWatch 一样,它也不提供查询或持久性特性。你需要将其与第三方存储和分析工具连接起来,以获得完整的体验。

一旦了解了监视目标并制定了策略,就可以考虑转向专用的付费 K8s 事件监视服务。你可以在各种平台上获得强大的查询功能和警报。

常见的警告事件

实时观察 K8s 事件对于了解系统中发生的情况至关重要。但是,你还需要设置一个可靠的警报策略,以便在异常或紧急情况下通知你。

根据经验,你应该密切关注失败事件和调度事件,因为忽略这些事件会破坏应用的功能。你可以将被驱逐的事件设置为低优先级,因为它们通常是由 K8s 的例行清理生成的。特定于节点和特定于存储的事件必须手动选择以发出警报(虽然知道 NodeReady 是一个很好的事件,但你不需要每次都为它发出警报)。

大多数工具都允许通过网络钩子或 Slack 等通用协作平台发送警报。虽然这很简单,设置起来也很容易,但是你可以更进一步,将监视工具连接到更高级的警报平台。Prometheus 中的AlertManager[5]也是一个不错的选择。你还可以考虑使用基于 SaaS 的解决方案,如ContainIQ[6],它具有专门的接口,用于创建警报条件、在广泛的平台上发送警报条件,以及将事件与其他指标关联起来的能力。

总结

Kubernetes 事件是监视 K8s 集群运行状况和活动的好方法。然而,当它们与实用的策略和广泛的工具集结合在一起时,会变得更加强大。本指南帮助你理解 Kubernetes 事件的重要性,以及如何从它们中汲取最大的价值。

参考资料

[1]

Banzai Cloud 的: https://github.com/banzaicloud/logging-operator

[2]

KubeWatch: https://github.com/bitnami-labs/kubewatch

[3]

Kubernetes Event Exporter: https://github.com/caicloud/event_exporter

[4]

EventRouter: https://github.com/heptiolabs/eventrouter

[5]

AlertManager: https://prometheus.io/docs/alerting/latest/alertmanager/

[6]

ContainIQ: https://www.containiq.com/kubernetes-monitoring

本文转载自:「CNCF」,原文:https://tinyurl.com/y6a3dvya,版权归原作者所有。

Linux学习指南

有收获,点个在看 

浏览 17
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报