可靠的云原生日志系统需围绕采集、传输、存储、查询四环节协同设计:用Fluent Bit DaemonSet采集多源日志并自动打标;经NATS JetStream或Kafka解耦传输;按SLA分级存入Elasticsearch/Loki/对象存储;通过LogQL告警、Grafana联动及指标监控实现可观测闭环。
要设计一个可靠的 Linux 云原生日志系统,核心是构建可扩展、高可用、低侵入的集中式日志架构。它不是简单把日志塞进一个 Elasticsearch 里,而是围绕采集、传输、存储、查询四个环节做协同设计,兼顾容器动态性、服务网格透明性与安全合规要求。
在 Kubernetes 环境中,日志源头包括容器 stdout/stderr、宿主机系统日志(journald)、应用文件日志(如 Nginx access.log)以及 Service Mesh(如 Istio)生成的访问追踪日志。推荐统一使用 DaemonSet 方式部署 Fluent Bit(轻量、低资源占用、原生支持 Kubernetes 标签解析),而非 Logstash 或 Filebeat(后者在大规模节点上内存压力明显)。
关键配置要点:
kubernetes 插件自动注入 Pod 元信息(namespace、pod_name、container_name、labels),避免手动打标出错parser 过滤器识别 JSON 结构日志,非 JSON 行自动打上 log_type=plain 标签便于后续分流tail 输入插件监控挂载的 hostPath 日志目录(如 /var/log/containers/ 和 /var/log/pods/),确保滚动日志不丢失buffer 写盘行为(易引发磁盘满),改用内存队列 + 限速 + 失败重试机制Fluent Bit 不直连 Elasticsearch 或 Loki,中间必须引入消息队列作为缓冲和解耦层。推荐使用 Kafka(企业级)或 NATS JetStream(云原生轻量首选)。Kafka 提供分区、副本、精确一次语义;JetStream 更易部署在 K8s 中,支持流式 retention 和基于 subject 的路由。
传输链路建议结构:
logs.app、logs.infra)不要把所有日志都扔进同一个 Elasticsearch 集群——成本高、查询慢、权限难控。应按日志用途和服务等级协议(SLA)分级存储:
earch(建议 8.x)+ OpenSearch Dashboards。需开启 ILM(Index Lifecycle Management)自动滚动索引、冷热分离(hot-warm 架构),并限制单索引大小(如 50GB)防 shard 过大所有存储后端必须启用 TLS 加密通信与 RBAC 控制。例如 Loki 使用 auth_enabled: true + JWT 认证;Elasticsearch 启用内置 security plugin 并绑定 Kubernetes ServiceAccount Token 做身份透传。
日志不能只用来“看”,要融入 SRE 工作流。典型实践:
logql 告警规则(如 count_over_time({job="app"} |= "panic" [5m]) > 3),通过 Alertmanager 推送至钉钉/企微不复杂但容易忽略:所有日志采集组件必须暴露 /metrics 端点,并接入 Prometheus,监控 fluent-bit 的 buffer queue length、kafka producer retry count、nats stream backlog 等,早于业务日志异常发现管道瓶颈。