运行kubectl日志可以看到一个Kubernetes容器的stderr/stdout。
我如何获得一组pod的聚合stderr/stdout,最好是由某个复制控制器创建的那些?
运行kubectl日志可以看到一个Kubernetes容器的stderr/stdout。
我如何获得一组pod的聚合stderr/stdout,最好是由某个复制控制器创建的那些?
当前回答
如果豆荚的命名有意义,可以使用简单的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需要运行这个动态构建的命令。
其他回答
一种选择是通过Fluentd/ElasticSearch设置集群日志记录,如https://kubernetes.io/docs/user-guide/logging/elasticsearch/所述。一旦日志在ES中,就很容易在Kibana中应用过滤器来查看特定容器中的日志。
你可以使用标签
kubectl logs -l app=elasticsearch
你可能想要指定——all-containers——ignore-errors,以便:
包括来自多个容器的吊舱的日志 在致命错误(例如,无法检索日志)时继续到下一个pod
你可以像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}}'
...输出会是这样的
映射[app:yourappname controller-revision-hash:598302898 pod-template-generation:1]
请注意,有些标签可能不会被其他pod共享——选择“app”似乎是最简单的一个
您可以根据需要选择以下两种方式:
Kubectl -n my_namespace记录部署/my_deployment——all-containers=true——10m以来的日志 $(kubectl get pods -n "my_namespace" | sed 1d | cut -d" " -f1);Do kubectl logs $i -n "my_namespace" "app_name" | grep -i "filter_string you want to";完成
以前提供的解决方案并不是最优的。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