阿里云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)

    • 数据源:
      从 /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)

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

3. 部署应用与 Sidecar 容器

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

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

  2. 单击编辑。

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

    重要

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

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

    • 镜像名称:选择在环境准备环节提前准备好的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": {}
      }
    }

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