在Linux服务器上部署容器化应用时,容器产生的日志通常分散在各个节点,且默认存储在本地磁盘,容易出现日志丢失、查询困难的问题。配置高可用的容器日志管理系统,能够统一收集所有容器的日志,同时避免单点故障导致日志服务不可用,提升运维效率。

高可用容器日志管理架构设计
我们采用Filebeat收集容器日志,Elasticsearch集群存储日志,Kibana提供查询界面的架构,通过多节点部署Elasticsearch实现高可用,具体组件作用如下:
- Filebeat:轻量级日志采集器,部署在每个Linux节点,收集容器输出的日志并发送到Elasticsearch
- Elasticsearch集群:由3个及以上节点组成,存储日志数据,通过副本机制保障数据不丢失,避免单点故障
- Kibana:可视化查询工具,连接Elasticsearch集群,提供日志检索、统计、可视化功能
环境准备
准备3台Linux服务器,系统推荐使用Ubuntu 20.04或者CentOS 7,配置如下:
| 节点角色 | IP地址 | 部署组件 |
|---|---|---|
| 节点1 | 192.168.0.1 | Filebeat、Elasticsearch、Kibana |
| 节点2 | 192.168.0.2 | Filebeat、Elasticsearch |
| 节点3 | 192.168.0.3 | Filebeat、Elasticsearch |
所有节点需要先安装Docker和Docker Compose,用于运行容器化应用和日志组件。
部署Elasticsearch高可用集群
在3个节点上都创建Elasticsearch配置文件,首先创建配置目录:
mkdir -p /etc/elasticsearch
节点1的Elasticsearch配置文件/etc/elasticsearch/es.yml内容如下:
cluster.name: container-log-cluster node.name: node-1 network.host: 0.0.0.0 http.port: 9200 discovery.seed_hosts: - 192.168.0.1:9300 - 192.168.0.2:9300 - 192.168.0.3:9300 cluster.initial_master_nodes: - node-1 - node-2 - node-3 path.data: /usr/share/elasticsearch/data path.logs: /usr/share/elasticsearch/logs
节点2的配置文件将node.name修改为node-2,节点3修改为node-3,其余配置保持一致。然后3个节点都执行以下命令启动Elasticsearch:
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -v /etc/elasticsearch/es.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /data/elasticsearch:/usr/share/elasticsearch/data -e "discovery.type=single-node" elasticsearch:7.17.0
启动后访问http://192.168.0.1:9200/_cluster/health?pretty,如果返回status: green说明集群部署成功。
部署Filebeat采集容器日志
Filebeat需要部署在每个运行容器的Linux节点,采集Docker容器的标准输出日志。首先创建Filebeat配置文件/etc/filebeat/filebeat.yml:
filebeat.inputs:
- type: container
paths:
- /var/lib/docker/containers/*/*.log
json.keys_under_root: true
json.add_error_key: true
processors:
- add_docker_metadata:
host: "unix:///var/run/docker.sock"
output.elasticsearch:
hosts: ["192.168.0.1:9200", "192.168.0.2:9200", "192.168.0.3:9200"]
index: "container-log-%{+yyyy.MM.dd}"
setup.ilm.enabled: false
setup.template.name: container-log
setup.template.pattern: container-log-*
然后启动Filebeat容器:
docker run -d --name filebeat -v /etc/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml -v /var/lib/docker/containers:/var/lib/docker/containers:ro -v /var/run/docker.sock:/var/run/docker.sock elastic/filebeat:7.17.0
部署Kibana提供查询界面
在节点1部署Kibana,创建配置文件/etc/kibana/kibana.yml:
server.port: 5601 server.host: "0.0.0.0" elasticsearch.hosts: ["http://192.168.0.1:9200", "http://192.168.0.2:9200", "http://192.168.0.3:9200"] kibana.index: ".kibana"
启动Kibana容器:
docker run -d --name kibana -p 5601:5601 -v /etc/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml kibana:7.17.0
启动完成后访问http://192.168.0.1:5601,在Kibana中创建索引模式匹配container-log-*,即可查询所有容器的日志。
高可用验证
可以停止节点2的Elasticsearch服务,模拟节点故障:
docker stop elasticsearch
此时访问Kibana依然可以正常查询日志,说明Elasticsearch集群的副本机制保障了服务可用,日志不会丢失。当节点2恢复后,集群会自动同步数据,恢复完整状态。
注意事项
- Elasticsearch集群节点数建议为奇数,避免脑裂问题
- 定期备份Elasticsearch的快照数据,防止极端情况下的数据丢失
- 可以根据日志量调整Filebeat的采集频率,避免占用过多系统资源
- 如果容器日志输出到文件,需要修改Filebeat的采集路径为对应的日志文件路径