如何在Kubernetes容器中从一个容器访问另一个容器stdout和stderr

时间:2019-07-17 12:12:21

标签: logging kubernetes openshift fluentd

我有一个装有两个容器的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。
我需要我的容器可以访问用第三方容器编写的日志。
在“我的容器”内部,我想从“第三方”容器中收集所有stdout和stderr,添加一些元数据并用记录器编写。

我不能将特权容器与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: {}

3 个答案:

答案 0 :(得分:0)

由于Pod内的容器共享相同的持久层,因此您可以安装Shared Volume,以使这两个数据均可访问。

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

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

我想我理解您的要求。 我偶然发现了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

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

查看上面的链接以获取详细信息。