如何从Kubernetes复制控制器的所有Pod中获取日志?


123

运行kubectl logs向我展示了一个Kubernetes容器的stderr / stdout。

如何获取一组Pod的聚合stderr / stdout,最好是由某个复制控制器创建的Pod?


请记住,在使用选择器时不设置tail参数将默认将每个pod日志的长度设置为10行
chachan

Answers:


175

您可以使用标签

kubectl logs -l app=elasticsearch

21
好的解决方案,很可能足以回答原始问题,但不会尾巴:“错误:仅允许跟随(-f)或选择器(-l)中的一个”。
Nestor Urquiza

3
另外,没有--all-namespaces
埃里克·沃克

这些日志的顺序是什么?我的意思是,如果有多个吊舱,每个吊舱都有自己的日志。因此,如果显示所有日志,那么将以什么顺序显示它们,以及如何识别特定日志行的源容器?
Shubham

6
似乎-f现在就可以使用(从Kubernetes 1.12+ / kubectl1.12+开始)。还有@Shubham-它按接收到的顺序显示消息,日志行上没有标签或任何内容。这只是为了快速调试。如果您需要更多日志详细信息,则需要将日志发送到中央日志系统,例如EFK,SumoLogic,Datadog等
。– geerlingguy

1
无论如何,是否有使用Kubernetes仪表板执行相同的操作。
mchawre

69

我创建了一个小的bash脚本kubetail,使之成为可能。例如,尾随名为“ app1”的窗格的所有日志,您可以执行以下操作:

kubetail app1

您可以在此处找到脚本。


安装于: brew tap johanhaleby/kubetail && brew install kubetail --with-short-names详细文档:kt -h太棒了!
哈利勒·加尔包伊

太棒了 我有一些问题。```1.我们可以跟踪属于不同部署的多个Pod的日志吗?像“ kt -l app = service1,app = service2”之类的东西。2.如何将它们全部写入文件?这样做“ kt -l app = service1` >> filename.log”仅向其写入容器名称。3.在自动扩展部署的情况下,还会拖尾吗?```
Vasudev

19

您可以使用Adrian Ng建议的标签从多个容器中获取日志:

kubectl logs --selector app=yourappname

如果您的Pod中包含多个容器,则上述命令将失败,并且需要指定容器名称:

kubectl logs --selector app=yourappname --container yourcontainername

注意:如果要查看可用的标签,以下命令将列出所有标签:

kubectl get pod <one of your pods> -o template --template='{{.metadata.labels}}'

...输出看起来像

map [app:您的应用名称控制器-修订版哈希:598302898 pod-template-generation:1]

请注意,某些标签可能不会与其他Pod共享-选择“应用”似乎是最简单的标签


13

如果要添加上一个答案,则可以添加-f日志尾部。

kubectl logs -f deployment/app

10

先前提供的解决方案不是最佳的。kubernetes团队本身已经提供了一个称为stern的解决方案。

stern app1

它还匹配正则表达式,并且默认情况下执行tail和-f(跟随)。一个不错的好处是,它还向您显示了生成日志的Pod。

app1-12381266dad-3233c foobar log
app1-99348234asd-959cc foobar log2

为Linux抓取go-binary或通过brew为OSX安装。

https://kubernetes.io/blog/2016/10/tail-kubernetes-with-stern/

https://github.com/wercker/stern


6

我使用以下简单脚本从部署的Pod中获取日志:

#!/usr/bin/env bash

DEPLOYMENT=$1

for p in $(kubectl get pods | grep ^${DEPLOYMENT}- | cut -f 1 -d ' '); do 
    echo --------------------------- 
    echo $p 
    echo --------------------------- 
    kubectl logs $p
done

剧本要旨

用法:log_deployment.sh“部署名称”。

然后,脚本将显示以该“ deployment-name”开头的所有pod的日志。



4

您可以从中获取帮助kubectl logs -h并根据信息进行操作,

kubectl logs -f deployment/myapp -c myapp --tail 100

-c是容器名称,--tail将显示最新的行号,但这将选择部署中的一个吊舱,而不是所有吊舱。这是您必须牢记的。

kubectl logs -l app=myapp -c myapp --tail 100

如果要显示所有吊舱的日志,则可以使用-l并指定一个标签,但同时-f不会使用。


3

您也可以按服务名称执行此操作。

首先,尝试查找对应于同一服务的多个容器的各个容器的服务名称。kubectl get svc

接下来,运行以下命令以显示每个容器的日志。

kubectl logs -f service/<service-name>

2

在此示例中,当Pod中定义了多个容器时,可以替换<namespace><app-name>获取日志。

kubectl -n <namespace> logs -f deployment/<app-name>
--all-containers=true --since=10m

1

如果吊舱的命名有意义,则可以使用简单的“普通旧式Bash”:

keyword=nodejs
command="cat <("
for line in $(kubectl get pods | \
  grep $keyword | grep Running | awk '{print $1}'); do 
    command="$command (kubectl logs --tail=2 -f $line &) && "
  done
command="$command echo)"
eval $command

说明:遍历名称包含“ nodejs”的运行Pod。尾部并行记录每个日志(单个“&”号在后台运行),以确保如果任何一个pod失败,则整个命令退出(“&”号)。将来自每个tail命令的流分类为唯一的流。需要Eval才能运行此动态构建的命令。


-1

我使用此命令。

kubectl -n <namespace> logs -f deployment/<app-name> --all-containers=true --since=10m

1
你好!尽管该命令可以解决问题,但包括如何解决以及如何解决该问题的解释,确实可以帮助提高您的帖子质量,并可能导致更多的投票。请记住,您将来会为读者回答问题,而不仅仅是现在问的人。请编辑您的答案以添加说明,并指出适用的限制和假设。
布赖恩

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.