使用 Elastic 可观测性管理 Kubernetes 集群

作为一名运维工程师(SRE、IT 管理人员、DevOps),您总是在为如何管理技术和数据杂乱无章的局面而苦恼。Kubernetes 变得越来越普遍,其中大部分部署将在 Amazon Elastic Kubernetes Service (EKS)、Google Kubernetes Engine (GKE) 或 Azure Kubernetes Service (AKS) 中进行。有些人可能只使用一个云,而其他人需要管理多个 Kubernetes 云服务上的集群,这就增加了负担。除了云服务提供商的复杂性之外,您还需要管理数百个已部署的服务,这些服务会产生越来越多的可观测性和遥测数据。

通过 Kubernetes 集群和在集群上运行的应用程序生成的日志、指标和跟踪来了解它们的状态和运行状况,这一日常操作可能是您面临的最大挑战。但作为一名运维工程师,您需要使用所有这些重要数据来帮助预防、预测和修复问题。当您需要对 Kubernetes 遥测数据进行可视化和分析以进行故障排查和提供支持时,您肯定不想这么多的指标、日志和跟踪分布在多个工具中。

Elastic 可观测性通过提供广泛而集中的可观测性功能(而不仅仅是我们所熟知的日志记录功能),来帮助管理杂乱无章的 Kubernetes 指标和日志。Elastic 可观测性通过 OpenTelemetry 和 APM 代理统一管理所有指标、日志和跟踪数据,为您提供有关 Kubernetes 集群以及在集群上运行的应用程序行为的精细化见解和背景信息。

无论集群位于何处(EKS、GKE、AKS、自管型部署),也不管是什么应用程序,Elastic 可观测性都能让 Kubernetes 监测变得轻而易举。所有节点、Pod、容器、应用程序和基础架构(AWS、GCP、Azure)指标、基础架构和应用程序日志,以及应用程序跟踪,这些内容都可在 Elastic 可观测性中查看。

本篇博文将会展示:

  • Elastic Cloud 如何通过Elastic Agent(作为 DaemonSet 轻松部署在集群上)聚合和采集指标和日志数据,从而从主机(系统指标、容器统计数据)以及运行在 Kubernetes 之上的所有服务的日志中检索日志和指标。
  • Elastic 可观测性如何在所有 Kubernetes 集群组件(Pod、节点、服务、命名空间等)中提供一体化的遥测体验(日志、指标、跟踪)。
包含 Kubernetes 集成的 Elastic Agent
包含 Kubernetes 集成的 Elastic Agent

准备工作和配置

如果您打算跟着本博文照做,下面是我们用来设置这个演示的一些组件和细节:

  • 确保您拥有一个 Elastic Cloud 账号,且已部署一个堆栈(在此处查看相关说明)。
  • 虽然我们使用的是 GKE,但您可以对 Kubernetes 集群使用任何位置。
  • 我们使用的是超级热门的 HipsterShop 演示应用程序的一个变体。HipsterShop 最初由 Google 编写,用于展示 Kubernetes 在多种可用变体(如 OpenTelemetry 演示应用)中的表现。要使用该应用,请访问此处并按照说明进行部署。您不需要为 Kubernetes 指标部署 otelcollector 来导入,我们将在下面介绍这一点。
  • Elastic 支持从 Prometheus 和 FluentD 进行原生采集,但在本文中,我们将展示通过 Elastic Agent 从 Kubernetes 集群直接采集。后续的博客将展示 Elastic 如何从 Prometheus 或 FluentD/bit 中收集遥测数据。

用 Elastic 可以观测和分析哪些内容?

在我们详细介绍如何设置 Elastic 以采集 Kubernetes 集群指标和日志并对其进行可视化之前,先来看看 Elastic 中的实用仪表板。

如前所述,我们在 GKE 上运行了 HipsterShop 的一个变体,并在 GKE 集群上部署了具有 Kubernetes 集成的 Elastic Agent 作为 DaemonSet。在部署代理后,Elastic 开始从 Kubernetes 集群(特别是从 kube-state-metrics)采集指标;此外,Elastic 将从集群中提取所有日志信息。

在 Elastic 可观测性上将 Kubernetes 指标可视化

以下是 Elastic 可观测性上提供的一些开箱即用型 (OOTB) Kubernetes 仪表板。

Elastic Kubernetes 概述仪表板上的 HipsterShop 集群指标
Elastic Kubernetes 概述仪表板上的 HipsterShop 集群指标
Elastic 可观测性上的 HipsterShop 默认命名空间 Pod 仪表板
Elastic 可观测性上的 HipsterShop 默认命名空间 Pod 仪表板

除了集群概述仪表板和 Pod 仪表板之外,Elastic 还提供了几个实用的 OOTB 仪表板:

  • Kubernetes 概述仪表板(见上图)
  • Kubernetes Pod 仪表板(见上图)
  • Kubernetes 节点仪表板
  • Kubernetes 部署仪表板
  • Kubernetes DaemonSet 仪表板
  • Kubernetes StatefulSet 仪表板
  • Kubernetes CronJob 和 Job 仪表板
  • Kubernetes 服务仪表板
  • 定期添加更多仪表板

此外,您还可以定制这些仪表板或构建您自己的仪表板

在 Elastic 可观测性上处理日志

Kubernetes 容器日志和 Elastic Agent 日志
Kubernetes 容器日志和 Elastic Agent 日志

从上面的屏幕中可以看到,我不仅可以获取 Kubernetes 集群指标,还可以通过在 Kubernetes 集群中使用 Elastic Agent 获取所有 Kubernetes 日志。

预防、预测和修复问题

除了帮助管理指标和日志之外,Elastic 还可以帮助您检测和预测集群遥测中的异常情况。只需在 Elastic 中针对您的数据启用 Machine Learning,即可看到它帮助您增强分析功能。如上所述,Elastic 不仅可以集中观测 Kubernetes 集群日志和指标,而且还提供了大量真正有用的 Machine Learning 功能,可有效改进分析和管理。

Elastic 可观测性上的日志异常检测
Elastic 可观测性上的日志异常检测
使用 Elastic 可观测性分析 Kubernetes Pod 上的问题
使用 Elastic 可观测性分析 Kubernetes Pod 上的问题

在上图中,您可以看到对日志的异常检测,它显示了 9 月 21 日至 23 日期间可能出现的错误。通过分析单个 kubernetes.pod.cpu.usage.node 指标(显示 9 月初和 9 月底都出现了 CPU 问题),深入了解底部图表中的细节。借助 Machine Learning,您可以使用多指标分析(相对于我上面展示的单指标问题)和总体分析对集群遥测数据进行更复杂的分析。

Elastic 为您提供了更强大的 Machine Learning 功能,以增强对 Kubernetes 集群遥测数据的分析。在下一节中,我们将了解将遥测数据导入 Elastic 有多么容易。

将一切都设置完毕

我们来详细了解如何从部署在 GKE 上的 HipsterShop 应用程序中获取指标、日志和跟踪。

首先,选择您最喜欢的 Hipstershop 版本,如前所述,我们使用的是 OpenTelemetry-Demo 的一个变体,因为它已经有了 OTel。不过,我们在本文中精简了一下(服务更少,使用了一些不同的语言)。

第 0 步:在 Elastic Cloud 上注册一个账号

第 1 步:获取一个 Kubernetes 集群,并将 Kubernetes 应用加载到集群中

将您的应用加载到您自由选择的云服务或者本地 Kubernetes 平台中的 Kubernetes 集群上。您的应用加载到 Kubernetes 上之后,您将在 default 命名空间上运行下列 Pod(或一些变体)。

NAME                                    READY   STATUS    RESTARTS   AGE
adservice-8694798b7b-jbfxt              1/1     Running   0          4d3h
cartservice-67b598697c-hfsxv            1/1     Running   0          4d3h
checkoutservice-994ddc4c4-p9p2s         1/1     Running   0          4d3h
currencyservice-574f65d7f8-zc4bn        1/1     Running   0          4d3h
emailservice-6db78645b5-ppmdk           1/1     Running   0          4d3h
frontend-5778bfc56d-jjfxg               1/1     Running   0          4d3h
jaeger-686c775fbd-7d45d                 1/1     Running   0          4d3h
loadgenerator-c8f76d8db-gvrp7           1/1     Running   0          4d3h
otelcollector-5b87f4f484-4wbwn          1/1     Running   0          4d3h
paymentservice-6888bb469c-nblqj         1/1     Running   0          4d3h
productcatalogservice-66478c4b4-ff5qm   1/1     Running   0          4d3h
recommendationservice-648978746-8bzxc   1/1     Running   0          4d3h
redis-cart-96d48485f-gpgxd              1/1     Running   0          4d3h
shippingservice-67fddb767f-cq97d        1/1     Running   0          4d3h

第 2 步:打开 kube-state-metrics

接下来您需要打开 kube-state-metrics

首先:

git clone https://github.com/kubernetes/kube-state-metrics.git

接下来,在示例目录下的 kube-state-metrics 目录中,应用标准配置即可。

kubectl apply -f ./standard

这将打开 kube-state-metrics,您将看到 kube-system 命名空间中在运行一个类似的 Pod。

kube-state-metrics-5f9dc77c66-qjprz                    1/1     Running   0          4d4h

第 3 步:安装包含 Kubernetes 集成的 Elastic Agent

添加 Kubernetes 集成:

  1. 在 Elastic 中,前往“integrations”(集成),选择“Kubernetes Integration”(Kubernetes 集成),然后选择“Add Kubernetes”(添加 Kubernetes)。
  2. 为 Kubernetes 集成选择一个名称。
  3. 在配置屏幕中打开 kube-state-metrics
  4. new-agent-policy-name 文本框中为配置指定一个名称。
  5. 保存配置。现在与策略的集成已经创建好了。

您可以在此处了解代理策略以及如何在 Elastic Agent 上使用这些策略。

  1. 添加 Kubernetes 集成。
  2. 选择刚才在第二步中创建的策略。
  3. 在“添加代理”说明的第三步中,复制并粘贴或下载清单。
  4. 将清单添加到运行 kubectl 的 shell 中,将其保存为 elastic-agent-managed-kubernetes.yaml,并运行以下命令。
kubectl apply -f elastic-agent-managed-kubernetes.yaml

您应该会看到在 kube-system 命名空间中显示了许多作为 DaemonSet 一部分的代理。

NAME                                                   READY   STATUS    RESTARTS   AGE
elastic-agent-qr6hj                                    1/1     Running   0          4d7h
elastic-agent-sctmz                                    1/1     Running   0          4d7h
elastic-agent-x6zkw                                    1/1     Running   0          4d7h
elastic-agent-zc64h                                    1/1     Running   0          4d7h

在我的集群中,我有四个节点和四个作为 DaemonSet 的一部分启动的 elastic-agent。

第 4 步:查看 Kubernetes 指标的 Elastic 开箱即用型仪表板 (OOTB),并开始探索 Kubernetes 日志

这样就可以了。您应该会看到指标导入所有仪表板。要查看特定 Pod 的日志,只需前往 Kibana 中的“Discover”并搜索特定的 Pod 名称。

Elastic Kubernetes 概述仪表板上的 HipsterShop 集群指标
Elastic Kubernetes 概述仪表板上的 HipsterShop 集群指标
Elastic 可观测性上的 Hipstershop default 命名空间 Pod 仪表板
Elastic 可观测性上的 Hipstershop default 命名空间 Pod 仪表板

此外,您还可以直接在 Elastic 中浏览所有 Pod 日志。

frontendService 和 cartService 日志
frontendService 和 cartService 日志

在上面的示例中,我搜索了 frontendService 和 cartService 日志。

第 5 步:附加信息!

由于我们使用的是基于 OTel 的应用程序,Elastic 甚至可以收集应用程序的跟踪信息。但这是另一篇博文所讨论的内容。

下面简单了解一下 Hipster Shop 在 Elastic 可观测性中对前端事务的跟踪。

HipsterShop 对结账事务的跟踪
HipsterShop 对结账事务的跟踪

结论:Elastic 可观测性在监测 Kubernetes 方面表现抢眼

希望您已经了解了 Elastic 可观测性对您管理 Kubernetes 集群有怎样的帮助,以及它为实现简单部署而生成的指标、日志和跟踪数据的复杂性。

快速回顾一下所学内容,具体要点如下:

  • Elastic Cloud 如何通过 Elastic Agent(作为 DaemonSet 轻松部署在集群上)聚合和采集遥测数据,并从主机(如系统指标、容器统计数据)以及在 Kubernetes 上运行的所有服务中检索指标
  • 展示 Elastic 在所有 Kubernetes 集群组件(Pod、节点、服务、任何命名空间等)中提供一体化的遥测体验(Kubernetes 日志、指标、跟踪)所带来的好处。
  • 对探索 Elastic 的 ML 功能很感兴趣,因为这一功能可增加 MTTHH(平均休闲时间)

准备好开始体验了吗?注册并试用我在上文中概述的特性和功能。