我们在 Google Cloud Platform Kubernetes 集群中有一个 pod,将 JsonFormatted 写入 StdOut。这是由 Stackdriver 开箱即用的。但是,我们看到 Pod 的磁盘使用量不断增长,我们无法理解如何在 Deployment 上设置最大大小以进行日志轮换。
关于 Google Cloud 和 Kubernetes 的文档对此尚不清楚。
这只是最后一个小时:
我们在 Google Cloud Platform Kubernetes 集群中有一个 pod,将 JsonFormatted 写入 StdOut。这是由 Stackdriver 开箱即用的。但是,我们看到 Pod 的磁盘使用量不断增长,我们无法理解如何在 Deployment 上设置最大大小以进行日志轮换。
关于 Google Cloud 和 Kubernetes 的文档对此尚不清楚。
这只是最后一个小时:
您确定 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
}