【问题标题】:Log rotation on logs consuming disk space in Google Cloud Kubernetes pod在 Google Cloud Kubernetes pod 中消耗磁盘空间的日志上的日志轮换
【发布时间】:2018-11-16 00:48:29
【问题描述】:

我们在 Google Cloud Platform Kubernetes 集群中有一个将 JsonFormatted 写入 StdOut 的 pod。这是由 Stackdriver 开箱即用的。但是,我们看到 pod 的磁盘使用量不断增长,我们无法理解如何在 Deployment 上设置最大大小以进行日志轮换。

关于 Google Cloud 和 Kubernetes 的文档对此并不清楚。

这只是最后一个小时:

【问题讨论】:

  • @chisva 刚刚遇到同样的问题。临时映像中的单个二进制文件,没有文件系统日志记录,只有标准输出。你想清楚了吗?盘面图表是否曾跳回或趋于平稳?

标签: logging kubernetes google-cloud-platform log-rotation kubernetes-pod


【解决方案1】:

您确定 Pod 的磁盘使用率高是因为日志吗? 如果应用程序将日志写入标准输出,它不会使用 pod 内的任何磁盘空间。 所有日志通常都存储在节点文件系统上的一个日志文件中,并且可以由节点 logrotate 进程管理。

也许应用程序将 pod 的磁盘空间用于其他用途,例如临时文件或调试信息?

这里是documentation中与日志轮换相关的部分:

节点级别的日志记录:

容器化应用程序写入 stdout 和 stderr 的所有内容都是 由容器引擎处理和重定向到某个地方。例如, Docker 容器引擎将这两个流重定向到 logging driver,它在 Kubernetes 中配置为写入 json格式。

节点级日志记录的一个重要考虑因素是实现日志 轮换,以便日志不会消耗所有可用存储 节点

Kubernetes 目前不负责轮换日志,而是 部署工具应该建立一个解决方案来解决这个问题。为了 例如,在 Kubernetes 集群中,由 kube-up.sh 脚本部署, 有一个 logrotate 工具配置为每小时运行一次。

您还可以设置容器运行时来轮换应用程序的日志 自动,例如通过使用 Docker 的 log-opt。

在 kube-up.sh 脚本中,后一种方式用于 COS 上的镜像 GCP,前一种方法用于任何其他环境。在 在这两种情况下,默认情况下轮换配置为在登录时发生 文件超过 10MB。

作为示例,您可以找到有关 kube-up.sh 的详细信息 在对应的script中为GCP上的COS镜像设置日志记录。

这里是与logrotate相关的部分脚本:

# Installs logrotate configuration files
function setup-logrotate() {
  mkdir -p /etc/logrotate.d/
  # Configure log rotation for all logs in /var/log, which is where k8s services
  # are configured to write their log files. Whenever logrotate is ran, this
  # config will:
  # * rotate the log file if its size is > 100Mb OR if one day has elapsed
  # * save rotated logs into a gzipped timestamped backup
  # * log file timestamp (controlled by 'dateformat') includes seconds too. This
  #   ensures that logrotate can generate unique logfiles during each rotation
  #   (otherwise it skips rotation if 'maxsize' is reached multiple times in a
  #   day).
  # * keep only 5 old (rotated) logs, and will discard older logs.
  cat > /etc/logrotate.d/allvarlogs <<EOF
/var/log/*.log {
    rotate ${LOGROTATE_FILES_MAX_COUNT:-5}
    copytruncate
    missingok
    notifempty
    compress
    maxsize ${LOGROTATE_MAX_SIZE:-100M}
    daily
    dateext
    dateformat -%Y%m%d-%s
    create 0644 root root
}
EOF

}

【讨论】:

  • 这似乎并不完全正确。使用 Docker 的 max-sizemax-file 选项完成日志轮换。见github.com/kubernetes/kubernetes/pull/40634
  • 我可以确认以上对于 GKE 和 COS 工作节点镜像是正确的
猜你喜欢
  • 2018-12-08
  • 2019-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-27
  • 1970-01-01
  • 2017-12-24
  • 2020-02-12
相关资源
最近更新 更多