容器日志为什么容易丢
容器与 Pod 是短生命周期对象:容器重建、Pod 调度到别的节点,本地日志文件随之消失。因此容器日志必须集中采集,不能依赖节点上的本地文件做留存。除应用日志外,Kubernetes 集群还应开启 API 审计日志,记录对集群的关键操作,否则谁改过 RBAC、谁看过 Secret 这类问题无法回答。
基本信息
| 适用平台 | Docker 与 Kubernetes 集群(Linux 节点) |
|---|---|
| 采集方式 | 每个节点部署 DaemonSet(Fluent Bit / Vector / Filebeat) |
| 驱动限制 | Docker json-file 配置 max-size 与 max-file 防止写满磁盘 |
| K8s 审计 | kube-apiserver 审计策略文件与审计日志参数 |
| 托管集群 | 云厂商托管集群的审计日志通常需在控制台另行开启 |
典型使用场景
- 故障排查:容器重建后仍能按时间还原现场
- 集群合规:审计对 Secret、RBAC 与工作负载的访问
- 入侵溯源:结合节点日志定位异常容器启动与命令执行
- 容量控制:限制单容器日志体积,避免节点磁盘耗尽
- 多集群汇聚:统一到集中平台做关联检索
节点与采集配置
节点与采集配置
# Docker 驱动限制单文件大小与数量,防止写满磁盘
# /etc/docker/daemon.json
{"log-driver": "json-file", "log-opts": {"max-size": "100m", "max-file": "5"}}
# K8s 使用 DaemonSet 采集(Fluent Bit / Vector)到集中平台
kubectl -n logging get ds # 确认每个节点都有采集实例
kubectl -n logging logs ds/fluent-bit --tail=50 # 查看采集器自身日志API 审计(kube-apiserver 参数示例)
API 审计(kube-apiserver 参数示例)
--audit-policy-file=/etc/kubernetes/audit-policy.yaml
--audit-log-path=/var/log/kubernetes/audit.log
--audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100
# 策略级别:None < Metadata < Request < RequestResponse
# 建议:secrets、configmaps 等敏感资源只记 Metadata审计级别与代价
| 级别 | 记录内容 | 代价 |
|---|---|---|
| None | 不记录该请求 | 无 |
| Metadata | 记录元数据,不含请求与响应体 | 低,敏感资源常用 |
| Request | 记录请求体 | 中,注意敏感字段 |
| RequestResponse | 记录请求与响应体 | 高,日志量大且可能含敏感内容 |
采集方案取舍
- DaemonSet 采集:每节点一个采集实例,适合通用日志与主机日志
- Sidecar 采集:把采集容器与业务容器同 Pod 部署,适合多租户或日志格式特殊的场景
- 节点日志目录挂载:直接读 /var/log/containers 下的软链接,实现简单
- 托管集群方案:云厂商提供的日志服务,需确认字段口径与留存周期
- 共同前提:先统一时间与时区,再做跨源关联
审计级别配置过高会产生大量日志并写入敏感内容;按资源与动词精细配置,例如让 secrets 只记录 Metadata 级别。