阿里云ACK(k8s)采集

更新时间:
复制为 MD 格式

本文介绍如何在容器服务 Kubernetes 版(Container Service for Kubernetes,简称容器服务 ACK)中通过 Sidecar 模式部署 Elastic Agent,并利用其 OpenTelemetry 兼容模式(EDOT),将应用日志采集并直接采集至阿里云 Elasticsearch(ES) 实例。该方案以声明式 YAML 配置为核心,适用于以代码和自动化为中心的开发与运维流程。

业务场景说明

在微服务架构中,应用日志分散在各个容器内,需要一个高效、可靠的机制将这些日志聚合到统一的存储和分析平台。本方案旨在解决以下业务问题:

  • 容器日志集中化:从运行在 ACK 集群中的应用容器内采集日志文件。

  • 实时分析与检索:将采集到的日志实时采集至阿里云 Elasticsearch,以便进行索引、搜索和可视化分析。

  • 资源隔离:采用 Sidecar 模式部署日志采集器,确保采集任务与应用进程在同一 Pod 生命周期内,但资源相互隔离,避免对业务容器产生干扰。

通过本方案,可以构建一个从容器日志产生到集中存储分析的完整、自动化的数据管道。

方案架构

本方案采用 Sidecar 部署架构,其核心工作流程如下:

  1. 日志共享:业务应用容器将其产生的日志文件写入到一个与 Sidecar 容器共享的 Kubernetes Volume(通常为 emptyDir)中。

  2. 日志采集:与业务容器在同一个 Pod 内运行的 Elastic Agent Sidecar 容器,通过挂载共享 Volume 来读取日志文件。

  3. 模式切换:Elastic Agent 通过设置环境变量 ELASTIC_AGENT_OTEL=true,切换到 OpenTelemetry 兼容模式(EDOT),此时其行为和配置方式遵循 OpenTelemetry Collector 规范。

  4. 数据采集:Elastic Agent 根据 OpenTelemetry 配置文件,将采集到的日志数据通过网络直接采集到指定的阿里云 Elasticsearch 实例。

  5. 配置管理:Elastic Agent 的采集配置(otel.yml)通过 Kubernetes ConfigMap 进行管理和挂载,而敏感凭证(如 Elasticsearch 的密码)则通过 Kubernetes Secret 安全地注入到 Sidecar 容器的环境变量中。

image

实施步骤

1. 环境准备

在开始部署前,请确保以下环境和配置已准备就绪。

  1. 准备 ACK 与 ES 实例

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

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

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

  2. 确保网络连通性

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

  3. 准备容器镜像

    本方案使用 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 集群。

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

  2. 创建一个名为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 文件的日志(例如应用日志)。







      =======

      数据源:
      从 /path/to/logs/*.log 路径下实时收集所有 .log 文件的日志(例如应用日志)。



      >>>>>>> 6a1d791 (docs: update 246 file(s) from ICMS)
    • 关键配置:

      • 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)







    =======

    完整流程:filelog 接收日志 → 添加资源/环境元数据 → 批量处理 → 导出到 ES。
    (即:日志采集 → 标准化处理 → 安全传输 → 存储到 ES)



    >>>>>>> 6a1d791 (docs: update 246 file(s) from ICMS)

3. 部署应用与 Sidecar 容器

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

  1. Deployment列表中,单击目标 Deployment 名称,进入详情页。

  2. 单击编辑

  3. <<<<<<< HEAD

    编辑页面,找到数据卷区域,单击增加本地存储为业务容器添加共享日志卷。

    =======

    编辑页面,找到数据卷区域,单击增加本地存储为业务容器添加共享日志卷。

    >>>>>>> 6a1d791 (docs: update 246 file(s) from ICMS)
    重要

    此处的数据卷作为业务容器与 Sidecar 的共享存储,确保日志文件可被 Sidecar 读取,容器路径必须与业务容器实际日志路径严格一致,否则 Sidecar 无法采集数据。

  4. <<<<<<< HEAD

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

    =======

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

    >>>>>>> 6a1d791 (docs: update 246 file(s) from ICMS)
    • 镜像名称:选择在环境准备环节提前准备好的elastic/elastic-agent:9.1.5镜像。

    • 环境变量:添加 ELASTIC_AGENT_OTEL,值为 true启用 OpenTelemetry 采集模式。

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

    • 挂载 1:共享日志卷

      • 卷名称:选择 app-log(与业务容器共享的卷)。

      • 容器路径:/path/to/logs(与业务容器挂载路径完全一致)。

    • 挂载 2:OTel 配置文件

      • 卷类型:选择 ConfigMap

      • 卷名称:otel-config(需提前创建的 ConfigMap 名称)。

      • 挂载路径:/usr/share/elastic-agent/otel.yml(必须严格匹配官方镜像路径)。

      • 子路径:otel.yml(关键:仅挂载单个文件,避免覆盖目录)。

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

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

4. 验证日志采集

  1. 检查容器日志

    获取 Pod 名称,并查看容器的日志,确认其是否正常启动并开始处理数据。

    如果看到上述日志,表明容器已成功启动。

  2. 在 ES 中验证数据

    登录与 ES 实例关联的 Kibana 控制台,在开发工具中执行查询,确认日志数据是否已成功写入。索引名称通常会根据 filelog 接收器自动生成,格式可能为 logs-filelog-default

    GET /logs-filelog-default/_search
    {
      "query": {
        "match_all": {}
      }
    }

    如果查询返回了业务应用产生的日志记录,则证明整个数据管道已成功建立。