Answers:
您可以使用标签
kubectl logs -l app=elasticsearch
--all-namespaces
。
-f
现在就可以使用(从Kubernetes 1.12+ / kubectl
1.12+开始)。还有@Shubham-它按接收到的顺序显示消息,日志行上没有标签或任何内容。这只是为了快速调试。如果您需要更多日志详细信息,则需要将日志发送到中央日志系统,例如EFK,SumoLogic,Datadog等
您可以使用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共享-选择“应用”似乎是最简单的标签
先前提供的解决方案不是最佳的。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/
我使用以下简单脚本从部署的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的日志。
一种选择是通过Fluentd / ElasticSearch设置集群日志记录,如https://kubernetes.io/docs/user-guide/logging/elasticsearch/中所述。一旦日志进入ES,就可以轻松地在Kibana中应用过滤器来查看某些容器中的日志。
在此示例中,当Pod中定义了多个容器时,可以替换<namespace>
和<app-name>
获取日志。
kubectl -n <namespace> logs -f deployment/<app-name>
--all-containers=true --since=10m
如果吊舱的命名有意义,则可以使用简单的“普通旧式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才能运行此动态构建的命令。
不确定这是否是新事物,但是通过部署可以做到这一点:
kubectl logs deployment/app1