docker - 从 pod 内部访问 Kubernetes pod 的日志文件?

标签 docker logging kubernetes log-rotation

我目前正在将旧服务器迁移到 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 集群级别日志架构文档中的选项之一,例如 12

关于docker - 从 pod 内部访问 Kubernetes pod 的日志文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50734313/

相关文章:

kubernetes - k8s如何精确地为命名空间保留资源?

docker - 如何调试 chrome 中的 headless pdf 打印问题?

python - 密码学 Python Docker 多阶段构建

hadoop - 如何为 Apache Hadoop NameNode 启用 GC 日志记录,同时防止日志文件覆盖和限制磁盘空间使用

xml - tomcat7-maven-plugin log4j : no appender could be found for logger (org. apache.catalina.startup.Catalina)

reactjs - 还是要使用npm start从带有前缀的网址(例如/client/static)中转换/static?

authorization - 为什么Kubernetes的 “kubectl”被 “Authorization error”中止?

使用不同的数据目录时docker没有响应

go - 在 docker 容器中生成一个新进程,该进程是从头开始构建的

logging - 命令窗口中更多行