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\
答案 0 :(得分:2)
通常,容器化应用程序不会写入日志文件,而是将消息发送到 stdout
/stderr
,将日志文件存储在容器中没有意义,因为它们会在 pod 时被删除已删除。
运行时看到什么
kubectl logs -f <pod-name>
是发送到 stdout
/stderr
的消息。这里没有容器特定的日志,只有应用程序日志。
如果由于某种原因,您的应用程序确实写入了日志文件,您可以通过exec
使用例如
kubectl exec -it <pod-name> -- /bin/bash
并像在 shell 中一样读取日志。
容器引擎处理生成的任何输出并将其重定向到容器化应用程序的 stdout
和 stderr
流。例如,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。
目前,深入挖掘集群需要登录相关机器。以下是相关日志文件的位置。 (请注意,在基于 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