运行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。

其他回答

我使用这个简单的脚本从部署的pods中获取日志:

#!/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_deploy .sh "deploy -name"。

然后脚本将显示所有以“deployment-name”开头的pod的日志。

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

kubetail app1

你可以在这里找到脚本。

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

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

你可以从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。

您可以根据需要选择以下两种方式:

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";完成