本文介绍如何在容器服务 Kubernetes 版(Container Service for Kubernetes,简称容器服务 ACK)中通过 Sidecar 模式部署 Elastic Agent,并利用其 OpenTelemetry 兼容模式(EDOT),将应用日志采集并直接采集至阿里云 Elasticsearch(ES) 实例。该方案以声明式 YAML 配置为核心,适用于以代码和自动化为中心的开发与运维流程。
业务场景说明
在微服务架构中,应用日志分散在各个容器内,需要一个高效、可靠的机制将这些日志聚合到统一的存储和分析平台。本方案旨在解决以下业务问题:
-
容器日志集中化:从运行在 ACK 集群中的应用容器内采集日志文件。
-
实时分析与检索:将采集到的日志实时采集至阿里云 Elasticsearch,以便进行索引、搜索和可视化分析。
-
资源隔离:采用 Sidecar 模式部署日志采集器,确保采集任务与应用进程在同一 Pod 生命周期内,但资源相互隔离,避免对业务容器产生干扰。
通过本方案,可以构建一个从容器日志产生到集中存储分析的完整、自动化的数据管道。
方案架构
本方案采用 Sidecar 部署架构,其核心工作流程如下:
-
日志共享:业务应用容器将其产生的日志文件写入到一个与 Sidecar 容器共享的 Kubernetes Volume(通常为
emptyDir)中。 -
日志采集:与业务容器在同一个 Pod 内运行的 Elastic Agent Sidecar 容器,通过挂载共享 Volume 来读取日志文件。
-
模式切换:Elastic Agent 通过设置环境变量
ELASTIC_AGENT_OTEL=true,切换到 OpenTelemetry 兼容模式(EDOT),此时其行为和配置方式遵循 OpenTelemetry Collector 规范。 -
数据采集:Elastic Agent 根据 OpenTelemetry 配置文件,将采集到的日志数据通过网络直接采集到指定的阿里云 Elasticsearch 实例。
-
配置管理:Elastic Agent 的采集配置(
otel.yml)通过 Kubernetes ConfigMap 进行管理和挂载,而敏感凭证(如 Elasticsearch 的密码)则通过 Kubernetes Secret 安全地注入到 Sidecar 容器的环境变量中。

实施步骤
1. 环境准备
在开始部署前,请确保以下环境和配置已准备就绪。
-
准备 ACK 与 ES 实例
-
一个可用的容器服务 ACK 集群。
-
一个阿里云 ES 实例。建议开启自动创建索引功能,以便服务能自动根据上报数据创建索引。
进入ES实例的基本信息页面,单击,单击修改配置,选择允许自动创建索引。
-
-
确保网络连通性
-
确认 ACK 集群与 ES 实例之间的网络是连通的。如果两者不在同一个专有网络 VPC (Virtual Private Cloud) 内,必须先打通网络。推荐使用 VPC对等连接实现网络互通。
-
-
准备容器镜像
本方案使用 Elastic Agent 的官方镜像。为确保部署的稳定性和可访问性,建议将所需镜像预先拉取并推送到您自己的阿里云容器镜像服务 ACR (Alibaba Cloud Container Registry) 仓库中。
# 拉取官方镜像 docker pull elastic/elastic-agent:9.1.5方案经过测试,
elastic/elastic-agent:9.x版本与8.17版本的 ES 兼容。
2. 在ACK中配置OTel Collector
该配置文件是一个 Kubernetes ConfigMap(名为 otel-config),核心作用是配置OpenTelemetry Collector(OTel Collector),用于自动化采集、处理和导出日志数据到阿里云 ES 集群。
-
登录ACK控制台,单击。
-
创建一个名为otel-config的配置项,名称为otel.yml,值为您的otel配置文件内容。
otel.yml示例值,请根据实际配置进行修改,详细otel配置请参见openTelemetryReceivers。
receivers: # 配置文件日志接收器 filelog: include: [/path/to/logs/*.log] # 日志文件路径 exclude: [] # 排除文件列表 start_at: end # 从文件结尾读取 multiline: line_start_pattern: ^2025- exporters: # 配置 Elasticsearch 输出 elasticsearch/logs: endpoints: ["http://es-cn-xxxxxxpxi00xxxxxx.elasticsearch.aliyuncs.com:9200"] # ES 集群地址 user: "elastic" password: "your_password" tls: insecure_skip_verify: false retry: enabled: true initial_interval: 5s max_interval: 30s service: pipelines: logs: receivers: [filelog] exporters: [elasticsearch/logs]配置
说明
日志采集(receivers)
- <<<<<<< HEAD
数据源:
=======
从/path/to/logs/*.log路径下实时收集所有.log文件的日志(例如应用日志)。数据源:
>>>>>>> 6a1d791 (docs: update 246 file(s) from ICMS)
从/path/to/logs/*.log路径下实时收集所有.log文件的日志(例如应用日志)。 -
关键配置:
-
start_at: end:从文件末尾开始读取,避免重复采集历史日志,只追加新日志。 -
multiline:识别多行日志(例如 Java 异常栈),以^2025-(时间戳格式)作为新日志的起始标志,确保完整日志条目被正确解析。
-
日志导出(exporters)
-
目标系统:将处理后的日志安全传输至阿里云 ES 实例
-
exporters.elasticsearch/logs.endpoints:ES的访问地址,通过ES实例的基本信息页面查看访问地址、端口号。 -
exporters.elasticsearch/logs.user:访问ES时的用户名。
-
-
安全与可靠性:
-
TLS 加密:是否启用证书验证。
-
自动重试:失败时按
5s → 30s间隔重试,避免数据丢失。
-
数据流管道(service)
<<<<<<< HEAD 完整流程:
=======filelog接收日志 → 添加资源/环境元数据 → 批量处理 → 导出到 ES。
(即:日志采集 → 标准化处理 → 安全传输 → 存储到 ES)完整流程:
>>>>>>> 6a1d791 (docs: update 246 file(s) from ICMS)filelog接收日志 → 添加资源/环境元数据 → 批量处理 → 导出到 ES。
(即:日志采集 → 标准化处理 → 安全传输 → 存储到 ES) - <<<<<<< HEAD
3. 部署应用与 Sidecar 容器
在现有Deployment 或 StatefulSet 的 Pod 模板中添加日志采集 Sidecar 容器的定义,可使需要日志采集的业务 Pod 在创建时自动包含该 Sidecar 容器。以下以 Deployment 为例说明,StatefulSet 的配置方式相同。
-
在Deployment列表中,单击目标 Deployment 名称,进入详情页。
-
单击编辑。
- <<<<<<< HEAD
在编辑页面,找到数据卷区域,单击增加本地存储为业务容器添加共享日志卷。
=======在编辑页面,找到数据卷区域,单击增加本地存储为业务容器添加共享日志卷。
>>>>>>> 6a1d791 (docs: update 246 file(s) from ICMS)重要此处的数据卷作为业务容器与 Sidecar 的共享存储,确保日志文件可被 Sidecar 读取,容器路径必须与业务容器实际日志路径严格一致,否则 Sidecar 无法采集数据。
- <<<<<<< HEAD
在编辑页面,单击添加容器添加日志采集 Sidecar 容器。
=======在编辑页面,单击添加容器添加日志采集 Sidecar 容器。
>>>>>>> 6a1d791 (docs: update 246 file(s) from ICMS)-
镜像名称:选择在环境准备环节提前准备好的elastic/elastic-agent:9.1.5镜像。
-
环境变量:添加
ELASTIC_AGENT_OTEL,值为true启用 OpenTelemetry 采集模式。
-
-
配置 Sidecar 容器的卷挂载,添加两个挂载项:
-
挂载 1:共享日志卷
-
卷名称:选择
app-log(与业务容器共享的卷)。 -
容器路径:
/path/to/logs(与业务容器挂载路径完全一致)。
-
-
挂载 2:OTel 配置文件
-
卷类型:选择
ConfigMap。 -
卷名称:
otel-config(需提前创建的 ConfigMap 名称)。 -
挂载路径:
/usr/share/elastic-agent/otel.yml(必须严格匹配官方镜像路径)。 -
子路径:
otel.yml(关键:仅挂载单个文件,避免覆盖目录)。
-
-
-
确认所有配置无误后,单击更新提交变更。
Kubernetes将自动滚动重启 Pod,新 Pod 会包含业务容器和 Sidecar 容器。
4. 验证日志采集
-
检查容器日志
获取 Pod 名称,并查看容器的日志,确认其是否正常启动并开始处理数据。
如果看到上述日志,表明容器已成功启动。
-
在 ES 中验证数据
登录与 ES 实例关联的 Kibana 控制台,在开发工具中执行查询,确认日志数据是否已成功写入。索引名称通常会根据
filelog接收器自动生成,格式可能为logs-filelog-default。GET /logs-filelog-default/_search { "query": { "match_all": {} } }如果查询返回了业务应用产生的日志记录,则证明整个数据管道已成功建立。