本文详细介绍在阿里云容器服务 Kubernetes 版(ACK)集群中,通过 Filebeat Sidecar 模式实现应用级细粒度日志采集的完整方案。相比传统的节点级 DaemonSet 模式,Sidecar 可为每个业务 Pod 单独配置日志采集策略,提供更灵活的日志管理能力。
方案架构
本方案以采集阿里云容器服务 Kubernetes 版(简称ACK)日志为例,如需接入自建Kubernetes集群并采集日志,请联系技术支持。

实施步骤
1. 环境准备
请确保以下环境和配置已准备就绪:
准备 ACK、 ES、Logstash以及Kafka实例
一个可用的容器服务 ACK 集群。
一个阿里云 ES 实例。建议开启自动创建索引功能,以便服务能自动根据上报数据创建索引。
进入ES实例的基本信息页面,单击,单击修改配置,选择允许自动创建索引。


Kafka实例(可选):在Kafka实例中创建Topic和Group资源。
Logstash实例(可选):如果使用Kafka等消息队列,则需要创建Logstash实例,用于消费Kafka中的数据并写入Elasticsearch。Logstash实例需要满足:
版本:与阿里云ES实例的版本兼容,详情请参见产品兼容性。
网络:与阿里云ES实例在同一VPC下,否则需要配置NAT网关实现与公网的连通,具体步骤请参见配置NAT公网数据传输。
确保网络连通性
确认 ACK 集群、 ES 实例、Logstash实例、Kafka实例之间的网络是连通状态。如果不在同一个专有网络 VPC (Virtual Private Cloud) 内,须先打通网络,推荐使用 VPC对等连接实现网络互通。
准备Filebeat镜像
使用Filebeat官方镜像。为确保与ES实例的版本兼容,请选择版本匹配的Filebeat镜像。例如,ES 8.17版本的实例,使用
docker.elastic.co/beats/filebeat:8.17.10镜像地址。
2. 创建配置项
在ACK集群中创建配置项,用于存储Filebeat配置文件。
登录ACK控制台,单击。

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

以下提供两种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 的配置方式相同。
单击,单击目标Deployment名称,进入详情页。

单击编辑。

单击原有业务容器名称。

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

存储类型:选择临时目录。
名称:自定义数据卷名称,例如
app-log。容器路径:填写业务容器输出日志的路径,例如
/home/appuser/logs。
在编辑页面,单击添加容器添加日志采集 Sidecar 容器。

镜像名称:选择在环境准备环节提前准备好的
docker.elastic.co/beats/filebeat:8.17.10镜像。配置 Sidecar 容器的卷挂载,添加两个挂载项:

挂载共享日志目录:单击增加本地存储,挂载此前(第4步)创建的共享数据卷
app-log,容器路径保持一致。挂载Filebeat配置文件:单击增加本地存储,挂载步骤2中创建的配置项。
类型:选择配置项。
名称:自定义名称,例如
filebeat-config。挂载源:选择步骤2中创建的配置项(
filebeat-config)。容器路径:填写
usr/share/filebeat/filebeat.yml。子路径:填写
filebeat.yml。重要挂载
filebeat.yml文件时,必须使用子路径(subPath)方式。否则,挂载配置项会覆盖镜像中的/usr/share/filebeat/整个目录,导致Filebeat无法正常启动。
确认所有配置无误后,单击更新提交变更。
Kubernetes将自动滚动重启 Pod,新 Pod 会包含业务容器和 Sidecar 容器。
常见问题
ACK集群和Kafka集群不在同一个VPC,如何实现网络互通?
如果ACK集群与其他云服务(如Elasticsearch、Kafka)不在同一个VPC,可以使用VPC对等连接打通网络。具体操作,请参见VPC对等连接。
Pod内的应用容器和Filebeat容器如何共享日志文件?
可通过以下两种方式共享日志文件:
使用临时目录(
emptyDir):如操作步骤中所述,通过挂载临时目录实现文件共享。使用持久化存储卷:将日志文件存储在NAS或OSS等持久化存储上。
如何在不使用Kafka的情况下,实现日志文件的持久化存储?
可以将Pod的日志输出到静态供应的持久化存储卷(例如NAS或OSS),以实现日志文件的长期保存。动态供应的存储卷会为每个Pod创建独立的存储路径,不适用于Sidecar共享场景。
以下以NAS共享存储卷为例介绍操作步骤,OSS操作类似。
在ACK控制台,单击,创建两个存储声明,例如
static-log-write和static-log-read。一个Pod中不能多次引用同一个存储声明,因此需要创建两个指向同一存储卷的存储声明,分别用于日志的写入和读取。


static-log-write存储声明定义如下,static-log-read类似。
修改步骤3中的数据卷挂载配置,将类型从临时目录改为云存储声明。
业务应用容器:挂载
static-log-write。在子路径中输入应用名(例如log-generate),用于在NAS上区分不同应用的日志目录。
Filebeat Sidecar容器:挂载
static-log-read,子路径保持与业务应用容器一致。
更新配置使之生效。
如何解决Deployment多副本Pod向同一NAS路径写入日志时的冲突问题?
通过控制台无法直接实现此配置,需要手动编辑YAML文件。操作方法如下:
在控制台编辑Deployment,为业务容器和Sidecar容器分别添加一个环境变量。变量名称设置为
POD_NAME,变量值通过关联元数据选择metadata.name。
单击页面上方的YAML编辑,找到
volumes挂载定义部分。将subPath: log-generate修改为subPathExpr: 'log-generate/$(POD_NAME)'。单击更新保存修改。
在NAS文件浏览器中验证结果。可以看到,在
log-generate目录下,每个Pod副本都将日志保存到了以各自Pod名称命名的子目录中。















