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

How to get content of a kubernetes container log files in the Stackdriver in google cloud?

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

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

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

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

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

顺便说一句,似乎甚至将 sidecar 容器添加到 pod 本身,也会扰乱我的主容器的正常功能。我认为这与我如何定义我可能遗漏的 sidecar 容器有关?

提前感谢您的任何建议!

萨曼塔

您不需要创建任何符号链接。将卷挂载到主容器中就足够了,这样它就可以直接写入挂载的卷。您链接的页面恰好描述了这一点。尝试使用以下代码段 (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。