1. Docker 与 Kubernetes 容器日志的采集路径与落盘方式(json-file、journald、日志目录挂载)
Docker 与 Kubernetes 容器日志的采集路径与落盘方式有哪些?json-file、journald、日志目录挂载各自的特点与适用场景是什么?
- Docker 的日志驱动:json-file(默认)、journald、syslog、fluentd 等
- K8s 的 /var/log/pods 与 /var/log/containers 落盘结构(CRI 标准)
- 采集方式:节点级采集器(Filebeat/fluentd)+ 目录挂载/直接 journal 读取
Docker 容器日志由日志驱动决定落盘:默认 json-file 驱动把 stdout/stderr 写入宿主 /var/lib/docker/containers//-json.log(每行一条 JSON,含 log/stream/time 字段),json 格式便于结构化解析,但文件可能膨胀需轮转(log-opts max-size/max-file);journald 驱动把日志写入宿主 journal(可用 journalctl 查询、按容器过滤);syslog/fluentd/awslogs 等驱动直接转发。K8s 采用 CRI 标准:kubelet 把容器 stdout/stderr 落盘到 /var/log/pods/ / // 下的日志文件(containerd 为 .log,CRI 时间戳行格式),/var/log/containers/ .log 是符号链接,节点日志采集器(DaemonSet:Filebeat/Fluent Bit/Vector)以"目录挂载 + 文件 tail"方式采集,这是最主流的路径。
采集实践:节点级 DaemonSet 采集器挂载 /var/log/pods 与 /var/log/containers(只读),按 Pod 元数据打标签(namespace/pod/container)后转发到日志平台;应用日志(文件而非 stdout)用 emptyDir 挂载 + 采集器同 Pod sidecar 或共享目录方式;journald 驱动场景由采集器读 journal(imjournal/journald 模块)并去重。选型要点:json-file 简单但双写放大(应用写 + 驱动写)、容器重建日志仍在宿主可追;日志驱动变更影响采集路径,生产环境统一约定(默认 json-file/CRI 文件 + 节点采集器,特殊场景用 fluentd 驱动直发);注意轮转与采集速度匹配(采集慢于轮转会丢日志)、文件权限(kubelet 目录权限)与多行日志处理。
本题考察容器日志链路的第一公里。回答要点:Docker 各日志驱动的落盘差异、K8s 的 /var/log/pods 标准结构与节点级采集模式、以及选型与轮转/权限/多行的工程细节,体现对容器日志生命周期的完整认知。
# Docker json-file 驱动配置
{"log-driver":"json-file","log-opts":{"max-size":"50m","max-file":"5"}}
# K8s 日志文件
ls /var/log/pods/<ns>_<pod>_<uid>/<container>/
# Filebeat 采集 K8s 日志的挂载(示意)
volumeMounts: [{name: varlogpods, mountPath: /var/log/pods, readOnly: true}]