运行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中应用过滤器来查看特定容器中的日志。

如果豆荚的命名有意义,可以使用简单的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需要运行这个动态构建的命令。

在本例中,当Pod中定义了多个container时,可以替换<namespace>和<app-name>来获取日志。

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

您也可以通过服务名称来完成此操作。

首先,尝试找到对应于相同服务的多个pod的各自pod的服务名称。库贝特尔得到svc。

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

kubectl logs -f service/<service-name>

我考虑的另一个解决方案是使用K9S,这是一个很棒的kube管理工具。

安装后使用非常简单明了:

 k9s -n my-namespace --context the_context_name_in_kubeconfig

(如果kubeconfig不在默认位置,则添加kubeconfig =path/to/kubeconfig prefix)。

默认视图将列出所有pod列表:

我们可以通过输入冒号将视图更改为其他Kube控制器,如副本集(关于复制控制器的问题,请注意它们已弃用),部署,cron作业等,然后开始输入所需的控制器-正如我们可以看到K9S为我们提供了自动补全功能:

我们可以看到当前命名空间中的所有副本集:

我们可以通过单击enter选择所需的副本集,然后我们将看到与此副本集相关的所有pod的列表-然后我们可以按'l'查看每个pod的日志。

所以,不像在stern的情况下,我们仍然需要进入每个舱,并查看其日志,但我认为这是非常方便的K9S -我们首先查看相关控制器的所有舱,然后通过简单地导航进入,l和escape来调查每个舱的日志。