Kubernetes Pod的日志到底来自哪里(在容器级别)?

我希望将一些日志从使用var query = from gizmo in _context.Gizmos from widget in gizmo.Widgets where widget.Id == myId select new { gizmo,widget }; foreach ( var result in query ) result.gizmo.Widgets.Remove(result.widget); 运行的命令重定向到该pod的日志,以便可以使用kubectl exec(或者实际上是kubectl logs <pod-name>)读取它们。运行命令时,我可以看到需要的日志作为输出,它们存储在运行容器中的单独日志目录中。

将输出(即/var/log/containers/<pod-name>.log)重定向到我认为正在镜像>> logfile.log中内容的文件不会更新该容器的日志,也不会重定向到stdout。

调用kubectl logs <pod-name>时,我的理解是kubelet从其内部kubectl logs <pod-name>目录中获取它们。但是,什么决定哪些日志存储在那里?是否与将日志存储在任何其他Docker容器中的方式相同?

是否可以检查/跟踪日志记录过程,或确定这些日志来自何处?

h5531856138 回答:Kubernetes Pod的日志到底来自哪里(在容器级别)?

捕获来自容器STDOUTSTDERR中容器的日志,并将其存储在/ var / log / containers中的文件中。这是运行kubectl log时显示的内容。

为了理解为什么运行kubectl log时未显示kubectl exec运行的命令的输出,我们来看一个例子,它是如何工作的:

首先启动运行ubuntu的Pod,该Pod会永远休眠:

$> kubectl run test --image=ubuntu --restart=Never -- sleep infinity

执行进去

$> kubectl exec -it test bash

从容器内部看到,正在捕获的是PID 1的STDOUTSTDERR。当您对容器执行kubectl exec时,将与PID 1一起创建一个新进程:

root@test:/# ps -auxf
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         7  0.0  0.0  18504  3400 pts/0    Ss   20:04   0:00 bash
root        19  0.0  0.0  34396  2908 pts/0    R+   20:07   0:00  \_ ps -auxf
root         1  0.0  0.0   4528   836 ?        Ss   20:03   0:00 sleep infinity

重定向到STDOUT无效,因为/dev/stdout是访问它的进程的符号链接(/proc/self/fd/1而不是/proc/1/fd/1)。

root@test:/# ls -lrt /dev/stdout
lrwxrwxrwx 1 root root 15 Nov  5 20:03 /dev/stdout -> /proc/self/fd/1

为了查看使用kubectl exec运行的命令的日志,需要将日志重定向到kubelet(pid 1的STDOUTSTDERR)捕获的流。可以通过将输出重定向到/proc/1/fd/1来完成。

root@test:/# echo "Hello" > /proc/1/fd/1

退出交互式shell并使用kubectl logs检查日志现在应该显示输出

$> kubectl logs test
Hello
本文链接:https://www.f2er.com/3157582.html

大家都在问