显示来自 运行 kubernetes pod 的日志的单个命令
Single command to display logs from running kubernetes pod
想要使用单个命令继续从特定 pod 流式传输日志。目前我必须做
kubectl get pods
(列出所有运行 pods)
- 从列表中查找 运行 pod 并复制 pod 名称
kubectl logs <pod name> -f
(从 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 等的日志。
终于想出了解决办法。这会有些 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}')
您可以使用 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
想要使用单个命令继续从特定 pod 流式传输日志。目前我必须做
kubectl get pods
(列出所有运行 pods)- 从列表中查找 运行 pod 并复制 pod 名称
kubectl logs <pod name> -f
(从 pod 连续流式传输日志)
奖励积分:列表 pods 以某个单词开头,例如 kubectl get pods asset*
。这只会显示名称以 asset
你可以通过 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 等的日志。
终于想出了解决办法。这会有些 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}')
您可以使用 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