目录
Please enable Javascript to view the contents

Kubernetes 使用 Sidecar 配置 Filebeat 收集容器日志

 ·  ☕ 1 分钟

重要

K8s 中收集容器日志有两种模式:

模式原理优缺点
DaemonSet每个 Node 部署一个日志采集 Pod,读 /var/log/containers运维简单,但不支持自定义日志路径
Sidecar在业务 Pod 内嵌入日志采集容器,共享 emptyDir Volume灵活,支持自定义路径和格式;额外消耗资源

当业务容器将日志写到自定义路径(非 stdout/stderr)时,只能用 Sidecar 模式。

1.简介

业务容器和 Filebeat Sidecar 共享一个 emptyDir Volume——业务容器写日志到该卷,Filebeat 读取并上报到 Elasticsearch 或 Kafka。

2.说明

2.1 共享 Volume 原理

1
2
3
4
5
6
7
8
9
Pod
├── 业务容器
│   └── 写日志到 /var/logs/app/app.log
├── Filebeat Sidecar
│   └── 读 /var/logs/app/app.log → 上报到 ES/Kafka
└── emptyDir Volume (log-data)
    挂载到两个容器的 /var/logs/app

2.2 Deployment 配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
spec:
  containers:
    - name: filebeat
      image: docker.elastic.co/beats/filebeat:7.10.0
      volumeMounts:
        - name: log-data
          mountPath: /var/logs/app
        - name: filebeat-config
          mountPath: /usr/share/filebeat/filebeat.yml
          subPath: filebeat.yml

    - name: app
      image: my-app:v1.0.0
      volumeMounts:
        - name: log-data
          mountPath: /var/logs/app

  volumes:
    - name: log-data
      emptyDir: {}
    - name: filebeat-config
      configMap:
        name: filebeat-config
关键配置说明
两个容器挂载同一个 emptyDir实现日志共享
emptyDirPod 生命周期内有效,Pod 删除后日志随 Volume 清除
Filebeat 配置通过 ConfigMap 挂载便于更新采集规则

2.3 Filebeat ConfigMap

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
apiVersion: v1
kind: ConfigMap
metadata:
  name: filebeat-config
data:
  filebeat.yml: |
    filebeat.inputs:
      - type: log
        paths:
          - /var/logs/app/*.log
    output.elasticsearch:
      hosts: ["elasticsearch:9200"]    

3.总结

  1. stdout/stderr 日志用 DaemonSet 模式,自定义路径日志用 Sidecar 模式;
  2. Sidecar 模式的核心是 emptyDir Volume 在两个容器间共享;
  3. Filebeat 配置通过 ConfigMap 注入,保持容器镜像不变。

4.参考

分享

Hex
作者
Hex
CloudNative Developer