平台
依赖
linux
docker
docker-compose 或者 docker compose
镜像
docker.elastic.co/beats/filebeat:8.12.2
docker.elastic.co/beats/kibana:8.12.2
docker.elastic.co/beats/elasticsearch:8.12.2
正文
背景
对于有自建机房的公司来说,如果公司的运维技术能力不是很强,那么通过docker部署内部服务自然成了首选(其实K8S搭建的服务依然会遇到这个问题,部署方式于此基本相同,主要是filebeat的元数据处理器从add_docker_metadata
修改为add_kubernetes_metadata
)。
同时,很多服务需要保证一定的可用性,也就需要多实例加滚动更新,在这种情况下自然需要在不同机器上部署实例。
当生产服务出现问题时,想查看日志就必须要登录对应的服务器去挨个查看,运气不好要看完所有实例才能找到,十分痛苦。
所以希望有个统一的日志平台收集分散在各个服务器上的日志,做集中查询,自然地ELK三剑客(众所周知,3剑客有4个,还有filebeat)就成了我们的首选。
技术原理
通过docker启动的服务,其日志会保存在 /var/lib/docker/containers
目录下,并以容器ID生成子目录,保存容器的配置、日志等
查看完整的容器ID
平时通过docker logs -f {容器ID}
读取的就是保存在上述目录下的日志文件,因为docker以json格式保存日志,所以日志文件为 容器ID-json.log
至此,我们有了 服务 -> 容器实例 -> 服务日志 这样的映射关系。
但是依然不太方便,需要额外自主处理服务到容器实例日志的映射。
对于这样常用场景,filebeat官方为我们提供的docker元数据处理器处理
filebeat的docker元数据处理器
我们只需要添加docker.sock
这个与docker通信的套接字,filebeat就能从中获取docker启用的服务列表等元数据。
/var/run/docker.sock
When running Filebeat in a container, you need to provide access to Docker’s unix socket in order for the add_docker_metadata processor to work. You can do this by mounting the socket inside the container. For example:
之后,再借助filebeat提供的自定义处理功能,提取服务名,再把对应日志上传到各自服务名的日志即可。
至于是否需要logstash,至少以我们当前的需求来说不需要logstash在进行额外处理,已经基本满足。
由于篇幅有限,这里就不再复述如何部署es和kibana了。
部署filebeat
- 编写filebeat的部署文件
docker-compose.yml
version: "3"
services:
filebeat:
image: 'docker.elastic.co/beats/filebeat:8.12.2'
container_name: filebeat
restart: always
user: "root"
volumes:
# docker容器日志
- /var/lib/docke