CentOS部署K8s的日志管理方案
EFK是K8s生态中最成熟的日志解决方案,适用于需要全文检索、复杂分析、可视化的场景。其组件分工明确:
/var/log/containers/*.log)收集日志,进行格式化(如添加K8s元数据:命名空间、Pod名、容器名)后,转发至Elasticsearch;helm repo add elastic https://helm.elastic.co),并配置持久化存储(如NFS、云盘)以保证数据安全。Loki是Grafana Labs推出的轻量级日志聚合系统,专为云原生设计,核心优势是低资源消耗、高扩展性。其组件分工如下:
helm repo add grafana https://grafana.github.io/helm-charts添加仓库,一键安装Loki Stack,并开启持久化存储(如S3、NFS)。Filebeat是Elastic公司推出的轻量级日志收集器,适用于简单日志转发场景(如仅需将日志发送至Elasticsearch)。其特点包括:
filebeat.yml),指定输入路径(如/var/log/containers/*.log)、输出目标(如Elasticsearch地址),并通过DaemonSet部署在每个节点。对于系统级日志(如kubelet、容器运行时、内核日志),可使用journalctl命令查看与管理。常用操作包括:
journalctl -b;journalctl --since "2025-10-20 00:00:00" --until "2025-10-20 23:59:59";journalctl -p err;journalctl -u kubelet.service。通过DaemonSet在每个节点上运行一个日志收集器(如Fluentd、Promtail),收集该节点上所有Pod的日志(从/var/log/containers/*.log读取)。这种方式的优点是覆盖全面(不会遗漏节点上的任何Pod日志),缺点是资源占用较高(每个节点都有一个Agent)。
将与主应用共享Pod的辅助容器(如Fluentd、Filebeat)作为Sidecar,收集主应用的日志。这种方式的优点是日志收集更贴近应用(可直接读取应用日志文件,无需依赖节点日志),缺点是增加了Pod的资源消耗(每个Pod多一个容器)。
建议应用将日志输出到stdout/stderr(而非文件),这样K8s会自动捕获并写入节点的/var/log/containers/目录(格式为<namespace>_<pod-name>_<container-name>_<hash>.log)。同时,建议使用结构化日志(如JSON格式),便于后续解析与分析(如提取日志中的字段:{"level":"error","message":"connection timeout","service":"payment"})。
将日志存储在节点的本地文件系统(如/var/log/k8s-logs/),适用于小规模集群或测试环境。优点是访问速度快,缺点是扩展性差(磁盘空间有限,无法应对大规模日志)。
将日志存储在远程存储系统(如NFS、S3、GCS),适用于生产环境。优点是扩展性强(可根据需求扩容)、可靠性高(数据冗余备份),缺点是增加了网络开销(需将日志传输至远程存储)。例如,Elasticsearch可配置NFS存储路径,Loki可配置S3存储桶。
为控制存储成本,需制定日志归档策略:
logrotate工具自动清理本地日志(如保留7天内的日志,压缩旧日志)。Kibana是EFK方案的核心可视化工具,可实现:
k8s.namespace:"default" AND log.level:"error");Grafana与Loki集成,可实现:
{namespace="default", pod="myapp-pod"} |= "error");使用logrotate工具自动管理日志文件的轮转、压缩与清理,避免日志文件过大占用磁盘空间。示例配置(/etc/logrotate.d/k8s-logs):
/var/log/containers/*.log {
daily # 每天轮转
rotate 7 # 保留7个备份
compress # 压缩旧日志(如.gz格式)
delaycompress # 延迟压缩(避免压缩当天日志)
missingok # 如果日志文件不存在,不报错
notifempty # 如果日志为空,不轮转
copytruncate # 复制日志文件后清空原文件(避免应用中断)
}
该配置会每天轮转/var/log/containers/目录下的日志文件,保留最近7天的压缩日志。