运行kubectl日志可以看到一个Kubernetes容器的stderr/stdout。
我如何获得一组pod的聚合stderr/stdout,最好是由某个复制控制器创建的那些?
运行kubectl日志可以看到一个Kubernetes容器的stderr/stdout。
我如何获得一组pod的聚合stderr/stdout,最好是由某个复制控制器创建的那些?
当前回答
你可以从kubectl logs -h中得到帮助,根据信息,
kubectl logs -f deployment/myapp -c myapp --tail 100
-c是容器名称,——tail将显示最新的num行,但这将选择部署的一个pod,而不是所有pod。这是你必须记住的。
kubectl logs -l app=myapp -c myapp --tail 100
如果想显示所有pod的日志,可以使用-l并指定一个标签,但同时不使用-f。
其他回答
一种选择是通过Fluentd/ElasticSearch设置集群日志记录,如https://kubernetes.io/docs/user-guide/logging/elasticsearch/所述。一旦日志在ES中,就很容易在Kibana中应用过滤器来查看特定容器中的日志。
在前面答案的基础上,如果添加-f,可以跟踪日志。
kubectl logs -f deployment/app
您也可以通过服务名称来完成此操作。
首先,尝试找到对应于相同服务的多个pod的各自pod的服务名称。库贝特尔得到svc。
接下来,运行以下命令显示每个容器的日志。
kubectl logs -f service/<service-name>
你可以像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”似乎是最简单的一个
我创建了一个名为kubetail的小bash脚本来实现这一点。例如,跟踪名为“app1”的pod的所有日志,你可以这样做:
kubetail app1
你可以在这里找到脚本。