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

Single command to display logs from running kubernetes pod

想要使用单个命令继续从特定 pod 流式传输日志。目前我必须做

奖励积分:列表 pods 以某个单词开头,例如 kubectl get pods asset*。这只会显示名称以 asset

开头的 pods

你可以通过 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

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

示例:

获取 kube-system 命名空间中以名称模式 core 开头的 pod 的日志。

kubectl logs --namespace=kube-system $(kubectl get pods --namespace=kube-system -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}' | grep core)

甚至简单:

kubectl logs --namespace=kube-system $(kubectl get pods -o=name --all-namespaces | grep core)

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

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

终于想出了解决办法。这会有些 hacky,但我基本上会使用 --field-selector=status.phase=Running 并使用 -o=name 标志获取名称。 我的最终命令类似于

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

链接:Field Selectors

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

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

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

例如:

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