是否可以获取特定时间范围内的 Kubernetes 日志?
我现在能做的就是使用
kubectl logs > dump.log
cmd 转储单个 Pod 的最后一小时日志。
但是出于调试原因,需要获取上周的日志。我无法在 Kubernetes 日志中找到任何执行此操作的功能。
唯一的想法是附加一些外部服务(例如 Kibana)来收集日志,但也许内置的 Kubernetes 补救措施允许这样做?
谢谢你。
...the last-hour log for the single pod
要检索最近 1 小时的日志,您可以执行以下操作
kubectl logs <pod> --since=1h
。从 kubectl 帮助断言更多选项:
--since=0s:仅返回比相对持续时间(例如 5s、2m 或 3h)更新的日志。默认为所有日志。自从-时间/自始至终可能只有一个 使用过。
--since-time='':仅返回特定日期之后的日志(RFC3339)。默认为所有日志。只能使用“since-time”/“since”之一。
--tail=-1:要显示的最近日志文件的行。默认为 -1(无选择器),显示所有日志行,否则为 10(如果有选择器) 提供。
AWK 是 Unix/Linux 系统中用于此类逻辑运算的出色工具
因此,要显示两个时间范围之间的日志(例如:上午 10 点到上午 11 点):
--since-time
和 awk
kubectl logs pod_name --since-time=2022-04-30T10:00:00Z | awk '$0 < "2022-04-30 11:00:00"'
awk
kubectl logs pod_name | awk '$0 > "2022-04-30 10:00:00"' | awk '$0 < "2022-04-30 11:00:00"'
注意:请根据日志输出在 awk 命令中使用 date_time 格式。
是否可以获取特定时间范围内的 Kubernetes 日志?
是的,这是可能的,而且有多种不同的方式。
唯一的想法是附加一些外部服务(例如 Kibana)来收集日志,但也许内置的 Kubernetes 补救措施允许这样做?
两者都有可能。不过这还是要看具体情况,哪个会更好。 Chris Doyle 在他的评论中说得很好:
这取决于集群中的日志保留和滚动策略,通常您需要考虑节点空间,特别是当节点运行多个 Pod 等时。一般来说,我的首选策略是在节点端保留较短的保留期并将注销推送到集中式解决方案,就像您提到的 elk、splunk、datadog、loki 等
当然,内置的k8s工具也能帮到你。您必须使用具有正确标志的命令来实现该
kubectl logs
。您可以在手册中阅读所有选项:
这可能是最有趣的部分:
--since=0:仅返回比相对持续时间(例如 5s、2m 或 3h)更新的日志。默认为所有日志。只能使用“since-time”/“since”之一。 --since-time="":仅返回特定日期之后的日志 (RFC3339)。默认为所有日志。只能使用“since-time”/“since”之一。
要显示上周的 pod 日志,您可以运行以下命令:
kubectl logs -n <pod_namespace (optional)> <pod name> --since 168h