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

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


当前回答

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

其他回答

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

你可以使用标签

kubectl logs -l app=elasticsearch

你可能想要指定——all-containers——ignore-errors,以便:

包括来自多个容器的吊舱的日志 在致命错误(例如,无法检索日志)时继续到下一个pod

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

在前面答案的基础上,如果添加-f,可以跟踪日志。

kubectl logs -f deployment/app

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