在将容器日志写入日志文件之前,我们如何检查 Kubernetes 中的容器日志?

时间:2021-05-11 15:53:09

标签: kubernetes kubectl

kubectl logs -f <pod-name>

此命令显示容器日志文件中的日志。

基本上,我想检查“容器生成的内容”和“写入日志文件的内容”之间的区别。 我看到一些不寻常的二进制日志,所以我只想知道容器是否正在创建这些二进制日志,或者日志没有正确写入日志文件。

“异常日志”:

\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\

3 个答案:

答案 0 :(得分:2)

通常,容器化应用程序不会写入日志文件,而是将消息发送到 stdout/stderr,将日志文件存储在容器中没有意义,因为它们会在 pod 时被删除已删除。
运行时看到什么

kubectl logs -f <pod-name>

是发送到 stdout/stderr 的消息。这里没有容器特定的日志,只有应用程序日志。


如果由于某种原因,您的应用程序确实写入了日志文件,您可以通过exec使用例如

kubectl exec -it <pod-name> -- /bin/bash

并像在 shell 中一样读取日志。

编辑

应用日志

容器引擎处理生成的任何输出并将其重定向到容器化应用程序的 stdoutstderr 流。例如,Docker 容器引擎将这两个流重定向到 logging driver,它在 Kubernetes 中配置为写入 JSON 格式的文件。
这些日志也保存到

  • /var/log/containers/
  • /var/log/pods/

默认情况下,如果容器重新启动,kubelet 会保留一个终止的容器及其日志。如果一个 Pod 从节点中被逐出,所有相应的容器及其日志也会被逐出。

您通过发出命令看到的一切

kubectl logs <pod-name>

是发送到 stdout/stderr 的应用程序,或重定向到 stdout/stderr 的应用程序。例如nginx

<块引用>

nginx 官方镜像创建了一个从 /var/log/nginx/access.log/dev/stdout 的符号链接,并创建了另一个从 /var/log/nginx/error.log/dev/stderr 的符号链接,覆盖了日志文件,导致日志而是发送到相关的特殊设备。

节点日志

不在容器内运行的组件(例如 kubelet、容器运行时)写入 journald。否则,它们会写入 .log 目录中的 /var/log/ fies。

摘自official documentation

目前,深入挖掘集群需要登录相关机器。以下是相关日志文件的位置。 (请注意,在基于 systemd 的系统上,您可能需要改用 journalctl)

大师

  • /var/log/kube-apiserver.log - API Server,负责提供 API
  • /var/log/kube-scheduler.log - 调度器,负责制定调度决策
  • /var/log/kube-controller-manager.log - 管理复制控制器的控制器

工作节点

  • /var/log/kubelet.log - Kubelet,负责在节点上运行容器
  • /var/log/kube-proxy.log - Kube 代理,负责服务负载均衡

答案 1 :(得分:1)

我能想到的唯一方法是使用一些外部日志记录工具,如 Syslog 或 Elastisearch 或其他任何东西。将您的应用配置为将日志直接发送到日志记录工具(避免使用 fluentd 或 logstash 等代理从文件中解析日志)。

所有现代语言都支持外部日志记录。您还可以configure Docker 将日志发送到系统日志服务器。

答案 2 :(得分:0)

查看日志的简单方法是kubernets:

=> 如果 pod 有单个容器

kubectl logs POD_NAME

=> 如果 pod 有多个容器

kubectl logs POD_NAME -c CONTAINER_NAME -n NAMESPACE