【问题标题】:How to access from one container to another container stdout and stderr inside Kubernetes pod如何在 Kubernetes pod 中从一个容器访问另一个容器 stdout 和 stderr
【发布时间】:2019-07-17 12:12:21
【问题描述】:

我有一个带有两个容器的 Pod。

apiVersion: v1
kind: Pod
metadata:
  name: test
spec:
  containers:
  - name: my-container
    image: google/my-container:v1
  - name: third-party
    image:  google/third-party:v1

一个容器是我的镜像,第二个是第三方镜像,我无法控制它的 stdout/stderr。
我需要 my-container 访问在第三方容器中编写的日志。
在“我的容器”中,我想从“第三方”容器中收集所有标准输出和标准错误,添加一些元数据并用我的记录器写入。

我不能将特权容器与 volumeMounts 一起使用。

如果我能做这样的事情,那就太好了。

 containers:
  - name: my-container
    image: google/my-container:v1
    volumeMounts:
    - name: varlog
      mountPath: /var/log

  - name: third-party
    image:  google/third-party:v1 
    stdout: /var/log/stdout
    stderr: /var/log/stderr

 volumes:
  - name: varlog
    emptyDir: {}

【问题讨论】:

  • 是的,但这不是我的情况。
  • 我不太了解这个问题。如果您的“第三方”容器像任何其他容器一样记录到 stdout/stderr,那么为什么您不能通过与其他容器一起使用的任何日志驱动程序获取其日志?

标签: logging kubernetes openshift fluentd


【解决方案1】:

基于为 docker 指定的 logging driver,docker 跟踪容器的日志。 docker 的默认日志驱动程序是json-file,它将容器的stdoutstderr 日志重定向到运行docker 的主机中的/var/log/containers 文件夹。

对于 Kubernetes,日志将在工作节点 /var/log/containers 文件夹中可用。

您可能正在寻找的是fluentd daemonset,它创建了一个守护程序集,它在每个工作节点中运行,然后帮助您将日志移动到 s3、cloudwatch 或 Elastic search。 fluentd 提供了许多水槽。您可以使用适合您需要的一种。我希望这就是你想用你的my-container 做的事情。

【讨论】:

  • 谢谢,不,不是这样,我已经在使用 fluentd 从所有容器中收集所有日志。在我的容器中,我需要访问第三方编写的日志
  • 第三方应用程序没有在您的 kubernetes 集群中作为容器运行?
  • 您是说我们的* 吗?
  • 是的,它在我们的 kubernetes 集群中作为容器运行
  • 那为什么不流利呢?您提到该程序写入标准输出/标准错误。它是文件而不是 stdout/stderr?
【解决方案2】:

我想我理解您的要求。 我偶然发现了 Logspout:https://github.com/gliderlabs/logspout

$ docker pull gliderlabs/logspout:latest

然后像这样运行容器,

$ docker run \
--volume=/var/run/docker.sock:/var/run/docker.sock \
gliderlabs/logspout \
raw://192.168.10.10:5000

然后它附加到主机上的所有容器,然后将它们的日志路由到任何你想要的地方。

查看上面的链接了解详情。

【讨论】:

    【解决方案3】:

    由于 pod 内的容器共享相同的持久层,您可以挂载 Shared Volume 以使两者都可以访问该数据。

    出于您的特定目的,您需要将两个流(stderrstdout)记录到卷中的文件中。然后,您需要将它们从主容器导出到您在集群中运行的任何日志记录驱动程序。

    虽然在规范中没有将这些输出写入文件的具体说明。

    【讨论】:

    • 第三方容器不是我的镜像,我无法控制stdout和stderr文件位置。
    • 可能你可以使用fluentd,正如我的回答中提到的那样
    • 我不想依赖fluentd,我需要我的进程能够访问另一个容器的日志
    • 定义是否需要日志文件或stdoutstderr。首先,您需要知道共享卷的两个容器中的日志文件位置和mountPath 指令。第二,两个流都是captured via logging driver,可以通过kubectl logs或节点内的日志轮换文件访问。
    • 我期待stdout/stderr,我想我会使用在一个Pod中的容器之间共享进程命名空间的方法。在 /proc/PID/fd1on 第三方容器上使用 tail。 kubernetes.io/docs/tasks/configure-pod-container/…
    猜你喜欢
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    • 2017-07-12
    • 1970-01-01
    • 2023-02-24
    • 2019-04-29
    相关资源
    最近更新 更多