运行kubectl日志可以看到一个Kubernetes容器的stderr/stdout。

我如何获得一组pod的聚合stderr/stdout,最好是由某个复制控制器创建的那些?


当前回答

这个回答试图提供一个简洁的例子和解释。为了获得一组pod中所有容器的所有输出,您必须使用标签(选择器),除非您计划执行一些额外的脚本。

kubectl logs \
--namespace my-namespace \
-l app=my-app-label \
--tail=-1 \
--timestamps=true \
--prefix=true \
--all-containers=true

这个示例返回label app=my-app-label定义的pod中所有容器的完整快照日志。

可选选项

添加——timestamps=true和——prefix=true标志可能会有帮助,这样时间戳和日志源在输出中就可见了,但这不是必需的。

按资源划分的日志

如果指定了诸如部署之类的资源,并且该部署具有 多个pod(如ReplicaSet),则只返回其中一个pod日志。这就是为什么要使用选择器来识别豆荚。

尽管指定了——all-containers,但在编写响应时,使用kubectl v1.22.5,针对服务或部署等资源并不能成功返回所有pod中所有容器的日志。这就是必须使用选择器的原因。

容器名称

根据kubectl日志的输出—帮助

打印pod或指定资源中容器的日志。 如果pod只有一个容器,则容器名是可选的。

这意味着如果有多个容器,您必须执行以下操作之一:

让命令为您选择一个容器 使用——all-containers=true选项

跟踪和拖尾

如果您像上面的例子那样指定一个标签,那么tail将被设置为10,只返回每个容器的最后10条日志。要获取所有日志,请将tail设置为-1。

在示例中添加-f或——follow以跟踪日志。如果不需要所有日志,可以更改——tail选项的值。在跟踪日志时,您可能希望确保默认选项——max-log-requests=5是足够的。如果增加了20个容器,则需要max-log-requests=20。

其他回答

一种选择是通过Fluentd/ElasticSearch设置集群日志记录,如https://kubernetes.io/docs/user-guide/logging/elasticsearch/所述。一旦日志在ES中,就很容易在Kibana中应用过滤器来查看特定容器中的日志。

我创建了一个名为kubetail的小bash脚本来实现这一点。例如,跟踪名为“app1”的pod的所有日志,你可以这样做:

kubetail app1

你可以在这里找到脚本。

如果豆荚的命名有意义,可以使用简单的Plain Old 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的日志(单&号在后台运行),确保如果任何pod失败,整个命令都退出(双&号)。将来自每个tail命令的流合并到一个唯一的流中。Eval需要运行这个动态构建的命令。

我们刚刚推出了一个Kubernetes本地日志工具,可以从所有的pod(你指定的)收集日志,并将日志发送到一个集中的位置。

我希望它能帮助任何人登陆这个页面:https://github.com/parseablehq/collector

以前提供的解决方案并不是最优的。kubernetes团队自己在一段时间前提供了一个解决方案,称为stern。

stern app1

它还匹配正则表达式,默认情况下执行tail和-f (follow)。一个很好的好处是,它显示了生成日志的pod。

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

抓取go-binary for linux或通过brew for OSX安装。

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

https://github.com/wercker/stern