在原生Kubernetes集群中,通过Sidecar模式部署Elastic Agent,利用其OpenTelemetry兼容模式(EDOT),将应用日志采集至阿里云Elasticsearch实例。该方案以声明式YAML配置为核心,适用于未使用ACK或需要自定义Kubernetes部署的场景。
方案架构
采用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实例,并开启自动创建索引功能。
具体操作请参见创建阿里云Elasticsearch实例和配置YML参数。
搭建原生Kubernetes集群。如已有可用集群,可直接使用。
确保Kubernetes集群与Elasticsearch实例之间的网络连通。如两者不在同一VPC内,需先通过VPC对等连接打通网络。
步骤一:准备OTel Collector镜像
拉取Elastic Agent官方镜像。为确保部署稳定性和可访问性,建议将镜像推送到自有的容器镜像仓库。
docker pull elastic/elastic-agent:9.1.5elastic/elastic-agent:9.x版本与8.17版本的Elasticsearch兼容。
步骤二:创建OTel Collector配置
创建Kubernetes ConfigMap,用于存储OTel Collector的采集配置。
创建otel-config.yaml文件,内容如下:
apiVersion: v1
kind: ConfigMap
metadata:
name: otel-config
namespace: default
data:
otel.yml: |-
receivers:
# 配置文件日志接收器
filelog:
include: [/home/appuser/logs/*.log] # 日志文件路径,需与业务容器日志路径一致
exclude: [ ]
start_at: end # 从文件结尾开始读取,避免重复采集历史日志
multiline:
line_start_pattern: ^2026- # 多行日志起始标志,根据实际日志格式调整
exporters:
# 配置Elasticsearch输出
elasticsearch/logs:
endpoints: ["http://es-cn-xxx.elasticsearch.aliyuncs.com:9200"] # 替换为实际ES集群地址
user: "{your username}"
password: "{your password}"
tls:
insecure_skip_verify: false
retry:
enabled: true
initial_interval: 5s
max_interval: 30s
processors:
# 批量处理优化性能
batch:
send_batch_size: 1000
timeout: 10s
# 添加资源元数据
resourcedetection:
detectors: [system, env]
system:
hostname_sources: [os]
service:
pipelines:
logs:
receivers: [filelog]
processors: [resourcedetection, batch]
exporters: [elasticsearch/logs]配置 | 说明 |
日志采集(receivers) | 从指定路径实时收集 |
日志导出(exporters) | 将日志传输至阿里云Elasticsearch实例。 |
数据流管道(service) | 完整流程: |
详细OTel配置请参见OpenTelemetry Receivers。
执行以下命令创建ConfigMap:
kubectl apply -f otel-config.yaml验证ConfigMap是否创建成功:
kubectl get configmap otel-config步骤三:部署应用与Sidecar容器
在现有Deployment或StatefulSet的Pod模板中添加日志采集Sidecar容器的定义。以下以Deployment为例,StatefulSet的配置方式相同。
定义共享卷。
在
spec.template.spec.volumes中添加两个存储卷(与containers同级):app-log:emptyDir类型,用于业务容器与Sidecar容器之间共享日志文件。otel-config:关联ConfigMap,用于Sidecar容器读取采集配置。
volumes: - emptyDir: {} name: app-log - configMap: name: otel-config name: otel-config配置业务容器的卷挂载。
在业务容器的
volumeMounts中添加以下挂载项:volumeMounts: - mountPath: /home/appuser/logs name: app-log重要mountPath必须与业务容器实际的日志输出路径一致,否则Sidecar无法采集日志数据。注入日志采集Sidecar容器。
在
spec.template.spec.containers中添加Sidecar容器定义:- name: otel-sidecar image: xxx.cn-hangzhou.cr.aliyuncs.com/otel/elastic-agent:9.1.5 # 替换为实际镜像地址 imagePullPolicy: IfNotPresent env: - name: ELASTIC_AGENT_OTEL value: 'true' resources: limits: cpu: '1' memory: 2Gi requests: cpu: '1' memory: 2Gi volumeMounts: - mountPath: /home/appuser/logs # 共享日志目录,与业务容器一致 name: app-log - mountPath: /usr/share/elastic-agent/otel.yml # OTel配置文件挂载路径 name: otel-config subPath: otel.yml环境变量
ELASTIC_AGENT_OTEL设置为true,使Elastic Agent以OpenTelemetry模式运行。
步骤四:重启服务并验证
重启Deployment使配置生效。
kubectl rollout restart deployment/<deployment-name>查看Sidecar容器日志,确认采集器是否正常启动。
kubectl logs <pod-name> -c otel-sidecar登录与Elasticsearch实例关联的Kibana控制台,在开发工具中执行以下查询,确认日志数据已成功写入。索引名称通常为
logs-filelog-default。GET /logs-filelog-default/_search { "query": { "match_all": {} } }查询返回业务应用产生的日志记录,则整个数据管道已成功建立。