按时间轮换 Kubernetes 上的 pod 日志

问题描述 投票:0回答:3

我的团队有一个特殊要求,每 X 小时删除所有 pod 日志。这是因为日志包含一些敏感信息 - 我们使用 Fluentbit 读取并处理它们,但问题是之后日志仍然存在。 我找不到任何正常的方法来按时间轮换它们,只有关于按文件大小轮换的 docker 守护进程日志记录驱动程序的建议。 是否可以创建一个 k8s cronjob 来为每个 pod/容器执行“echo ''> /path/to/logfile”之类的操作?如果是的话,怎么办?

如果有任何帮助,我将不胜感激。 谢谢!

kubernetes logrotate
3个回答
8
投票

Kubernetes 不提供内置日志轮换,但许多工具都提供此功能。

根据 Kubernetes 日志架构

节点级日志记录的一个重要考虑因素是实现日志 轮换,以便日志不会消耗所有可用存储空间 节点。 Kubernetes 不负责轮换日志,而是负责 部署工具应该设置一个解决方案来解决这个问题。例如, 在 Kubernetes 集群中,通过 kube-up.sh 脚本部署,有一个 logrotate 工具配置为每小时运行一次。您还可以设置一个 容器运行时自动轮转应用程序的日志。

以下是如何实现日志轮转的一些示例:

您可以使用它们作为指南。


1
投票

从 kubernetes 1.21 开始,您可以将 kubelet 配置为自动轮换日志。这不是按时间而是按大小来完成的,您可以调整大小,以便 Fluentbit 可以选择日志,并在短时间内 kubelet 轮换它们。

如果配置轮换,kubelet 负责轮换容器日志并管理日志目录结构。 kubelet 将此信息发送到容器运行时(使用 CRI),运行时将容器日志写入给定位置。

您可以使用 kubelet 配置文件配置两个 kubelet 配置设置:containerLogMaxSize 和 containerLogMaxFiles。这些设置可让您分别配置每个日志文件的最大大小和每个容器允许的最大文件数。

完整文档这里


0
投票

扩展@Wytrzymały Wiktor 的答案。我创建了一个简单的 FastAPI Web 服务,将信息记录在日志文件中。稍后将使用计划的 K8s 作业轮换该日志文件。该部署已在我本地的 Minikube 集群上进行了测试。

我有一个驻留在 Minikube 集群中的本地持久卷 (PV) 和一个从该本地 PV 请求存储的持久卷声明 (PVC)。就我而言,部署有一个 pod 副本,并从 Minikube 集群中提取 docker 镜像。它将

/var/log/fastapi_app
日志文件夹安装到 PVC。然后,Pod 作为服务公开,监听 8000 端口。

我将从

deployment.yml
清单文件中提取重要部分。有关更多详细信息,请参阅 SzilvasiPeter/fastapi-kubernetes-minikube GitHub 存储库。

首先,我们必须创建一个

ConfigMap
对象来配置日志轮换行为:

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: logrotate-config
data:
  my_logs.conf: |
    /var/log/fastapi_app/*.log {
      rotate 3
      size 100k
      compress
      delaycompress
      dateformat -%Y%m%d_%H%M%S
      missingok
      notifempty
      copytruncate
    }

/var/log/fastapi_app/*.log
路径必须与安装的路径匹配。如果日志文件大小达到 100 KiB,则日志文件会旋转 3 次,然后才会被删除和压缩。
copytruncate
配置很重要,因为当某些程序无法被告知关闭其日志文件时可以使用它,因此可能会永远继续写入(追加)到前一个日志文件。我的经验是,如果省略它,Web 服务在日志轮转后将无法写入当前日志文件。

接下来,

CronJob

安排每分钟进行一次日志轮换。此外,我们不允许并发运行,并且我们还将在失败时重新启动 pod:

--- apiVersion: batch/v1 kind: CronJob metadata: name: app-logrotate spec: # Execute the job at every minute schedule: "* * * * *" concurrencyPolicy: Forbid jobTemplate: spec: template: spec: containers: - name: logrotate image: docker.io/kicm/logrotate volumeMounts: - name: local-storage mountPath: /var/log/fastapi_app - name: logrotate-conf mountPath: /etc/logrotate.d volumes: - name: local-storage persistentVolumeClaim: claimName: local-persistent-volume-claim - name: logrotate-conf configMap: name: logrotate-config restartPolicy: OnFailure
它拉取并使用 

docker.io/kicm/logrotate 图像来轮换日志。 cronjob 挂载了两个路径:日志文件夹和日志轮换配置。 CronJob

 中的日志记录文件夹路径必须与 
Deployment
 工作负载中的相同。 
logrotate
 工具将考虑 
/etc/logrotate.d
 路径下的配置文件。通过在此安装路径下添加 
my_logs.conf
,我们可以激活日志文件上的日志轮转。

请注意,您可以在

https://crontab.guru/ 站点的帮助下更改 cronjob 计划。您还可以访问logrotate文档来微调配置文件。

参考资料:

  • https://kubernetes.io/docs/concepts/configuration/configmap/
  • https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/
© www.soinside.com 2019 - 2024. All rights reserved.