【问题标题】:Grep for specific text from kubernetes multiple pods从 kubernetes 多个 pod 中获取特定文本的 Grep
【发布时间】:2021-03-22 16:55:40
【问题描述】:

我有两个针对特定服务运行的 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 -l app=my-app -c my-app-container --since=25m?它会返回预期的日志吗?
  • @KrishnaChaurasia 是的,它有输出。
  • 您可以使用它来获取与标签匹配的所有容器的 pod:kubectl logs -l app=my-app --all-containers | grep "time" | wc
  • 不确定哪里出了问题,请检查 grep 是否为任何其他字符串生成结果,以确保您要查找的模式不需要使用 `\` 转义。
  • 我明白了。您是否考虑过使用更强大的工具来跟踪日志,例如 SternKubetail?它们与简单的kubectl logs 一样易于使用,并提供了更多选项,我认为这些选项可以满足您的用例。

标签: logging kubernetes grep kubernetes-pod wc


【解决方案1】:

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 运行了较长时间,则结果可能会产生误导。

通常,我还建议使用 3rd 方工具,例如 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 我做了一个你可能感兴趣的小编辑。请看一看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-14
  • 1970-01-01
  • 1970-01-01
  • 2016-02-10
  • 1970-01-01
相关资源
最近更新 更多