运行kubectl日志可以看到一个Kubernetes容器的stderr/stdout。
我如何获得一组pod的聚合stderr/stdout,最好是由某个复制控制器创建的那些?
运行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";完成