使用Filebeat Sidecar采集ACK集群日志至阿里云ES

更新时间:
复制为 MD 格式

本文详细介绍在阿里云容器服务 Kubernetes 版(ACK)集群中,通过 Filebeat Sidecar 模式实现应用级细粒度日志采集的完整方案。相比传统的节点级 DaemonSet 模式,Sidecar 可为每个业务 Pod 单独配置日志采集策略,提供更灵活的日志管理能力。

方案架构

本方案以采集阿里云容器服务 Kubernetes 版(简称ACK)日志为例,如需接入自建Kubernetes集群并采集日志,请联系技术支持。

image.png

实施步骤

1. 环境准备

请确保以下环境和配置已准备就绪:

  1. 准备 ACK、 ES、Logstash以及Kafka实例

    • 一个可用的容器服务 ACK 集群。

    • 一个阿里云 ES 实例。建议开启自动创建索引功能,以便服务能自动根据上报数据创建索引。

      进入ES实例的基本信息页面,单击 配置与管理 > ES集群配置,单击修改配置,选择允许自动创建索引

      image

      image

    • Kafka实例(可选):在Kafka实例中创建TopicGroup资源

    • Logstash实例(可选):如果使用Kafka等消息队列,则需要创建Logstash实例,用于消费Kafka中的数据并写入Elasticsearch。Logstash实例需要满足:

      • 版本:与阿里云ES实例的版本兼容,详情请参见产品兼容性

      • 网络:与阿里云ES实例在同一VPC下,否则需要配置NAT网关实现与公网的连通,具体步骤请参见配置NAT公网数据传输

  2. 确保网络连通性

    • 确认 ACK 集群、 ES 实例、Logstash实例、Kafka实例之间的网络是连通状态。如果不在同一个专有网络 VPC (Virtual Private Cloud) 内,须先打通网络,推荐使用 VPC对等连接实现网络互通

  3. 准备Filebeat镜像

    使用Filebeat官方镜像。为确保与ES实例的版本兼容,请选择版本匹配的Filebeat镜像。例如,ES 8.17版本的实例,使用docker.elastic.co/beats/filebeat:8.17.10镜像地址。

2. 创建配置项

ACK集群中创建配置项,用于存储Filebeat配置文件。

  1. 登录ACK控制台,单击配置管理 > 配置项

    image

  2. 创建一个名为filebeat-config的配置项,key名称为filebeat.yml,值为您的Filebeat配置文件内容。

    image

    以下提供两种filebeat.yml配置示例:直接写入ES和写入Kafka。更多配置详情,请参见Filebeat官方文档

    • 示例一:直接写入ES

      filebeat.inputs:
        - type: filestream
          id: my-filestream-id
          paths:
            - /home/appuser/logs/*.log
      
      output.elasticsearch:
            hosts: ["xxx:9200"]
            index: "filebeat-logs"
            username: "elastic"
            password: "xxx"
    • 示例二:写入Kafka

      filebeat.inputs:
        - type: filestream
          id: my-filestream-id
          paths:
            - /home/appuser/logs/*.log
      
      output.kafka:
        hosts: ["xxx:9092"]
        topic: 'kafka-logstash-es'
        partition.round_robin:
          reachable_only: false
        required_acks: 1
        compression: gzip
        max_message_bytes: 1000000

3. 部署应用与 Sidecar 容器

在现有Deployment 或 StatefulSet 的 Pod 模板中添加日志采集 Sidecar 容器的定义,可使需要日志采集的业务 Pod 在创建时自动包含该 Sidecar 容器。以下以 Deployment 为例说明,StatefulSet 的配置方式相同。

  1. 单击工作负载 > 无状态,单击目标Deployment名称,进入详情页。

    image

  2. 单击编辑

    image

  3. 单击原有业务容器名称。

    image

  4. 数据卷区域,单击增加本地存储,添加一个数据卷,用于将应用打印的日志文件引入到Sidecar容器能访问的数据卷中。

    image

    • 存储类型:选择临时目录。

    • 名称:自定义数据卷名称,例如app-log

    • 容器路径:填写业务容器输出日志的路径,例如/home/appuser/logs

  5. 编辑页面,单击添加容器添加日志采集 Sidecar 容器。

    image

    镜像名称:选择在环境准备环节提前准备好的docker.elastic.co/beats/filebeat:8.17.10镜像。

  6. 配置 Sidecar 容器的卷挂载,添加两个挂载项:

    image

    • 挂载共享日志目录:单击增加本地存储,挂载此前(第4步)创建的共享数据卷app-log,容器路径保持一致。

    • 挂载Filebeat配置文件:单击增加本地存储,挂载步骤2中创建的配置项。

      • 类型:选择配置项。

      • 名称:自定义名称,例如filebeat-config

      • 挂载源:选择步骤2中创建的配置项(filebeat-config)。

      • 容器路径:填写usr/share/filebeat/filebeat.yml

      • 子路径:填写filebeat.yml

        重要

        挂载filebeat.yml文件时,必须使用子路径(subPath)方式。否则,挂载配置项会覆盖镜像中的/usr/share/filebeat/整个目录,导致Filebeat无法正常启动。

  7. 确认所有配置无误后,单击更新提交变更。

    Kubernetes将自动滚动重启 Pod,新 Pod 会包含业务容器和 Sidecar 容器。

常见问题

  1. ACK集群和Kafka集群不在同一个VPC,如何实现网络互通?

    如果ACK集群与其他云服务(如Elasticsearch、Kafka)不在同一个VPC,可以使用VPC对等连接打通网络。具体操作,请参见VPC对等连接

  2. Pod内的应用容器和Filebeat容器如何共享日志文件?

    可通过以下两种方式共享日志文件:

    • 使用临时目录(emptyDir):如操作步骤中所述,通过挂载临时目录实现文件共享。

    • 使用持久化存储卷:将日志文件存储在NASOSS等持久化存储上。

  3. 如何在不使用Kafka的情况下,实现日志文件的持久化存储?

    可以将Pod的日志输出到静态供应的持久化存储卷(例如NASOSS),以实现日志文件的长期保存。动态供应的存储卷会为每个Pod创建独立的存储路径,不适用于Sidecar共享场景。

    以下以NAS共享存储卷为例介绍操作步骤,OSS操作类似。

    1. ACK控制台,单击存储 > 存储声明,创建两个存储声明,例如static-log-writestatic-log-read

      一个Pod中不能多次引用同一个存储声明,因此需要创建两个指向同一存储卷的存储声明,分别用于日志的写入和读取。

      image

      image

      static-log-write存储声明定义如下,static-log-read类似。

      image.png

    2. 修改步骤3中的数据卷挂载配置,将类型从临时目录改为云存储声明。

      • 业务应用容器:挂载static-log-write。在子路径中输入应用名(例如log-generate),用于在NAS上区分不同应用的日志目录。

        image.png

      • Filebeat Sidecar容器:挂载static-log-read,子路径保持与业务应用容器一致。

        image.png

    3. 更新配置使之生效。

  4. 如何解决Deployment多副本Pod向同一NAS路径写入日志时的冲突问题?

    通过控制台无法直接实现此配置,需要手动编辑YAML文件。操作方法如下:

    1. 在控制台编辑Deployment,为业务容器和Sidecar容器分别添加一个环境变量。变量名称设置为POD_NAME,变量值通过关联元数据选择metadata.name

      image.png

    2. 单击页面上方的YAML编辑,找到volumes挂载定义部分。将subPath: log-generate修改为subPathExpr: 'log-generate/$(POD_NAME)'。单击更新保存修改。

      image

    3. NAS文件浏览器中验证结果。可以看到,在log-generate目录下,每个Pod副本都将日志保存到了以各自Pod名称命名的子目录中。

      image.png

      image.png