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

除了此处已提出的其他建议,我还想补充两点:

  1. 您可以使用 -l 标志通过标签跟踪 pods 的日志,而不是获取单个 pod 名称:kubectl logs -f -l app=cwagent-prometheus -n amazon-cloudwatch。如果没有匹配的 pods.
  2. 这个命令仍然会死掉
  3. 您可以使用 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 日志中出现任何额外的日志记录功能。在这种情况下,如果日志记录停止,只需按键盘上的回车键,它就会恢复。