以下是一个详细的从在 Kubernetes 集群中部署 Filebeat,到实现按web-oper、web-api微服务分离日志并存储到不同索引的完整方案:
理解需求:按服务分离日志索引
- 在 Kubernetes 集群中,有web-oper和web-api两种微服务,希望通过 Filebeat
将它们的日志分别收集到不同的索引中。 这样在后续查看和分析日志时,可以更方便地根据服务进行区分,例如在 Elasticsearch
中通过不同的索引来查询web-api和web-oper的日志。
准备工作:已成功部署好es与Kibana
- 准备 Filebeat 配置文件
创建一个名为 filebeat.yml 的配置文件,内容如下:
filebeat.inputs:
- type: container
paths:
- /var/log/containers/*.log
processors:
- add_kubernetes_metadata:
host: ${NODE_NAME}
matchers:
- logs_path:
logs_path: "/var/log/containers/"
output.elasticsearch:
hosts: ["elasticsearch-cluster-ip:9200"] # 替换为实际的Elasticsearch集群IP和端口
indices:
- index: "web-api-log-%{+yyyy.MM.dd}"
when:
equals:
kubernetes:
labels:
app: web-api
- index: "web-oper-log-%{+yyyy.MM.dd}"
when:
equals:
kubernetes:
labels:
app: web-oper
上述配置文件作用解析:
● filebeat.inputs 部分指定了从容器日志路径(/var/log/containers/*.log,这是 Kubernetes 默认存放容器日志之处)收集日志,并通过 add_kubernetes_metadata 处理器添加 Kubernetes 相关元数据,便于后续精准筛选。
● output.elasticsearch 部分定义了输出目标为 Elasticsearch 集群,重点是 indices 小节,使用 when 条件语句搭配 equals 判断机制。如果容器的 kubernetes.labels.app 标签值为 web-api,日志将发送至 web-api-log-%{+yyyy.MM.dd} 索引;若标签值是 web-oper,则发送到 web-oper-log-%{+yyyy.MM.dd} 索引。
- 创建 Filebeat 的 DaemonSet 资源定义文件
新建一个名为 filebeat-daemonset.yaml 的 YAML 文件,用于在 Kubernetes 中部署 Filebeat:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: filebeat
namespace: kube-system # 推荐部署到kube-system命名空间,便于统一管理系统级组件
spec:
selector:
matchLabels:
app: filebeat
template:
metadata:
labels:
app: filebeat
spec:
containers:
- name: filebeat
image: docker.elastic.co/beats/filebeat:7.14.0 # 按需选择Filebeat版本镜像
volumeMounts:
- name: varlogcontainers
mountPath: /var/log/containers
- name: varlogpods
mountPath: /var/log/pods
- name: filebeat-config
mountPath: /usr/share/filebeat/filebeat.yml # 挂载filebeat文件
readOnly: true
volumes:
- name: varlogcontainers
hostPath:
path: /var/log/containers
- name: varlogpods
hostPath:
path: /var/log/pods
- name: filebeat-config
configMap:
name: filebeat-config
DaemonSet 控制器确保所有(或一部分)的节点都运行了一个指定的 Pod 副本
- 每当向集群中添加一个节点时,指定的 Pod 副本也将添加到该节点上。
- 当节点从集群中移除时,Pod 也就被垃圾回收了。
- 删除一个 DaemonSet 可以清理所有由其创建的 Pod。
这个 DaemonSet 配置解析如下:
- metadata 定义了 DaemonSet 的名称 filebeat 以及所属命名空间。
- spec 里的 selector 和 template 标签配合,确保每个节点上都运行符合 app: filebeat 标签的 Pod。
- containers 中定义Filebeat 容器,挂载了容器日志目录(/var/log/containers 和
/var/log/pods)用于读取日志,同时挂载了之前创建的 filebeat.yml 配置文件(通过 configMap
方式挂载,下面步骤会创建),设置为只读,防止容器内意外修改配置。 - volumes 部分对应上述 volumeMounts,声明了hostPath 类型的本地日志目录挂载以及 configMap 类型挂载,用于配置文件挂载。
- /var/log/pods目录存储了 Pod 级别的日志,这些日志可能包含了关于 Pod 启动、停止以及内部容器之间交互的一些详细信息。例如,Pod 初始化容器(init container)的日志可能会在这里有记录。初始化容器用于在主容器启动之前执行一些初始化任务,如配置环境、检查依赖等,其日志对于排查 Pod 启动问题非常重要。
-
创建 ConfigMap 用于挂载配置文件
执行以下命令创建包含 filebeat.yml 的 ConfigMap:
kubectl create configMap filebeat-config --from-file=filebeat.yml -n kube-system
此命令会将 filebeat.yml 文件内容封装进名为 filebeat-config 的 ConfigMap 里,供 Filebeat 容器挂载使用。
- 在 Kubernetes 集群中部署 Filebeat
使用以下命令部署 Filebeat:
kubectl apply -f filebeat-daemonset.yaml
这条命令将依据 filebeat-daemonset.yaml 描述在集群中启动 Filebeat。
- 验证部署与日志收集效果
● 查看 Filebeat 容器日志:
通过 kubectl logs -n kube-system (filebeat-pod-name 可通过 kubectl get pods -n kube-system | grep filebeat 查到),检查有无报错信息,排查配置或启动过程中可能出现的问题。
● 在 Elasticsearch 端检查索引:利用 Elasticsearch 的 API 或者 Kibana 工具,查看是否成功创建了 web-api-log-%{+yyyy.MM.dd} 和 web-oper-log-%{+yyyy.MM.dd} 两个索引,索引内是否陆续接收到对应服务的日志。
通过以上步骤,即可在 Kubernetes 集群中成功部署 Filebeat,并实现按 web-oper、web-api 服务分离日志存储到不同索引,方便后续日志分析运维工作。
需留意配置文件中的 Elasticsearch 集群地址、Filebeat 镜像版本等关键信息,依实际情况调整适配。