从 AKS 群集捕获实时系统见解

本文讨论使用 Inspektor 小工具从 Microsoft Azure Kubernetes 服务 (AKS) 群集收集实时系统见解的过程。 本文包含有关在 AKS 环境中安装此工具的分步说明。 它还探索了一些实际示例,这些示例展示了 Inspektor 小工具如何帮助你收集有价值的信息,以便对实际问题进行有效的调试。

演示

若要开始,请考虑以下快速演示。 假设必须弄清楚来自应用程序的 DNS 请求失败的原因。 通过使用 Inspektor 小工具,可以在运行应用程序的 Kubernetes 命名空间中捕获 DNS 流量:

kubectl gadget trace dns --namespace my-ns --output columns=+nameserver
K8S.NODE                           K8S.NAMESPACE  K8S.POD  PID      TID      COMM      QR  TYPE      QTYPE  NAME             RCODE NUMANSWERS NAMESERVER
aks-agentpool-97833681-vmss000001  my-ns          my-app   1349264  1349264  nslookup  Q   OUTGOING  A      www.example.com.       0          1.2.3.4
aks-agentpool-97833681-vmss000001  my-ns          my-app   1349264  1349264  nslookup  Q   OUTGOING  AAAA   www.example.com.       0          1.2.3.4
aks-agentpool-97833681-vmss000001  my-ns          my-app   1349264  1349264  nslookup  Q   OUTGOING  A      www.example.com.       0          1.2.3.4
aks-agentpool-97833681-vmss000001  my-ns          my-app   1349264  1349264  nslookup  Q   OUTGOING  AAAA   www.example.com.       0          1.2.3.4

从此信息中,可以看到 DNS 请求定向到 IP 地址 1.2.3.4的 DNS 服务器,但服务器永远不会响应。

现在,假设这不是 1.2.3.4 默认名称服务器配置,并且你怀疑可疑的进程正在运行时修改配置。 在这些情况下,Inspektor 小工具超出了 DNS 诊断范围。 它还使你能够监视访问关键文件(如 /etc/resolv.conf)的进程,并打算修改这些文件。 若要使用此监视功能,请筛选输出中的标志以显示任何 写入文件访问模式O_WRONLY 仅打开以写入或 O_RDWR 打开进行读取和写入):

kubectl gadget trace open --namespace my-ns \
    --filter path:/etc/resolv.conf,flags:'~(O_WRONLY|O_RDWR)' \
    --output columns=+flags
K8S.NODE                           K8S.NAMESPACE  K8S.POD  K8S.CONTAINER  PID      COMM  FD  ERR  PATH              FLAGS
aks-agentpool-97833681-vmss000001  my-ns          my-app   my-app         1365052  vi    3   0    /etc/resolv.conf  O_WRONLY|O_CREAT

什么是 Inspektor 小工具?

Inspektor 小工具 是一个框架,旨在生成、打包、部署和运行专用于调试和检查 Linux 和 Kubernetes 系统的工具。 这些工具(“小工具”)作为 eBPF 程序实现。 他们的主要目标是收集低级别内核数据,以便深入了解特定的系统方案。 Inspektor 小工具框架使用高级引用(如 Kubernetes 资源)管理收集的数据关联。 此集成可确保在低级别见解与其相应的高级上下文之间建立无缝连接。 集成简化了故障排除过程和相关信息的收集。

产品

Inspektor 小工具提供了一组内置工具,旨在调试和观察系统上的常见情况。 例如,通过使用此类小工具,可以在群集中跟踪以下事件:

  • 进程创建
  • 文件访问
  • 网络活动,例如 TCP 连接或 DNS 解析

小工具提供他们通过使用不同机制收集的信息。 例如,某些小工具可以在特定时间通知系统状态。 其他小工具可以在每次发生给定事件时报告,也可以提供定期更新。

这些只是一些示例。 官方 文档 提供了每个小工具的详细说明和示例,以便你可以确定最适合特定用例的小工具。 但是,如果发现现有小工具当前未涵盖的用例,Inspektor 小工具允许你使用 run 命令运行自己的 eBPF 程序。 由于 Inspektor 小工具框架处理自定义程序的生成、打包和部署,因此它简化了满足独特要求的过程。 此外,它还收集高级元数据以扩充你在程序中收集的数据。

用例

为了补充本文开头介绍的演示,我们编译了一系列问题和实际方案,演示 Inspektor 小工具如何帮助你解决调试难题。 以下示例展示了 Inspektor 小工具的潜力。 但此工具的功能超出了这些方案。 这使得 Inspektor 小工具成为导航 Kubernetes 调试和可观测性的复杂性的宝贵资产。

问题区域 现象 故障排除
磁盘密集型应用程序 高内存或 CPU 使用率,或节点准备不一致 应用程序可能会持续执行磁盘读/写操作,例如广泛的日志记录。 通过使用 Inspektor 小工具,可以实时识别哪些容器生成更多的 块 I/O。 或者,更具体地说,可以找到导致对文件进行更多读取和写入的容器。
“它始终是 DNS” 应用程序延迟高、超时或最终用户体验不佳

通过使用 Inspektor 小工具,可以 跟踪群集中的所有 DNS 查询和响应。 具体而言,Inspektor 小工具提供了以下信息,可帮助你确定 DNS 是否影响应用程序的性能:

  • 查询成功
  • 响应是否包含错误
  • 用于查找的名称服务器
  • 查询响应延迟
文件系统访问 应用程序错误或无法正常工作

应用程序可能无法访问文件系统中的特定配置、日志或其他重要文件。 在这种情况下,Inspektor 小工具可用于 跟踪 Pod 内所有打开的文件 ,以诊断访问问题。 每当应用程序尝试打开文件时,都可以发现以下信息:

  • 用于打开文件的标志(例如, O_RDONLY、O_WRONLY、O_RDWR等)
  • 文件打开尝试是否成功
  • 返回的错误(如果文件打开尝试失败)

例如,如果由于错误 2(ENOENT)而尝试打开文件失败,则应用程序可能尝试打开不存在的文件。 这意味着代码中可能有拼写错误,或者该文件在不同的路径中可用。

远程代码执行 (RCE) 未经授权的代码执行,例如 加密劫持 ,在应用程序空闲期间 CPU 使用率较高时明显 当攻击者尝试对系统进行此类攻击时,他们通常必须使用它 bash来运行代码。 Inspektor 小工具使你能够 跟踪新进程的创建,尤其是涉及关键命令的进程,例如 bash

如何在 AKS 群集中安装 Inspektor 小工具

一键 Inspektor 小工具部署

通过选择以下按钮,将自动创建 AKS 群集,Inspektor 小工具将部署在群集中。 部署完成后,可以在提供的 shell 环境中浏览 Inspektor 小工具的所有功能。

在 AKS 群集中部署 Inspektor 小工具

通过运行“kubectl 小工具”插件安装 Inspektor 小工具

本部分概述了通过运行 kubectl gadget 插件在 AKS 群集中安装 Inspektor 小工具的步骤。 安装由两个部分组成:

  • kubectl gadget 计算机上安装插件

  • kubectl gadget运行插件以在群集中安装 Inspektor 小工具

    警告

    许多机制可用于部署和使用 Inspektor 小工具。 每种机制都针对特定的用例和要求进行了定制。 可以使用 kubectl 小工具插件来应用其中几个机制,但并非所有机制。 例如,使用 kubectl gadget 插件部署 Inspektor Gadget 取决于 Kubernetes API 服务器的可用性。 如果不能依赖此类组件,因为其可用性偶尔会遭到入侵,建议避免使用 kubectl gadget部署机制。 有关此用例和其他用例的详细信息,请参阅 Inspektor 小工具文档

先决条件

第 1 部分:在计算机上安装 kubectl 插件小工具

我们建议你用于 krew 安装 kubectl gadget 插件。

注意

若要安装特定版本或从源进行编译,请参阅 在 GitHub 上安装 kubectl 小工具

kubectl krew install gadget

现在,通过运行以下命令 version 来验证安装:

kubectl gadget version

version 命令显示客户端版本(kubectl gadget 插件),但它还会告诉你尚未安装在服务器上(群集):

Client version: vX.Y.Z
Server version: not installed

第 2 部分:在群集中安装 Inspektor 小工具

以下命令部署 DaemonSet 控制器。

注意

可以使用多个选项来自定义部署,如以下列表所示:

  • 使用特定的容器映像
  • 部署到特定节点
  • 部署到自定义命名空间

若要了解这些选项,请参阅 官方文档的群集 部分中的“安装”。

kubectl gadget deploy

再次运行 version 命令验证安装:

kubectl gadget version

这一次,客户端和服务器都显示为正确安装:

Client version: vX.Y.Z
Server version: vX.Y.Z

第三方信息免责声明

本文中提到的第三方产品由 Microsoft 以外的其他公司提供。 Microsoft 对这些产品的性能和可靠性不作任何明示或默示担保。

第三方联系人免责声明

Microsoft 会提供第三方联系信息来帮助你查找有关本主题的其他信息。 此联系信息可能会更改,恕不另行通知。 Microsoft 不保证第三方联系信息的准确性。

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区