Ubuntu上Kubernetes日志管理实操指南
一 本地查看与定位日志
- 查看运行中 Pod 的日志
- 基本用法:kubectl logs -c -n
- 实时跟踪:kubectl logs -f -c
- 查看最近 N 行:kubectl logs --tail=100
- 查看崩溃前的容器日志(容器反复重启时非常关键)
- 单容器:kubectl logs --previous
- 多容器:kubectl logs --previous -c
- 节点上日志的物理位置与原理
- 容器标准输出会被写入节点的 JSON 日志文件,路径通常为:/var/log/containers/,并由 /var/log/pods/ 下的符号链接指向实际容器日志。
- 使用 --previous 时,kubelet 会读取 /var/log/pods/// 下对应上一次实例的日志文件(如 2393.log、2394.log 等),这些文件是指向实际容器 JSON 日志的符号链接。
二 集中式日志方案与适用场景
- 节点级日志代理(推荐,低侵入)
- 在每个节点以 DaemonSet 部署日志代理(如 Fluentd、Filebeat),挂载 /var/log 与 /var/lib/docker/containers(或 containerd 的日志目录),统一采集并发送到后端(如 Elasticsearch、Loki)。
- 优点:对应用无侵入、运维简单;缺点:依赖应用将日志输出到 stdout/stderr。
- Sidecar 方案(处理文件日志或特殊输出)
- 应用日志写到文件时,可添加 sidecar 容器 tail -f 这些文件并把内容输出到 stdout/stderr,复用节点级代理链路。
- 或直接以 sidecar 运行 logging-agent,让 agent 直接读取应用日志文件并发送到后端(适合无法改造输出的存量应用)。
- 代价:额外的 CPU/内存/磁盘 开销(两份日志或额外进程)。
- 可视化与分析
- EFK(Elasticsearch + Fluentd + Kibana):适合需要全文检索与复杂分析的团队。
- Loki + Grafana:轻量、成本低、与 K8s 标签友好,适合云原生场景。
三 在Ubuntu上快速落地 EFK 或 Loki
- 方案A EFK(Elasticsearch + Fluentd + Kibana)
- 准备后端存储与可视化
- 使用 ECK(Elastic Cloud on Kubernetes) 一键部署 Elasticsearch 与 Kibana(示例命令见下)。
- 部署 Fluentd DaemonSet
- 使用官方或社区提供的 RBAC + DaemonSet 清单,配置输入为 /var/log/containers/*.log,并通过 kubernetes_metadata 插件注入元数据,输出到 Elasticsearch(示例配置见下)。
- 访问 Kibana 创建索引模式与可视化仪表盘。
- 参考命令与配置片段:
- kubectl apply -f https://download.elastic.co/downloads/eck/2.5.1/all-in-one.yaml
- kubectl apply -f https://download.elastic.co/downloads/eck/2.5.1/all-in-one-kibana.yaml
- Fluentd 关键片段(ConfigMap):
- source: tail 读取 /var/log/containers/*.log,pos_file 记录读取位置
- filter: kubernetes_metadata 注入 namespace/pod/container 等元数据
- match: 输出到 elasticsearch,常用参数 logstash_format true、自定义 index 前缀
- buffer: 配置 flush_interval、chunk_limit_size、retry 等以提升可靠性与吞吐
- 方案B Loki(轻量替代)
- 部署 Loki 与 Promtail(或 Fluent Bit)采集 /var/log/containers/,在 Grafana 中添加 Loki 数据源并构建日志面板。
- 适合资源受限或强调“按标签查询”的团队。
四 关键配置与运维要点
- 应用日志规范
- 优先输出到 stdout/stderr;如需结构化日志,使用 JSON 并包含可检索的 time、level、msg、trace_id 等字段。
- 节点与容器运行时日志路径
- 确认容器运行时日志目录(如 /var/log/containers/ 与 /var/lib/docker/containers/ 或 containerd 对应目录)已挂载到日志代理 Pod,并赋予读取权限(如 root 或 1000 组)。
- 日志轮转与保留
- 配置 kubelet 的日志轮转参数(如 –container-log-max-size、–container-log-max-files),避免节点磁盘被占满。
- 在后端(Elasticsearch/Loki)设置 索引生命周期管理(ILM)/保留策略,定期删除旧数据。
- 可靠性与缓冲
- 为 Fluentd/Filebeat 配置 磁盘缓冲(buffer) 与 重试策略,在后端短暂不可用时避免日志丢失。
- 权限与安全
- 使用 RBAC 为日志代理授予 Pods/Logs 只读权限;Elasticsearch 启用 TLS 与 认证,避免明文传输与越权访问。