如何在Google云端的Stackdriver中获取kubernetes容器日志文件的内容?

时间:2017-09-30 23:13:28

标签: logging kubernetes stackdriver logfiles google-kubernetes-engine

我是kubernetes和谷歌云的新手,我需要一些帮助。

我们有一个pod,其中一个容器在gke中的kubernetes中运行。容器发送到其stdout的日志消息以及它写入其存储中的少量日志文件的一些日志消息。

发送到容器标准输出的日志消息由Stackdriver选取,我们可以按预期看到它们。我想在stackdriver中将消息写入日志文件中。 我从这里读到的理解是:(https://kubernetes.io/docs/concepts/cluster-administration/logging/#using-a-sidecar-container-with-the-logging-agent),这里的解决方案是在pod中添加一个sidecar容器,并在两个容器之间共享一个持久卷,并以某种方式复制共享卷中的日志文件然后使sidecar容器将共享日志文件的内容发送到它自己的stdout(例如,通过向sidecar容器发送tail命令)。那些日志消息将被stackdriver选中,因为它们位于容器的标准输出中。

问题是,如何与sidecar容器共享主容器的日志文件。我试图使用符号链接(通过向第一个容器添加ln -s命令)获取共享卷中的日志文件,但是然后sidecar容器无法看到这些文件的内容(尽管它能够看到这些文件的列表,我想因为那只是存储主容器的快捷方式,而不是文件的真实副本。)

另一个问题是,当我在定义我的pod的模板文件中向主容器添加命令(使用命令/ args []的ln -s命令)时,容器映像的默认命令将不会是跑!所以我不再在stackdriver中看到主容器的原始日志消息了!

顺便说一句,它似乎甚至将边车容器添加到吊舱本身,干扰了我的主要容器的正常功能。我认为这与我如何定义我可能遗漏某些东西的边车容器有关?

提前感谢任何建议!

SAMANTA

1 个答案:

答案 0 :(得分:2)

您不需要创建任何符号链接。将卷装入主容器就足以直接写入已装入的卷。您链接的页面正好描述了这一点。尝试使用以下代码段(source):

apiVersion: v1
kind: Pod
metadata:
  name: counter
spec:
  containers:
  - name: count
    image: busybox
    args:
    - /bin/sh
    - -c
    - >
      i=0;
      while true;
      do
        echo "$i: $(date)" >> /var/log/1.log;
        echo "$(date) INFO $i" >> /var/log/2.log;
        i=$((i+1));
        sleep 1;
      done
    volumeMounts:
    - name: varlog
      mountPath: /var/log
  - name: count-log-1
    image: busybox
    args: [/bin/sh, -c, 'tail -n+1 -f /var/log/1.log']
    volumeMounts:
    - name: varlog
      mountPath: /var/log
  - name: count-log-2
    image: busybox
    args: [/bin/sh, -c, 'tail -n+1 -f /var/log/2.log']
    volumeMounts:
    - name: varlog
      mountPath: /var/log
  volumes:
  - name: varlog
    emptyDir: {}

只需使用您自己的主容器代替" count"容器。当然,如果您的应用程序将日志发送到与/ var / log不同的目录,则需要相应地更改主容器中的mountPath。