我是kubernetes和Google Cloud的新手,我需要一些帮助。

我们有一个带有单个容器的容器,该容器在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(例如,通过将tail命令发送到sidecar容器)。然后,这些日志消息将被堆栈驱动程序选择,就像它们在容器的标准输出中一样。

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

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

顺便说一句,似乎甚至将sidecar容器添加到了pod本身,也干扰了我的主容器的正常功能。我认为这与我在可能遗漏了一些东西的边车容器中定义的方式有关?

在此先感谢您的任何建议!

萨曼塔

最佳答案

您无需创建任何符号链接(symbolic link)。将卷安装在主容器中就足够了,这样它就可以直接写入已安装的卷。您链接的页面对此进行了准确描述。尝试使用以下代码段(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: {}

只需使用您自己的主容器代替“计数”容器即可。当然,如果您的应用程序将日志发送到/ var / log以外的其他目录,则需要相应地更改主容器中的mountPath。

关于logging - 如何在Google Cloud的Stackdriver中获取kubernetes容器日志文件的内容?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46507870/

10-09 06:47
查看更多