如何通过命令行在 kubectl pod 中生成日志



我有一个 mysqldb pod,当我们运行脚本 restorebackup.sh 时需要添加一个日志。脚本在 pod 内部,我需要在 pod 的一般日志中使用此日志(要使用 kubectl 获取日志服务/mysqldb 访问它)。

有什么办法可以做到这一点吗?

通常,kubectl logs显示第一个进程的stdout(pid=1)。 因此,您可以尝试将日志放入 pod 中的/proc/1/fd/1。

pod 中的示例命令:

echo hello >> /proc/1/fd/1

然后,您将能够通过以下方式看到此hellokubectl logs.

对于您的脚本restorebackup.sh,也许您可以尝试sh restorebackup.sh >> /proc/1/fd/1重定向所有输出。

  • kubectl logs 只不过是其中容器(pid 1 进程)的 stdout&stderr 流
  • 因此,要将 restorebackup.sh 输出保存到文件中并将其流式传输到标准输出,我们可以使用 tee 等实用程序(它将输出保存到文件和标准输出)

例:

[root@c3~]# echo foo | tee boo
foo
[root@c3~]# cat boo
foo
  • 在您的情况下,应修改restorebackup.sh以使所有输出生成命令都应使用tee

容器引擎处理生成的任何输出并将其重定向到容器化应用程序的stdoutstderr流。

在 Linux 上,进程中打开的文件描述符集可以在路径/proc/PID/fd/下访问,其中PID是进程标识符。文件描述符/proc/PID/fd/0stdin的,/proc/PID/fd/1stdout的,/proc/PID/fd/2stderr的。

因此,假设容器中的主命令具有PID '1',请在k8s Pod中运行以下命令:

$ sh restorebackup.sh >> /proc/1/fd/1

然后,您将在 Pod 的日志中看到其stdout

$ kubectl logs yourPodName
...
some stdout from your script...
...

请记住,这样你只写你的 bash 脚本的stdout

要从脚本编写stdout 和 stderr,请像这样运行它:

$ sh restorebackup.sh 1>> /proc/1/fd/1 2>> /proc/1/fd/2

或者修改脚本的代码,将信息消息写入/proc/1/fd/1,将错误消息写入/proc/1/fd/2

相关内容

  • 没有找到相关文章

最新更新