单个命令显示来自正在运行的kubernetes pod的日志

时间:2018-11-08 14:59:17

标签: kubernetes kubectl

只需要一个命令就可以继续流式传输来自特定Pod的日志。目前我要做的

  • kubectl get pods(列出所有正在运行的Pod)
  • 从列表中检查正在运行的吊舱并复制吊舱名称
  • kubectl logs <pod name> -f(来自pod的连续日志流)

加分点:列出以诸如kubectl get pods asset*之类的单词开头的豆荚。只会显示名称以资产开头的广告连播

4 个答案:

答案 0 :(得分:1)

最终能够找出解决方案。这可能有点骇人听闻,但我基本上会使用--field-selector=status.phase=Running并仅使用-o=name标志来获取名称。 我的最终命令将是

kubectl logs -f $(kubectl get pods --field-selector=status.phase=Running -o=name | awk '/asset/ {print $1;exit}')

链接:Field Selectors

答案 1 :(得分:0)

您可以通过kubectl get pods获得所有结果,而grep可以完成其余工作。

[root@k8s-m1 ~]# kubectl get pods | grep httpd*-app
httpd-app-66cb7d499b-4nfl4   1/1     Running   0          6m39s
httpd-app-66cb7d499b-c2blq   1/1     Running   0          6m39s
httpd-app-66cb7d499b-dt4tr   1/1     Running   0          6m39s

答案 2 :(得分:0)

您可以使用一些bash技巧来实现:

示例:

获取kube系统名称空间中以名称模式 core 开头的pod的日志。

(x, y)

甚至简单:

O(xy)

但是在生产中,您应该使用fluentbit将日志流式传输到ELK,然后在kibana UI中使用过滤器来获取每个pod /部署/命名空间等的日志。

https://github.com/fluent/fluent-bit-kubernetes-logging

答案 3 :(得分:0)

您可以使用awk来实现。您可以使用:

kubectl logs -n <namespace> $(kubectl get pod -n <namespace> |  awk '/<pattern>/{print $1}') -f

在这里,您可以在<pattern>字段中指定正则表达式。 print $1仅打印匹配对象的第一列。在我们的例子中,它是pod名称。

例如:

kubectl logs -n kube-system $(kubectl get pod -n kube-system |  awk '/kube-proxy*/{print $1}') -f