我希望将一些日志从使用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容器中的方式相同?
是否可以检查/跟踪日志记录过程,或确定这些日志来自何处?
答案 0 :(得分:5)
捕获来自容器STDOUT
和STDERR
中容器的日志,并将其存储在/ 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的STDOUT
和STDERR
。当您对容器执行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的STDOUT
和STDERR
)捕获的流。可以通过将输出重定向到/proc/1/fd/1
来完成。
root@test:/# echo "Hello" > /proc/1/fd/1
退出交互式shell并使用kubectl logs
检查日志现在应该显示输出
$> kubectl logs test
Hello