基于提示注释的自动发现编辑

此功能处于测试阶段,可能会发生变化。设计和代码不如正式的 GA 功能成熟,并且按原样提供,不提供任何保证。测试版功能不属于正式 GA 功能的支持 SLA 的范围。

确保您使用的是 Elastic Agent 8.5+。

提示自动发现仅适用于独立 Elastic Agent。

独立 Elastic Agent 支持基于 提供程序 的提示进行自动发现。提示机制会在 Kubernetes Pod 注释中查找以 co.elastic.hints 为前缀的提示。容器启动后,Elastic Agent 会立即检查其中的提示,并为容器启动正确的配置。提示会告诉 Elastic Agent 如何使用正确的集成来监控容器。以下是受支持提示的完整列表

必需的提示:编辑
co.elastic.hints/package编辑

用于监控的软件包。

可用的可选提示:编辑
co.elastic.hints/host编辑

用于检索指标的主机。如果未定义,则主机将设置为默认主机:<pod-ip>:<container-port>

co.elastic.hints/data_stream编辑

要启用的数据流列表。如果未指定,则使用集成的默认数据流。要查找默认值,请参阅 Elastic 集成文档

如果指定了数据流,则可以为每个数据流定义其他提示。例如,如果为 Redis 模块 指定的数据流为 info,则为 co.elastic.hints/info.period: 5m

apiVersion: v1
kind: Pod
metadata:
  name: redis
  annotations:
    co.elastic.hints/package: redis
    co.elastic.hints/data_streams: info
    co.elastic.hints/info.period: 5m

如果未指定数据流提示,则将在其配置中使用顶级提示。

co.elastic.hints/metrics_path编辑

从中检索指标的路径。

co.elastic.hints/period编辑

指标检索的时间间隔,例如 10 秒。

co.elastic.hints/timeout编辑

指标检索超时,例如 3 秒。

co.elastic.hints/username编辑

用于身份验证的用户名。

co.elastic.hints/password编辑

用于身份验证的密码。建议从 ENV 变量中检索此敏感信息,并避免以明文形式放置密码。

co.elastic.hints/stream编辑

用于日志收集的流,例如 stdout/stderr。

如果指定的软件包不支持日志,则将使用通用容器的日志输入作为回退。请参阅下面的 用于 Kubernetes 日志收集的提示自动发现 示例。

co.elastic.hints/processors编辑

定义要添加到输入配置的处理器。有关受支持处理器的列表,请参阅 定义处理器

如果处理器配置使用列表数据结构,则必须枚举对象字段。例如,以下重命名处理器配置的提示

processors:
  - rename:
      fields:
        - from: "a.g"
          to: "e.d"
      fail_on_error: true

将如下所示

co.elastic.hints/processors.rename.fields.0.from: "a.g"
co.elastic.hints/processors.rename.fields.1.to: "e.d"
co.elastic.hints/processors.rename.fail_on_error: 'true'

如果处理器配置使用映射数据结构,则不需要枚举。例如,等效于以下 add_fields 配置

processors:
  - add_fields:
      target: project
      fields:
        name: myproject

co.elastic.hints/processors.1.add_fields.target: "project"
co.elastic.hints/processors.1.add_fields.fields.name: "myproject"

为了提供处理器定义的顺序,可以提供数字。如果没有,提示构建器将进行任意排序

co.elastic.hints/processors.1.dissect.tokenizer: "%{key1} %{key2}"
co.elastic.hints/processors.dissect.tokenizer: "%{key2} %{key1}"

在上面的示例中,标记为 1 的处理器定义将首先执行。

数据流级别不支持处理器配置,因此 co.elastic.hints/<datastream>.processors 等注释将被忽略。

多个容器编辑

当一个 Pod 有多个容器时,除非您将容器名称放在提示中,否则设置将共享。例如,这些提示为 Pod 中的所有容器配置 processors.decode_json_fields,但为名为 sidecar 的容器设置了特定的 stream 提示。

annotations:
  co.elastic.hints/processors.decode_json_fields.fields: "message"
	co.elastic.hints/processors.decode_json_fields.add_error_key: true
	co.elastic.hints/processors.decode_json_fields.overwrite_keys: true
	co.elastic.hints/processors.decode_json_fields.target: "team"
	co.elastic.hints.sidecar/stream: "stderr"
支持提示自动发现的可用软件包编辑

可以通过提示支持的可用软件包可以在 此处 找到。

配置提示自动发现编辑

要启用提示自动发现,您必须在提供程序的配置中添加 hints.enabled: true

providers:
  kubernetes:
    hints.enabled: true

然后,通过取消注释 Elastic Agent 清单中的相应部分,确保指定了正确的卷和 volumeMounts

volumeMounts:
- name: external-inputs
  mountPath: /etc/elastic-agent/inputs.d
...
volumes:
- name: external-inputs
  emptyDir: {}
...

还需要一个 init 容器来下载提示模板。init 容器已定义,因此请取消注释相应的部分

initContainers:
- name: k8s-templates-downloader
  image: busybox:1.28
  command: ['sh']
  args:
    - -c
    - >-
      mkdir -p /etc/elastic-agent/inputs.d &&
      wget -O - https://github.com/elastic/elastic-agent/archive/8.14.tar.gz | tar xz -C /etc/elastic-agent/inputs.d --strip=5 "elastic-agent-8.14/deploy/kubernetes/elastic-agent-standalone/templates.d"
  volumeMounts:
    - name: external-inputs
      mountPath: /etc/elastic-agent/inputs.d

Elastic Agent 可以从 {path.config}/inputs.d 加载多个配置文件,并最终生成一个统一的配置文件(请参阅 配置独立 Elastic Agent)。用户可以手动将自己的模板挂载到 /etc/elastic-agent/inputs.d(如果他们想跳过启用 initContainers 部分)

示例:编辑
用于 Redis 的提示自动发现编辑

启用提示允许在集群上部署 Pod 的用户在 Pod 部署时自动启用 Elastic 监控。例如,要在集群上部署 Redis Pod 并自动启用 Elastic 监控,请将正确的提示作为注释添加到 Pod 清单文件中

...
apiVersion: v1
kind: Pod
metadata:
  name: redis
  annotations:
    co.elastic.hints/package: redis
    co.elastic.hints/data_streams: info
    co.elastic.hints/host: '${kubernetes.pod.ip}:6379'
    co.elastic.hints/info.period: 5s
  labels:
    k8s-app: redis
    app: redis
...

部署此 Pod 后,数据将自动开始流入。您可以在 metrics-redis.info-default 索引中找到它。

与 Redis 集成相关的所有资产(仪表板、摄取管道等)均未安装。您需要明确地 通过 Kibana 安装它们

用于 Kubernetes 日志收集的提示自动发现编辑

可以使用 container_logs.yml 模板 支持 Kubernetes 自动发现 Pod 的日志收集。Elastic Agent 需要发出 container_logs 映射,以便开始收集所有已发现容器的日志 (即使容器中不存在注释)

  1. 按照上述步骤启用提示自动发现
  2. 确保相关的 container_logs.yml 模板将挂载到 Elastic Agent 的 /etc/elastic-agent/inputs.d/ 文件夹下
  3. 部署 Elastic Agent 清单
  4. Elastic Agent 应该能够发现 Kubernetes 集群内的所有容器并收集可用的日志。

可以使用 hints.default_container_logs: false 禁用以前的默认行为。因此,这将禁用从所有已发现 Pod 中自动收集日志。用户需要使用以下注释专门注释他们的 Pod

annotations:
  co.elastic.hints/package: "container_logs"
providers.kubernetes:
  node: ${NODE_NAME}
  scope: node
  hints:
    enabled: true
    default_container_logs: false
...

在以下 nginx 清单示例中,我们将另外提供特定的流注释,以便将 filestream 输入配置为仅读取 stderr 流

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
  namespace: default
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
      annotations:
        co.elastic.hints/package: "container_logs"
        co.elastic.hints/stream: "stderr"
    spec:
      containers:
      - image: nginx
        name: nginx
...

用户可以监控最终呈现的 Elastic Agent 配置

kubectl exec -ti -n kube-system elastic-agent-7fkzm -- bash


/usr/share/elastic-agent# /elastic-agent inspect -v --variables --variables-wait 2s

inputs:
- data_stream.namespace: default
  id: hints-container-logs-3f69573a1af05c475857c1d0f98fc55aa01b5650f146d61e9653a966cd50bd9c-kubernetes-1780aca0-3741-4c8c-aced-b9776ba3fa81.nginx
  name: filestream-generic
  original_id: hints-container-logs-3f69573a1af05c475857c1d0f98fc55aa01b5650f146d61e9653a966cd50bd9c
  [output truncated ....]
  streams:
  - data_stream:
      dataset: kubernetes.container_logs
      type: logs
    exclude_files: []
    exclude_lines: []
    parsers:
    - container:
        format: auto
        stream: stderr
    paths:
    - /var/log/containers/*3f69573a1af05c475857c1d0f98fc55aa01b5650f146d61e9653a966cd50bd9c.log
    prospector:
      scanner:
        symlinks: true
    tags: []
  type: filestream
  use_output: default
outputs:
  default:
    hosts:
    - https://elasticsearch:9200
    password: changeme
    type: elasticsearch
    username: elastic
providers:
  kubernetes:
    hints:
      default_container_logs: false
      enabled: true
    node: control-plane
    scope: node
用于 Kubernetes 日志的提示自动发现(带 JSON 解码)编辑

根据前面的示例,用户可能希望对特定日志执行额外的处理,例如解码包含 JSON 字符串的特定字段。建议使用 decode_json_fields,如下所示

您需要启用提示自动发现,如前面的 用于 Kubernetes 日志收集的提示自动发现 示例中所述。

需要使用以下内容对将生成 JSON 日志的 Pod 进行注释

 annotations:
        co.elastic.hints/package: "container_logs"
        co.elastic.hints/processors.decode_json_fields.fields: "message"
        co.elastic.hints/processors.decode_json_fields.add_error_key: 'true'
        co.elastic.hints/processors.decode_json_fields.overwrite_keys: 'true'
        co.elastic.hints/processors.decode_json_fields.target: "team"

decode_json_fields 处理器的这些参数只是一个示例。

以下日志条目

{"myteam": "ole"}

将生成两个字段:原始 message 字段和目标字段 team

"team": {
      "myteam": "ole"
    },

"message": "{\"myteam\": \"ole\"}",
故障排除编辑

当事情没有按预期工作时,您可能需要对设置进行故障排除。在这里,我们提供了一些方向来加快您的调查速度

  1. 在代理的 Pod 中执行并运行 inspect 命令以验证如何动态构建输入

    ./elastic-agent inspect --variables --variables-wait 1s -c /etc/elastic-agent/agent.yml

    具体来说,检查输入是如何填充的。

  2. 查看 Elastic Agent 日志

    tail -f /etc/elastic-agent/data/logs/elastic-agent-*.ndjson

    验证配置文件中是否启用了提示功能,并查找与提示相关的日志,例如:“生成的提示映射为...”。在这些日志中,您可以找到从注释中提取的映射,并确定这些值是否可以填充特定的输入。

  3. 查看 Metricbeat 日志

    tail -f /etc/elastic-agent/data/logs/default/metricbeat-*.ndjson
  4. 查看 Filebeat 日志

    tail -f /etc/elastic-agent/data/logs/default/filebeat-*.ndjson
  5. 查看目标输入模板。以 Redis 为例

    cat f /etc/elastic-agent/inputs.d/redis.yml