2025年07月19日/ 浏览 8
在微服务架构中,单个宿主机可能运行着数十个Docker容器。当我们在终端执行docker logs
命令时,看到的只是单个容器的片段信息。实际生产环境中面临着三大挑战:
这正是ELK Stack(Elasticsearch + Logstash + Kibana)的用武之地。最新统计显示,超过68%的Kubernetes用户选择ELK作为日志解决方案。
bash
{
“log-driver”: “json-file”,
“log-opts”: {
“max-size”: “100m”,
“max-file”: “3”
}
}
优点:配置简单,兼容性好
缺点:缺乏日志分类能力,性能损耗较大
yaml
version: ‘3’
services:
app:
image: nginx
labels:
co.elastic.logs/enabled: “true”
filebeat:
image: docker.elastic.co/beats/filebeat:8.5.1
volumes:
– ./filebeat.yml:/usr/share/filebeat/filebeat.yml
– /var/lib/docker/containers:/var/lib/docker/containers:ro
适合传统虚拟机迁移场景,通过监听Docker事件总线实现日志路由。
yaml
filebeat.inputs:
– type: container
paths:
– ‘/var/lib/docker/containers//.log’
processors:
– adddockermetadata: ~
output.logstash:
hosts: [“logstash:5044”]
ruby
filter {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{GREEDYDATA:message}" }
}
date {
match => [ "timestamp", "ISO8601" ]
target => "@timestamp"
}
}
磁盘IO优化:
tmpfs
存储临时容器日志内存控制:
bash
docker run -d --log-opt tag="mail-service" \
--log-opt env=production \
--memory=2g \
nginx
网络带宽节省:
bulk_max_size
参数问题现象:Kibana中看不到最新日志
排查步骤:
1. 检查Filebeat进程状态 ps aux | grep filebeat
2. 验证Logstash管道连通性 telnet logstash 5044
3. 查看Elasticsearch索引模板 GET _template/filebeat-*
典型错误:
Failed to publish events: EOF
解决方案:调整Logstash的pipeline.workers
数量
传输层加密:yaml
output.logstash:
ssl.certificate_authorities: [“/etc/pki/ca.crt”]
基于角色的访问控制:
json
{
"kibana_user": {
"cluster": ["monitor"],
"indices": [
{
"names": ["filebeat-*"],
"privileges": ["read"]
}
]
}
}