运行kubectl日志可以看到一个Kubernetes容器的stderr/stdout。

我如何获得一组pod的聚合stderr/stdout,最好是由某个复制控制器创建的那些?


当前回答

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

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

其他回答

你可以像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”似乎是最简单的一个

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

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

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

kubectl logs -f service/<service-name>

我使用这个简单的脚本从部署的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的日志。

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

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

这个回答试图提供一个简洁的例子和解释。为了获得一组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。