采集容器K8s日志可用于故障排查、性能优化、安全审计、资源利用率分析。日志服务支持通过DaemonSet方式和Sidecar方式采集K8s集群的容器日志,本文简要介绍这两种方式的特性。
采集方式介绍
DaemonSet模式
在DaemonSet模式中,Kubernetes集群确保每个节点(Node)只运行一个Logtail容器,用于采集当前节点内所有容器(Containers)的日志。
当新节点加入集群时,Kubernetes集群会自动在新节点上创建Logtail容器;当节点退出集群时,Kubernetes集群会自动销毁当前节点上的Logtail容器。通过DaemonSet的自动扩缩容机制以及标识型机器组,无需您手动管理Logtail实例。
Sidecar模式
在Sidecar模式中,每个容器组(Pod)运行一个Logtail容器,用于采集当前容器组(Pod)所有容器(Containers)的日志。不同Pod的日志采集相互隔离。
为了采集同一Pod中其他容器的日志文件,需要通过共享存储卷的方式来完成,即将同一份存储卷分别挂载到业务容器和Logtail容器。关于Sidecar方式采集容器日志的更多信息,请参见Sidecar日志采集介绍和Sidecar模式示例。存储卷的更多信息,请参见存储基础知识。
采集方式 | 场景 | 优势 | 劣势 |
采集方式 | 场景 | 优势 | 劣势 |
DaemonSet | 一般情况下建议使用DaemonSet | 运维简单、资源占用少、支持采集容器的标准输出和文本文件、配置方式灵活。 | Logtail采集该节点内所有容器的日志,存在一定的性能瓶颈,且各个容器之间的隔离性较弱。 |
Sidecar | 需要每个Pod使用单独Logtail实例采集的情况以及ASK集群只能支持sidecar | 为每个需要采集日志的容器创建一个Sidecar容器,多租户隔离性好。 | 资源消耗较高,配置与维护较复杂, |
容器发现
Logtail容器采集其他容器的日志,必须发现和确定哪些容器正在运行,这个过程称为容器发现。在容器发现阶段,Logtail容器不与Kubernetes集群的kube-apiserver进行通信,而是直接和节点上的容器运行时守护进程(Container Runtime Daemon)进行通信,从而获取当前节点上的所有容器信息,避免容器发现对集群kube-apiserver产生压力。
Logtail支持通过Namespace名称、Pod名称、Pod标签、容器环境变量等条件指定或排除采集相应容器的日志。
容器文件路径映射
在Kubernetes集群中,因为Pod之间资源隔离,Logtail容器无法直接访问其他Pod中的容器的文件。但是,容器内的文件系统都是由宿主机的文件系统挂载形成,通过将宿主机根目录所在的文件系统挂载到Logtail容器,就可以访问宿主机上的任意文件,从而间接采集业务容器文件系统的文件。容器内文件路径与宿主机文件路径之间的关系被称为文件路径映射。
日志文件在当前容器内的路径是/log/app.log
,假设映射后的宿主机路径是/var/lib/docker/containers/<container-id>/log/app.log
。Logtail默认将宿主机根目录所在的文件系统挂载到自身的/logtail_host
目录下,因此Logtail实际采集的文件路径为/logtail_host/var/lib/docker/containers/<container-id>/log/app.log
。
使用限制
容器运行时:Logtail只支持Docker和Containerd两种容器引擎。对于Docker只支持overlay、overlay2这两种存储驱动,其他存储驱动需将日志所在目录通过数据卷挂载为临时目录。
存储卷挂载方式:如果NAS以PVC的方式挂载到数据目录,不支持使用DaemonSet方式部署Logtail,建议使用Sidecar方式或Deployment方式部署Logtail并完成日志采集。具体操作,请参见通过Sidecar方式采集Kubernetes容器文本日志。
日志文件路径:
容器内文件路径暂不支持存在软链接,请按实际路径配置采集目录。
如果业务容器的数据目录通过数据卷(Volume)挂载,则填写的文件路径不能短于挂载点路径。例如
/var/log/service
目录是数据卷挂载的路径,则设置采集目录为/var/log
将无法采集该目录下的日志,因为采集目录比挂载路径短。必须设置采集目录为/var/log/service
或更深的目录。
日志文件采集停止:
docker:当容器被停止时,Logtail会立刻释放容器文件句柄,容器可正常退出。如果在容器停止前,出现因网络延迟、资源占用多等原因导致的采集延时,可能会丢失容器停止前的部分日志。
containerd:当容器被停止时,Logtail会持续持有容器内文件的句柄(即保持对日志文件的打开状态),直至所有日志文件内容发送完毕。因此,当出现网络延迟、资源占用多等原因导致的采集延时时,可能会导致业务容器不能及时销毁。