本文发表已超过一年。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否仍正确。
Kubernetes 1.27:使用 Kubelet API 查询节点日志
Kubernetes 1.27 引入了一个名为 节点日志查询 的新特性,允许查看在节点上运行的服务日志。
它解决了什么问题?
集群管理员在调试节点上运行的故障服务时面临问题。他们通常必须通过 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
具有 get 和 create 访问权限)。获取节点日志所需的权限也可能导致权限提升攻击,因此请谨慎管理这些权限。
我如何使用它?
要使用此特性,请确保该节点的 NodeLogQuery
Feature Gate 已启用,并且 kubelet 配置选项 enableSystemLogHandler
和 enableSystemLogQuery
都设置为 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 邮件列表 联系我们来提供反馈。