说明:基于filebeat采集日志
概述:
在Kubernetes环境中,Filebeat不需要和业务服务部署在同一个容器中。通常的做法是将Filebeat作为一个DaemonSet部署在集群中,这样它可以在每个节点上运行一个实例,并从所有容器中收集日志。这种方式不仅简化了日志收集的配置和管理,还提高了系统的扩展性和可靠性。
2. 业务服务部署
你的业务服务可以像往常一样部署为Deployment、StatefulSet或其他适合的Kubernetes资源。Filebeat DaemonSet会自动发现并收集这些服务生成的日志。
3. 原理解析
- 文件挂载:Filebeat通过挂载主机的日志目录(如
/var/log/containers
和/var/lib/docker/containers
)来访问所有容器的日志文件。 - 自动发现:Filebeat的
autodiscover
功能会自动发现集群中的Pod和容器,并根据配置收集日志。 - Kubernetes元数据:
add_kubernetes_metadata
处理器会从Kubernetes API服务器获取Pod的元数据,并将其添加到日志中。这些元数据包括命名空间、Pod名称、容器名称、节点名称等。 - 日志传输:Filebeat将收集到的日志发送到Logstash或Elasticsearch等日志处理系统。
4. 业务服务和Filebeat分离的好处
- 资源隔离:业务服务和日志收集工具分开部署,可以独立管理资源,避免相互影响。
- 简化管理:Filebeat作为DaemonSet统一管理日志收集,简化了配置和运维工作。
- 扩展性:可以方便地对Filebeat进行独立扩展和更新,而不影响业务服务。
- 安全性:通过分离业务服务和日志收集,可以更好地控制权限和安全策略。
实现步骤:
1. Filebeat作为DaemonSet部署
DaemonSet是一种Kubernetes资源,用于确保在集群中的每个节点上运行一个Pod。通过将Filebeat部署为DaemonSet,可以从所有节点上的所有容器中收集日志。
Filebeat DaemonSet配置示例
创建一个Filebeat的DaemonSet,使其在集群中创建的每个节点上运行,从而收集所有节点上的日志。
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: filebeat
namespace: kube-system
spec:
selector:
matchLabels:
app: filebeat
template:
metadata:
labels:
app: filebeat
spec:
containers:
- name: filebeat
image: docker.elastic.co/beats/filebeat:7.10.0
volumeMounts:
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
- name: varlog
mountPath: /var/log
readOnly: true
- name: filebeat-config
mountPath: /usr/share/filebeat/filebeat.yml
subPath: filebeat.yml
volumes:
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
- name: varlog
hostPath:
path: /var/log
- name: filebeat-config
configMap:
name: filebeat-config
确保配置文件已存储在ConfigMap中,并在Deployment中正确挂载。
Filebeat ConfigMap配置示例
创建一个ConfigMap来存储Filebeat的配置文件:
apiVersion: v1
kind: ConfigMap
metadata:
name: filebeat-config
namespace: kube-system
data:
filebeat.yml: |
filebeat.autodiscover:
providers:
- type: kubernetes
hints.enabled: true
templates:
- condition:
equals:
kubernetes.namespace: default
config:
- type: container
paths:
- /var/log/containers/*-${data.kubernetes.container.id}.log
processors:
- add_kubernetes_metadata:
in_cluster: true
processors:
- add_cloud_metadata:
- add_host_metadata:
output.logstash:
hosts: ["logstash:5044"]
在这个配置中:
autodiscover
部分定义了Filebeat如何自动发现和监控Pod。providers
部分指定了Kubernetes作为自动发现的提供者。templates
部分定义了在满足特定条件(如命名空间为default
)时应用的配置。add_kubernetes_metadata
处理器用于将Kubernetes API中获取的元数据添加到日志事件中。这个处理器会为每条日志添加以下信息:- 命名空间(namespace)
- Pod名称(pod_name)
- 容器名称(container_name)
- 节点名称(node_name)
- 其他相关元数据
2. 在Logstash中处理日志
在Logstash中,可以使用不同的过滤器(如 json
、mutate
、grok
)进一步处理日志和元数据。
例如:
input {
beats {
port => 5044
}
}
filter {
json {
source => "message"
remove_field => ["message"]
}
if [kubernetes] {
mutate {
add_field => {
"namespace" => "%{[kubernetes][namespace]}"
"pod_name" => "%{[kubernetes][pod][name]}"
"container_name" => "%{[kubernetes][container][name]}"
"node_name" => "%{[kubernetes][node][name]}"
}
}
}
grok {
match => { "log" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} %{DATA:class} - %{GREEDYDATA:message}" }
}
date {
match => [ "timestamp", "ISO8601" ]
}
mutate {
rename => { "loglevel" => "severity" }
remove_field => [ "timestamp" ]
}
}
output {
elasticsearch {
hosts => ["http://elasticsearch:9200"]
index => "logs-%{+YYYY.MM.dd}"
}
stdout {
codec => rubydebug
}
}
在这个配置中:
json
过滤器解析从Filebeat接收到的JSON格式的日志。mutate
过滤器将Kubernetes元数据字段添加到日志中。grok
过滤器解析日志内容,提取特定字段。date
过滤器解析时间戳,将其转换为Logstash的@timestamp
字段。