我有一个 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
然后,您将能够通过以下方式看到此hello
kubectl 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
容器引擎处理生成的任何输出并将其重定向到容器化应用程序的
stdout
和stderr
流。
在 Linux 上,进程中打开的文件描述符集可以在路径
/proc/PID/fd/
下访问,其中PID
是进程标识符。文件描述符/proc/PID/fd/0
是stdin
的,/proc/PID/fd/1
是stdout
的,/proc/PID/fd/2
是stderr
的。
因此,假设容器中的主命令具有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
。