kubectl 日志 - 连续
kubectl logs - continuously
kubectl logs <pod-id>
从我的部署中获取最新日志 - 我正在处理一个错误并且有兴趣了解运行时的日志 - 如何获取连续的日志流?
编辑:最后更正了问题。
kubectl logs -f <pod-id>
您可以使用 -f
标志:
-f, --follow=false: Specify if the logs should be streamed.
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#logs
kubectl logs --help
将指导您:
示例:
# Begin streaming the logs of the ruby container in pod web-1
kubectl logs -f -c ruby web-1
标志:
-f, --follow[=false]: Specify if the logs should be streamed.
您也可以添加 --since=10m
或从那个相对时间之前开始。
等待 kubes 启动 pod 然后继续...
k8s_pod=some_pod
kubectl get pods -w $k8s_pod | while read LOGLINE
do
[[ "${LOGLINE}" == *"Running"* ]] && pkill -P $$ kubectl
done
尾日志
for line in $(kubectl get pods | grep $k8s_pod | awk '{print }'); do
kubectl logs -f $line | tee logfile
done
寻找成功指标
tail logfile | grep successful!
RESULT=$?
exit $RESULT
我需要访问一个长 运行 pod 的日志,并且 -f
从几天前开始流式传输日志,这将花费数小时才能到达我需要查看的位置(只是最后几分钟左右)。
有一个 --since=10m
标志,但它似乎对我不起作用。
令人惊讶的是 --tail=100
,其中 100
是要显示的最近行数。
如果您想从多 pod 应用程序获取日志流,您可以使用 kubetail,示例:
kubectl get pods
NAME READY STATUS RESTARTS AGE
app2-v31-9pbpn 1/1 Running 0 1d
app2-v31-q74wg 1/1 Running 0 1d
kubetail app2
使用该命令,kubetail tailing 来自 pod app2-v31-9pbpn and[=22 的日志=] app2-v31-q74wg
kubctl logs -f=true [pod-name] -c [container-name]
如果 pod 上只有一个容器,则容器名称不是必需的,否则使用带有 -c 选项的容器名称。
-f 即 follow 默认为 false。如果您不将其设置为 true,您将获得容器日志的快照。
试试这个,
来自 pods
的尾日志
kubectl --tail <"no of lines"> 日志 <"pod_name">
示例:
kubectl --tail 100 条日志app_pod
您可以使用 -f 跟踪日志
kubectl logs -f <pod_name>
如果日志停止很可能是 pod 崩溃了,你能检查一下 pod 是否真的 运行 吗?检查年龄或 :
kubectl describe deploy/ds <deploy_or_ds_name>?
或者你也可以在有多个容器的情况下检查 pod 中容器的日志
kubectl logs -f <pod_name> -c <container_name>
建议
您似乎希望在不使用“繁重”的第 3 方日志记录解决方案的情况下从终端查看日志。
为此,我会考虑使用 K9S,这是一个很棒的 CLI 工具,可以帮助您控制集群 - 查看不同的 k8s 资源,在工作负载之间导航,深入日志并持续观察它们。
如何使用该工具(几行)
在当前终端中设置 K8S 上下文后,您只需输入 k9s
即可点击仪表板。从那里,您可以通过键入 ":"
和资源名称来键入您希望查看的资源(服务、部署、pod..)。
您也可以从名称空间级别开始,一直到 pods 和容器日志 - 如下例所示:
备选方案
如果您不仅限于 CLI,还想在本地 运行 我会推荐 Lens。
如果要从特定命名空间获取日志,可以使用任一命令,
kubectl logs -n <NAMESPACE> -f <POD_NAME> -c <CONTAINER_NAME>
或
kubectl logs -n <NAMESPACE> -p <POD_NAME> -c <CONTAINER_NAME> --previous=false
除了此处已提出的其他建议,我还想补充两点:
- 您可以使用
-l
标志通过标签跟踪 pods 的日志,而不是获取单个 pod 名称:kubectl logs -f -l app=cwagent-prometheus -n amazon-cloudwatch
。如果没有匹配的 pods. 这个命令仍然会死掉
- 您可以使用 overmind or foreman 之类的东西将
Procfile
条日志命令组合到 运行:
cloudwatch: kubectl logs -f -l app=cwagent-prometheus -n amazon-cloudwatch
egress: kubectl logs -f -l istio=egressgateway -n istio-ingress
extauth: kubectl logs -f -l context=api-gateway -n istio-ingress
external-dns: kubectl logs -f -l app=external-dns -n external-dns
ingress: kubectl logs -f -l istio=ingressgateway -n istio-ingress
istiod: kubectl logs -f -l app=istiod -n istio-system
ratelimit: kubectl logs -f -l app=ratelimit -n istio-ingress
redis: kubectl logs -f -l app.kubernetes.io/name=redis -n istio-ingress
使用此 Procfile
您可以获得 color-coded 日志输出的聚合视图(此处未显示颜色):
$ OVERMIND_AUTO_RESTART=cloudwatch,external-dns,ingress,egress,extauth,ratelimit,istiod,redis \
overmind s \
-f Procfile-logs
system | Tmux socket name: overmind-api-gateway-1mvHWIKJ47dOFnOZVLfWuO
system | Tmux session ID: api-gateway
system | Listening at ./.overmind.sock
ratelimit | Started with pid 57088...
istiod | Started with pid 57074...
ingress | Started with pid 57061...
egress | Started with pid 57036...
cloudwatch | Started with pid 57031...
external-dns | Started with pid 57051...
redis | Started with pid 57095...
extauth | Started with pid 57041...
您可以将此命令放在 Makefile
中,这样您就可以 运行 像这样:
$ make logs
如果所有 pods 消失,此示例中的 OVERMIND_AUTO_RESTART
会导致 overmind
重新启动命令。
kubectl logs -f zk-app-0 --tail 10
此命令将从最后 10 行开始流式传输日志。如果此处未提及 tail,k8s 将流式传输所有可用日志(即最后 10 MB 日志或最后 5 个日志轮换)。
但是有时我会遇到日志流停止的问题。然后我再次按 ctrl-c 和 运行 命令。
从容器中的进程流式传输 stdout 和 stderr 的另一种方法是使用 kubectl attach。
kubectl attach zk-app-0
这将附加到主容器并流式传输控制台日志。但是,这不会在 kubectl 日志中出现任何额外的日志记录功能。在这种情况下,如果日志记录停止,只需按键盘上的回车键,它就会恢复。
kubectl logs <pod-id>
从我的部署中获取最新日志 - 我正在处理一个错误并且有兴趣了解运行时的日志 - 如何获取连续的日志流?
编辑:最后更正了问题。
kubectl logs -f <pod-id>
您可以使用 -f
标志:
-f, --follow=false: Specify if the logs should be streamed.
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#logs
kubectl logs --help
将指导您:
示例:
# Begin streaming the logs of the ruby container in pod web-1
kubectl logs -f -c ruby web-1
标志:
-f, --follow[=false]: Specify if the logs should be streamed.
您也可以添加 --since=10m
或从那个相对时间之前开始。
等待 kubes 启动 pod 然后继续...
k8s_pod=some_pod
kubectl get pods -w $k8s_pod | while read LOGLINE
do
[[ "${LOGLINE}" == *"Running"* ]] && pkill -P $$ kubectl
done
尾日志
for line in $(kubectl get pods | grep $k8s_pod | awk '{print }'); do
kubectl logs -f $line | tee logfile
done
寻找成功指标
tail logfile | grep successful!
RESULT=$?
exit $RESULT
我需要访问一个长 运行 pod 的日志,并且 -f
从几天前开始流式传输日志,这将花费数小时才能到达我需要查看的位置(只是最后几分钟左右)。
有一个 --since=10m
标志,但它似乎对我不起作用。
令人惊讶的是 --tail=100
,其中 100
是要显示的最近行数。
如果您想从多 pod 应用程序获取日志流,您可以使用 kubetail,示例:
kubectl get pods
NAME READY STATUS RESTARTS AGE
app2-v31-9pbpn 1/1 Running 0 1d
app2-v31-q74wg 1/1 Running 0 1d
kubetail app2
使用该命令,kubetail tailing 来自 pod app2-v31-9pbpn and[=22 的日志=] app2-v31-q74wg
kubctl logs -f=true [pod-name] -c [container-name]
如果 pod 上只有一个容器,则容器名称不是必需的,否则使用带有 -c 选项的容器名称。 -f 即 follow 默认为 false。如果您不将其设置为 true,您将获得容器日志的快照。
试试这个,
来自 pods
的尾日志kubectl --tail <"no of lines"> 日志 <"pod_name">
示例:
kubectl --tail 100 条日志app_pod
您可以使用 -f 跟踪日志
kubectl logs -f <pod_name>
如果日志停止很可能是 pod 崩溃了,你能检查一下 pod 是否真的 运行 吗?检查年龄或 :
kubectl describe deploy/ds <deploy_or_ds_name>?
或者你也可以在有多个容器的情况下检查 pod 中容器的日志
kubectl logs -f <pod_name> -c <container_name>
建议
您似乎希望在不使用“繁重”的第 3 方日志记录解决方案的情况下从终端查看日志。
为此,我会考虑使用 K9S,这是一个很棒的 CLI 工具,可以帮助您控制集群 - 查看不同的 k8s 资源,在工作负载之间导航,深入日志并持续观察它们。
如何使用该工具(几行)
在当前终端中设置 K8S 上下文后,您只需输入 k9s
即可点击仪表板。从那里,您可以通过键入 ":"
和资源名称来键入您希望查看的资源(服务、部署、pod..)。
您也可以从名称空间级别开始,一直到 pods 和容器日志 - 如下例所示:
备选方案
如果您不仅限于 CLI,还想在本地 运行 我会推荐 Lens。
如果要从特定命名空间获取日志,可以使用任一命令,
kubectl logs -n <NAMESPACE> -f <POD_NAME> -c <CONTAINER_NAME>
或
kubectl logs -n <NAMESPACE> -p <POD_NAME> -c <CONTAINER_NAME> --previous=false
除了此处已提出的其他建议,我还想补充两点:
- 您可以使用
-l
标志通过标签跟踪 pods 的日志,而不是获取单个 pod 名称:kubectl logs -f -l app=cwagent-prometheus -n amazon-cloudwatch
。如果没有匹配的 pods. 这个命令仍然会死掉
- 您可以使用 overmind or foreman 之类的东西将
Procfile
条日志命令组合到 运行:
cloudwatch: kubectl logs -f -l app=cwagent-prometheus -n amazon-cloudwatch
egress: kubectl logs -f -l istio=egressgateway -n istio-ingress
extauth: kubectl logs -f -l context=api-gateway -n istio-ingress
external-dns: kubectl logs -f -l app=external-dns -n external-dns
ingress: kubectl logs -f -l istio=ingressgateway -n istio-ingress
istiod: kubectl logs -f -l app=istiod -n istio-system
ratelimit: kubectl logs -f -l app=ratelimit -n istio-ingress
redis: kubectl logs -f -l app.kubernetes.io/name=redis -n istio-ingress
使用此 Procfile
您可以获得 color-coded 日志输出的聚合视图(此处未显示颜色):
$ OVERMIND_AUTO_RESTART=cloudwatch,external-dns,ingress,egress,extauth,ratelimit,istiod,redis \
overmind s \
-f Procfile-logs
system | Tmux socket name: overmind-api-gateway-1mvHWIKJ47dOFnOZVLfWuO
system | Tmux session ID: api-gateway
system | Listening at ./.overmind.sock
ratelimit | Started with pid 57088...
istiod | Started with pid 57074...
ingress | Started with pid 57061...
egress | Started with pid 57036...
cloudwatch | Started with pid 57031...
external-dns | Started with pid 57051...
redis | Started with pid 57095...
extauth | Started with pid 57041...
您可以将此命令放在 Makefile
中,这样您就可以 运行 像这样:
$ make logs
如果所有 pods 消失,此示例中的 OVERMIND_AUTO_RESTART
会导致 overmind
重新启动命令。
kubectl logs -f zk-app-0 --tail 10
此命令将从最后 10 行开始流式传输日志。如果此处未提及 tail,k8s 将流式传输所有可用日志(即最后 10 MB 日志或最后 5 个日志轮换)。
但是有时我会遇到日志流停止的问题。然后我再次按 ctrl-c 和 运行 命令。
从容器中的进程流式传输 stdout 和 stderr 的另一种方法是使用 kubectl attach。
kubectl attach zk-app-0
这将附加到主容器并流式传输控制台日志。但是,这不会在 kubectl 日志中出现任何额外的日志记录功能。在这种情况下,如果日志记录停止,只需按键盘上的回车键,它就会恢复。