深色模式
容器日志 docker/k8s
容器最佳实践是把日志打到 stdout/stderr,由运行时统一收集。理解 Docker 与 Kubernetes 各自的收集机制,才能正确配置采集端。本文讲清原理与实操。
适用环境
bash
# Docker 当前日志驱动
docker info | grep -i 'Logging Driver'
# Kubernetes 节点容器日志位置
sudo ls /var/log/pods/ | head
sudo ls /var/log/containers/ | head1
2
3
4
5
2
3
4
5
操作步骤
1. Docker:查看与配置日志驱动
bash
# 实时看某容器日志(即读取 json-file 驱动落盘)
docker logs -f my-app
# daemon.json 切换为 json-file + 轮转上限
sudo tee /etc/docker/daemon.json <<'EOF'
{
"log-driver": "json-file",
"log-opts": { "max-size": "100m", "max-file": "5" }
}
EOF
sudo systemctl restart docker1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
2. Kubernetes:采集节点日志目录
bash
# kubelet 把容器日志软链到 /var/log/containers,并按 /var/log/pods 组织
ls -l /var/log/containers/ | head
# Fluent Bit/Filebeat 直接 tail 这个目录即可1
2
3
2
3
3. Sidecar 写文件场景
yaml
# 业务写 /var/log/app,sidecar 采集同 volume
volumeMounts:
- name: logs
mountPath: /var/log/app1
2
3
4
2
3
4
验证
bash
# 打印一行看是否进入采集路径
kubectl logs deploy/my-app --tail=3
sudo tail -n 3 /var/log/containers/*my-app*.log1
2
3
2
3
常见坑
WARNING
Kubernetes 默认 json-file 驱动不自动轮转,老 Pod 日志会占满磁盘。务必在 kubelet 或 docker daemon 配置 max-size/max-file。
DANGER
不要把日志写入容器可写层(如 /app/logs 且不挂 volume),容器重建后日志随文件系统一起消失,无法排障。