我目前正在将旧服务器迁移到 Kubernetes,我发现 kubectl
或仪表板仅显示最新的日志文件,而不显示旧版本。为了访问旧文件,我必须 ssh 到节点机器并搜索它。
除了麻烦之外,我的团队还希望限制对节点机器本身的访问,因为它们将运行来自许多不同团队的 Pod,并且不受限制的访问可能会成为安全问题。
所以我的问题是:我可以配置 Kubernetes(或 Docker 镜像),以便将这些旧的(轮换的)日志文件存储在可从 Pod 内部访问的某个目录中吗?
- 当然,在紧要关头,我可能可以执行类似
run_server.sh | tee /var/log/my-own.log
的命令。当 Pod 启动时...但是,为了正确执行此操作,我必须添加整个日志文件轮换功能,基本上重复 Kubernetes 已经在做的事情。
最佳答案
因此有几种方法和场景可以实现这一点。如果您只对上次重新启动之前同一 Pod 的日志感兴趣,可以使用 --previous
标志来查看日志:
kubectl logs -f <pod-name-xyz> --previous
但由于在您的情况下,您有兴趣查看超过一次循环的日志文件,因此您可以按照以下方法进行操作。将 sidecar 容器添加到您的应用程序容器中:
volumeMounts:
- name: varlog
mountPath: /tmp/logs
- name: log-helper
image: busybox
args: [/bin/sh, -c, 'tail -n+1 -f /var/log/*.log']
volumeMounts:
- name: varlog
mountPath: /tmp/logs
volumes:
- name: varlog
hpostPath: /var/log
这将允许将 /var/log
目录中的所有日志从主机转移到容器内的 /tmp/log
目录,并且该命令将确保所有文件都被刷新。现在您可以运行:
kubectl logs <pod-name-abc> -c count-log-1
此解决方案取消了 SSH 访问,但仍然需要访问 kubectl 并添加 sidecar 容器。我仍然认为这是一个糟糕的解决方案,您可以考虑 Kubernetes 集群级别日志架构文档中的选项之一,例如 1或2
关于docker - 从 pod 内部访问 Kubernetes pod 的日志文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50734313/