如何在 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。
我是 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。