在容器化时代,容器应用的日志管理和传统应用存在很大的区别,为了顺应容器化应用,Docker 和 Kubernetes 提供了一套完美的日志解决方案。本文从 Docker 到 Kubernetes 逐步介绍在容器化时代日志的管理机制,以及在 Kubernetes 平台下有哪些最佳的日志收集方案。涉及到的话题有 Docker 日志管理机制、Kubernetes 日志管理机制、Kubernetes 集群日志收集方案。本文结构如下:
-
Docker 日志管理机制
- Docker 的日志种类
- 基于日志驱动(loging driver)的日志管理机制
- Docker 日志驱动(loging driver)配置
- Docker 默认的日志驱动
json-file
-
Kubernetes 日志管理机制
- 应用 Pod 日志
- Kuberntes 集群组件日志
-
Kubernetes 集群日志收集方案
- 节点级日志代理方案
- sidecar 容器方案
- 应用程序直接将日志传输到日志平台
Docker 日志管理机制
Docker 的日志种类
在 Docker 中日志分为两大类:
- Docker 引擎日志;
- 容器日志;
Docker 引擎日志
Docker 引擎日志就是 docker 服务的日志,即 dockerd
守护进程的日志,在支持 Systemd 的系统中可以通过 journal -u docker
查看日志。
容器日志
容器日志指的是每个容器打到 stdout 和 stderr 的日志,而不是容器内部的日志文件。docker 管理所有容器打到 stdout 和 stderr 的日志,其他来源的日志不归 docker 管理。我们通过 docker logs
命令查看容器日志都是读取容器打到 stdout 和 stderr 的日志。
基于日志驱动(loging driver)的日志管理机制
Docker 提供了一套通用、灵活的日志管理机制,Docker 将所有容器打到 stdout 和 stderr 的日志都统一通过日志驱动重定向到某个地方。
Docker 支持的日志驱动有很多,比如 local、json-file、syslog、journald 等等,类似插件一样,不同的日志驱动可以将日志重定向到不同的地方,这体现了 Docker 日志管理的灵活性,以热插拔的方式实现日志不同目的地的输出。
Dokcer 默认的日志日志驱动是 json-file
,该驱动将将来自容器的 stdout 和 stderr 日志都统一以 json
的形式存储到本地磁盘。日志存储路径格式为:/var/lib/docker/containers/<容器 id>/<容器 id>-json.log
。所以可以看出在 json-file
日志驱动下,Docker 将所有容器日志都统一重定向到了 /var/lib/docker/containers/
目录下,这为日志收集提供了很大的便利。
注意:只有日志驱动为:local、json-file 或者 journald 时,
docker logs
命令才能查看到容器打到 stdout/stderr 的日志。
下面为官方支持的日志驱动列表:
驱动 | 描述 |
---|---|
none | 运行的容器没有日志,docker logs 也不返回任何输出。 |