来自 kubernetes 多个 pod 的特定文本的 Grep

问题描述

我有两个 Pod 为特定服务运行。我想获取与两个 Pod 相关的日志并检查特定文本。

为此我使用了,如here所述:

kubectl logs -l app=my-app -c my-app-container --since=25m | grep -i "search-text" |wc -l

这不会输出任何内容,即使有 search-text 的匹配文本

然后尝试使用 deployments

kubectl logs deployment/my-app-deployment -c my-app-container --since=90m | grep -i "search-text" |wc -l

如何在所有相关 Pod 中搜索此特定字符串?

kubectl logs my-pod-1 -c my-app-container --since=90m | grep -i "search-text" |wc -l,这给出了正确的计数。

参考资料:

Get all Logs from a specific container in a replica set
how to get logs of deployment from kubernetes

解决方法

kubectl logs 仅限于一次查看单个 Pod 的日志。但是,您可以使用 -l 标志来使用选择器(标签查询)进行过滤。例如:

kubectl logs -l app=nginx -l app=php 

如果您需要查看容器日志,请使用 -c 标志。可以在 here 中找到更多受支持的标志和示例。

当您能够看到来自所需 Pod/容器的日志时,就可以使用 grep 过滤掉输出。例如,我从 Pod 中获取了一些日志:

~$ kubectl logs nginx-app-b8b875889-4nn52
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty,will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Configuration complete; ready for start up

我只想看到带有“配置”一词的行,所以我执行:

$ kubectl logs nginx-app-b8b875889-4nn52 | grep configuration
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty,will attempt to perform configuration

或者如果我想计算带有“信息”一词的行:

$ kubectl logs nginx-app-b8b875889-4nn52 | grep info |wc -l
2

可以在 grep manual 中找到更多详细信息。请记住,如果您没有指定 --since=--tail= 之类的参数,并且您尝试查看日志的 Pod 运行了更长的时间,结果可能会产生误导。

通常,我还建议使用 SternKubetail 等第三方工具,它们比简单的 kubectl logs 更强大,但在您的用例中将两者结合使用:

  • kubectl logs -l

和:

  • | grep

是要走的路。

编辑:

还要确保您从正确的资源中获取信息。从您的问题来看,您似乎运行 kubectl logs deployment/my-app-deployment 而不是 kubectl logs my-pod-1 -c my-app-container 这与 my-app-deployment 部署不对应。列出所有部署、pod 和标签,以确保您检查了正确的资源。使用:

kubectl get deploy,pods --show-labels