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

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

Kubernetes 1.27 引入了一个名为“节点日志查询(Node log query)”的新功能,允许查看节点上运行的服务的日志。

它解决了什么问题?

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

它是如何工作的?

Kubelet 已经有一个可通过节点代理端点访问的 /var/log/ 查看器。该功能为此端点补充了一个 shim,在 Linux 节点上它会调用 journalctl,在 Windows 节点上则调用 Get-WinEvent cmdlet。然后,它使用这些命令提供的现有过滤器来过滤日志。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 issue 提供反馈,或在 Kubernetes Slack 的 #sig-windows 频道或 SIG Windows 的邮件列表上与我们联系。