7

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

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

这只是最后一个小时:

Pod 上的内存消耗

4

1 回答 1

2

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

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

以下是与日志轮换相关的文档部分:

在节点级别记录:

容器化应用程序写入 stdout 和 stderr 的所有内容都由容器引擎处理和重定向到某个地方。例如,Docker 容器引擎将这两个流重定向到日志记录驱动程序,该驱动程序在 Kubernetes 中配置为写入 json 格式的文件。

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

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

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

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

例如,您可以在相应的脚本中找到有关 kube-up.sh 如何在 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

}
于 2018-06-06T15:54:59.390 回答