查看 kubernetes 中崩溃 pods 的日志文件

View log files of crashed pods in kubernetes

想查看 kubernetes 中崩溃的 pod 的日志文件吗? 在启动 replicationController 后,我的 pod 将其状态列为 "CrashLoopBackOff"。我搜索了可用的文档,但找不到任何文档。

kubernetes 中存在一个错误,阻止在 CrashLoopBackOff 状态下获取 pods 的日志。看起来它是固定的。此处 issue on github 以及其他信息

假设您的 pod 仍然存在:

kubectl logs <podname> --previous

$ kubectl logs -h
-p, --previous[=false]: If true, print the logs for the previous instance of the container in a pod if it exists.

kubectl logs 命令仅在 pod 启动且 运行 时有效。如果不是,您可以使用 kubectl events 命令。

kubectl get events -n <your_app_namespace> --sort-by='.metadata.creationTimestamp'

默认情况下它不对事件进行排序,因此 --sort-by 标志。

在许多情况下,kubectl logs <podname> --previous 返回:

Error from server (BadRequest): previous terminated container "<container-name>" in pod "<pod-name>" not found

因此您可以尝试检查命名空间的事件 (kubectl get events ..),就像 @alltej 显示的那样。

如果您无法通过 kubectl logs / get events 找到错误的原因并且您无法使用外部日志记录工具查看它,我建议:

1 ) 检查 pod 运行 在哪个节点上:

$kubectl get -n <namespace> pod <pod-name> -o=custom-columns=NAME:.metadata.name,STATUS:.status.phase,NODE:.spec.nodeName

NAME              STATUS    NODE
failed-pod-name   Pending   dns-of-node

(如果删除 <pod-name>,您可以在命名空间中看到其他 pods)。

2 ) 通过 SSH 连接到该节点并:

A ) 在 /var/log/containers/ 中搜索失败的 pod 容器名称并转储其 .log 文件并搜索错误 - 在大多数情况下,错误原因将与错误之前发生的操作/事件。

B ) 如果上一步没有帮助,请尝试通过 运行 搜索最新的系统级错误:
sudo journalctl -u kubelet -n 100 --no-pager.

与其他答案的主要区别在于,这是在 pod 崩溃时自动触发的,因此它可以帮助避免出现这样的情况:您稍后开始调试并且 pod 本身不再存在并且无法记录日志已提取。

如果 pod 不再存在:

kubectl describe pod {RUNTIME_NAME_OF_POD}

在输出中,您应该有“事件”部分,其中包含阻止 pod 启动的错误消息。