从 Kubernetes 多个 Pod 中搜索特定文本的 Grep

3
我有两个运行特定服务的Pod。我想获取与这两个Pod相关的日志并检查特定文本。
为此,我使用了如下所述的方式:这里: 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可以提供正确的计数。
参考: 从副本集中的特定容器获取所有日志
如何从 Kubernetes 获取部署的日志

1
你可以先执行以下命令来检查输出结果:kubectl logs -l app=my-app -c my-app-container --since=25m。它是否返回了预期的日志? - Krishna Chaurasia
1
您可以使用以下命令获取所有标签匹配的容器的Pod:kubectl logs -l app=my-app --all-containers | grep "time" | wc - Krishna Chaurasia
1
不确定哪里出了问题,请检查grep结果是否包含其他字符串,以确保您要查找的模式不需要使用\\进行转义。 - Krishna Chaurasia
让我们在聊天中继续这个讨论 - Krishna Chaurasia
2
我明白了。你有没有考虑使用更强大的日志跟踪工具,比如SternKubetail?它们和简单的kubectl logs一样易于使用,并提供更多选项,从我的角度来看,这将满足你的使用情况。 - Wytrzymały Wiktor
显示剩余5条评论
1个回答

1

kubectl logs 只能同时查看一个 pod 的日志。但是,您可以使用 -l 标志来使用选择器 (标签查询) 进行过滤。例如:

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

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

当您能够查看所需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

我希望只看到包含"configuration"一词的行,因此我执行以下操作:

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

如果我想要计算包含单词“info”的行数,则可以这样做:
$ kubectl logs nginx-app-b8b875889-4nn52 | grep info |wc -l
2

更多细节可以在grep手册中找到。请记住,如果您没有指定像--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 

@SachithMuhandiram 我做了一个可能会引起你兴趣的小修改,请看一下。 - Wytrzymały Wiktor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接