Kubernetes Pod采集

更新时间:
复制为 MD 格式

在原生Kubernetes集群中,通过Sidecar模式部署Elastic Agent,利用其OpenTelemetry兼容模式(EDOT),将应用日志采集至阿里云Elasticsearch实例。该方案以声明式YAML配置为核心,适用于未使用ACK或需要自定义Kubernetes部署的场景。

方案架构

采用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进行管理和挂载。

准备工作

  1. 创建阿里云Elasticsearch实例,并开启自动创建索引功能。

    具体操作请参见创建阿里云Elasticsearch实例配置YML参数

  2. 搭建原生Kubernetes集群。如已有可用集群,可直接使用。

  3. 确保Kubernetes集群与Elasticsearch实例之间的网络连通。如两者不在同一VPC内,需先通过VPC对等连接打通网络。

步骤一:准备OTel Collector镜像

拉取Elastic Agent官方镜像。为确保部署稳定性和可访问性,建议将镜像推送到自有的容器镜像仓库。

docker pull elastic/elastic-agent:9.1.5

elastic/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)

从指定路径实时收集.log文件。start_at: end表示从文件头开始读取,只采集新日志。multiline用于识别多行日志(如Java异常栈),以时间戳格式作为新日志的起始标志。

日志导出(exporters)

将日志传输至阿里云Elasticsearch实例。endpointsES访问地址(可在ES实例的基本信息页面查看)。user为访问ES的用户名。支持TLS加密和自动重试(5s30s间隔递增)。

数据流管道(service)

完整流程:filelog接收日志 -> 添加资源元数据 -> 批量处理 -> 导出到ES。

详细OTel配置请参见OpenTelemetry Receivers

执行以下命令创建ConfigMap:

kubectl apply -f otel-config.yaml

验证ConfigMap是否创建成功:

kubectl get configmap otel-config

步骤三:部署应用与Sidecar容器

在现有DeploymentStatefulSetPod模板中添加日志采集Sidecar容器的定义。以下以Deployment为例,StatefulSet的配置方式相同。

  1. 定义共享卷。

    spec.template.spec.volumes中添加两个存储卷(与containers同级):

    • app-logemptyDir类型,用于业务容器与Sidecar容器之间共享日志文件。

    • otel-config:关联ConfigMap,用于Sidecar容器读取采集配置。

    volumes:
      - emptyDir: {}
        name: app-log
      - configMap:
          name: otel-config
        name: otel-config
  2. 配置业务容器的卷挂载。

    在业务容器的volumeMounts中添加以下挂载项:

    volumeMounts:
      - mountPath: /home/appuser/logs
        name: app-log
    重要

    mountPath必须与业务容器实际的日志输出路径一致,否则Sidecar无法采集日志数据。

  3. 注入日志采集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 AgentOpenTelemetry模式运行。

步骤四:重启服务并验证

  1. 重启Deployment使配置生效。

    kubectl rollout restart deployment/<deployment-name>
  2. 查看Sidecar容器日志,确认采集器是否正常启动。

    kubectl logs <pod-name> -c otel-sidecar
  3. 登录与Elasticsearch实例关联的Kibana控制台,在开发工具中执行以下查询,确认日志数据已成功写入。索引名称通常为logs-filelog-default

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

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