本文发表时间已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变得不正确。

Kubernetes 1.27:使用 Kubelet API 查询节点日志

Kubernetes 1.27 引入了一项名为节点日志查询的新功能,该功能允许查看节点上运行的服务的日志。

它解决了什么问题?

集群管理员在调试节点上运行的故障服务时会遇到问题。他们通常必须 SSH 或 RDP 进入节点才能查看服务的日志以调试问题。节点日志查询功能通过允许集群管理员使用 kubectl 查看日志来帮助解决这种情况。这对于 Windows 节点尤其有用,在 Windows 节点中,您会遇到节点进入就绪状态,但容器由于 CNI 配置错误和其他问题而无法启动的情况,这些问题通过查看 Pod 状态不容易识别。

它是如何工作的?

kubelet 已经有一个 /var/log/ 查看器,可以通过节点代理端点访问。该功能使用一个 shim 来补充此端点,该 shim 在 Linux 节点上向 journalctl 发出 shell 命令,在 Windows 节点上向 Get-WinEvent cmdlet 发出 shell 命令。然后,它使用命令提供的现有过滤器来允许过滤日志。kubelet 还使用启发式方法来检索日志。如果用户不知道给定的系统服务是否将日志记录到文件或本机系统日志记录器,则启发式方法首先检查本机操作系统日志记录器,如果该日志记录器不可用,它会尝试从 /var/log/<servicename>/var/log/<servicename>.log/var/log/<servicename>/<servicename>.log 中检索第一个日志。

在 Linux 上,我们假设服务日志可通过 journald 获得,并且已安装 journalctl。在 Windows 上,我们假设服务日志在应用程序日志提供程序中可用。另请注意,仅当您被授权执行此操作时(在 RBAC 中,即对 nodes/proxy 具有 getcreate 访问权限)才能获取节点日志。获取节点日志所需的权限也允许提权攻击,因此请谨慎管理它们。

如何使用它?

要使用该功能,请确保该节点的 NodeLogQuery 功能门控 已启用,并且 kubelet 配置选项 enableSystemLogHandlerenableSystemLogQuery 都设置为 true。然后,您可以从所有节点或仅从一个子集中查询日志。以下是从节点检索 kubelet 服务日志的示例

# Fetch kubelet logs from a node named node-1.example
kubectl get --raw "/api/v1/nodes/node-1.example/proxy/logs/?query=kubelet"

您可以进一步过滤查询以缩小结果范围

# Fetch kubelet logs from a node named node-1.example that have the word "error"
kubectl get --raw "/api/v1/nodes/node-1.example/proxy/logs/?query=kubelet&pattern=error"

您还可以从 Linux 节点上的 /var/log/ 获取文件

kubectl get --raw "/api/v1/nodes/<insert-node-name-here>/proxy/logs/?query=/<insert-log-file-name-here>"

您可以阅读文档,了解所有可用的选项。

我如何提供帮助?

请使用该功能并通过打开 GitHub 问题或在 Kubernetes Slack 上的 #sig-windows 频道或 SIG Windows 邮件列表 中联系我们来提供反馈。