基于条件的自动发现

编辑

您可以在每个输入中定义自动发现条件,以允许 Elastic Agent 自动识别 Pod 并使用预定义的集成开始监控它们。请参阅 输入 以获取相关信息。

条件定义在 由 Fleet 管理的 Elastic Agent独立 场景中均受支持。

有关输入配置中变量和条件的更多信息,请参阅 输入配置中的变量和条件。您可以在 Kubernetes 提供程序 中找到自动发现的可用变量。

示例:按标签定位 Pod

编辑

要自动识别 Redis Pod 并使用 Redis 集成对其进行监控,请取消 Elastic Agent 独立清单 中以下输入配置的注释

- name: redis
  type: redis/metrics
  use_output: default
  meta:
    package:
      name: redis
      version: 0.3.6
  data_stream:
    namespace: default
  streams:
    - data_stream:
        dataset: redis.info
        type: metrics
      metricsets:
        - info
      hosts:
        - '${kubernetes.pod.ip}:6379'
      idle_timeout: 20s
      maxconn: 10
      network: tcp
      period: 10s
      condition: ${kubernetes.labels.app} == 'redis'

条件 ${kubernetes.labels.app} == 'redis' 将使 Elastic Agent 在其清单中定义的范围内查找具有标签 app:redis 的 Pod。

有关可在条件中使用的提供程序字段列表,请参阅 Kubernetes 提供程序。条件使用的一些示例如下所示

  1. 对于具有标签 app.kubernetes.io/name=ingress-nginx 的 Pod,条件应为 condition: ${kubernetes.labels.app.kubernetes.io/name} == "ingress-nginx"
  2. 对于具有注释 prometheus.io/scrape: "true" 的 Pod,条件应为 ${kubernetes.annotations.prometheus.io/scrape} == "true"
  3. 对于具有名称 kube-scheduler-kind-control-plane 的 Pod,条件应为 ${kubernetes.pod.name} == "kube-scheduler-kind-control-plane"

Elastic Agent 清单中定义的 redis 输入仅指定了 `info` 度量集。要了解其他可用度量集及其配置设置,请参阅 Redis 模块页面

要部署 Redis,您可以应用以下示例清单

apiVersion: v1
kind: Pod
metadata:
  name: redis
  labels:
    k8s-app: redis
    app: redis
spec:
  containers:
  - image: redis
    imagePullPolicy: IfNotPresent
    name: redis
    ports:
    - name: redis
      containerPort: 6379
      protocol: TCP

您现在应该能够看到 Redis 数据流入索引 metrics-redis.info-default 中。确保 Redis 清单文件中的端口与 Redis 输入中使用的端口匹配。

与 Redis 集成相关的全部资产(仪表板、摄取管道等)均未安装。您需要通过 Kibana 显式安装它们

条件也可用于输入配置中,以便根据其标签为目标 Pod 动态设置目标主机。这对于针对特定 Pod(如 kube-schedulerkube-controller-manager)的数据集非常有用。以下配置将仅为定义了标签 component=kube-scheduler 的 Pod 启用 kubernetes.scheduler 数据集。

- data_stream:
    dataset: kubernetes.scheduler
    type: metrics
  metricsets:
    - scheduler
  bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
  hosts:
    - 'https://${kubernetes.pod.ip}:10259'
  period: 10s
  ssl.verification_mode: none
  condition: ${kubernetes.labels.component} == 'kube-scheduler'

Pod 的标签和注释可用于自动发现条件。对于包含点(.)的标签或注释,可以在条件中按其在 Pod 中定义的方式使用。例如 condition: ${kubernetes.labels.app.kubernetes.io/name} == 'ingress-nginx'。这不要与存储在 Elasticsearch 中的去点(默认情况下)标签和注释混淆 (Kubernetes 提供程序)。

在 8.6 版本之前,如果在 Kubernetes 提供程序配置中将 labels.dedot 参数设置为 true(默认为 true),则在自动发现条件中使用的标签将被去点。注释不适用此规则。此问题已在 8.6 版本中修复。请参阅 8.6.0 文档的“发行说明”部分。

在某些“服务即服务”Kubernetes 实现(如 GKE)中,控制平面节点甚至在其上运行的 Pod 将不可见。在这种情况下,将无法使用调度程序度量集(此示例所必需)。请参阅 调度程序和控制器管理器 以获取更多信息。

按照 Redis 示例,如果您部署另一个具有不同端口的 Redis Pod,则应检测到它。要检查这一点,例如,转到 metrics-redis.info-default 下的 service.address 字段。它应该显示两个不同的服务。

要获取此配置生成的策略,请连接到 Elastic Agent 容器

kubectl exec -n kube-system --stdin --tty elastic-agent-standalone-id -- /bin/bash

不要忘记将 elastic-agent-standalone-id 更改为您的 Elastic Agent Pod 的名称。此外,请确保您的 Pod 位于 kube-system 中。如果不是,请将 -n kube-system 更改为正确的命名空间。

在容器内部 检查 您用于 Elastic Agent 的配置文件的输出

elastic-agent inspect --variables --variables-wait 1s -c /etc/elastic-agent/agent.yml
您现在应该能够看到生成的策略。如果您查找 scheduler,它将类似于以下内容。
- bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
  hosts:
    - https://172.19.0.2:10259
  index: metrics-kubernetes.scheduler-default
  meta:
    package:
      name: kubernetes
      version: 1.9.0
  metricsets:
    - scheduler
  module: kubernetes
  name: kubernetes-node-metrics
  period: 10s
  processors:
    - add_fields:
        fields:
          labels:
            component: kube-scheduler
            tier: control-plane
          namespace: kube-system
          namespace_labels:
            kubernetes_io/metadata_name: kube-system
          namespace_uid: 03d6fd2f-7279-4db4-9a98-51e50bbe5c62
          node:
            hostname: kind-control-plane
            labels:
              beta_kubernetes_io/arch: amd64
              beta_kubernetes_io/os: linux
              kubernetes_io/arch: amd64
              kubernetes_io/hostname: kind-control-plane
              kubernetes_io/os: linux
              node-role_kubernetes_io/control-plane: ""
              node_kubernetes_io/exclude-from-external-load-balancers: ""
            name: kind-control-plane
            uid: b8d65d6b-61ed-49ef-9770-3b4f40a15a8a
          pod:
            ip: 172.19.0.2
            name: kube-scheduler-kind-control-plane
            uid: f028ad77-c82a-4f29-ba7e-2504d9b0beef
        target: kubernetes
    - add_fields:
        fields:
          cluster:
            name: kind
            url: kind-control-plane:6443
        target: orchestrator
    - add_fields:
        fields:
          dataset: kubernetes.scheduler
          namespace: default
          type: metrics
        target: data_stream
    - add_fields:
        fields:
          dataset: kubernetes.scheduler
          target: event
    - add_fields:
        fields:
          id: ""
          snapshot: false
          version: 8.3.0
        target: elastic_agent
    - add_fields:
        fields:
          id: ""
        target: agent
  ssl.verification_mode: none

示例:动态日志路径

编辑

要在配置中动态设置 Pod 的日志路径,请在 Elastic Agent 策略中使用变量以从提供程序返回路径信息

- name: container-log
  id: container-log-${kubernetes.pod.name}-${kubernetes.container.id}
  type: filestream
  use_output: default
  meta:
    package:
      name: kubernetes
      version: 1.9.0
  data_stream:
    namespace: default
  streams:
    - data_stream:
      dataset: kubernetes.container_logs
      type: logs
      prospector.scanner.symlinks: true
      parsers:
        - container: ~
      paths:
        - /var/log/containers/*${kubernetes.container.id}.log
此配置生成的策略对于清单中定义的范围内的每个 Pod 都会类似于以下内容。
- id: container-log-etcd-kind-control-plane-af311067a62fa5e4d6e5cb4d31e64c1c35d82fe399eb9429cd948d5495496819
  index: logs-kubernetes.container_logs-default
  meta:
    package:
      name: kubernetes
      version: 1.9.0
  name: container-log
  parsers:
    - container: null
  paths:
    - /var/log/containers/*af311067a62fa5e4d6e5cb4d31e64c1c35d82fe399eb9429cd948d5495496819.log
  processors:
    - add_fields:
        fields:
          id: af311067a62fa5e4d6e5cb4d31e64c1c35d82fe399eb9429cd948d5495496819
          image:
            name: registry.k8s.io/etcd:3.5.4-0
          runtime: containerd
        target: container
    - add_fields:
        fields:
          container:
            name: etcd
        labels:
          component: etcd
          tier: control-plane
        namespace: kube-system
        namespace_labels:
          kubernetes_io/metadata_name: kube-system
        namespace_uid: 03d6fd2f-7279-4db4-9a98-51e50bbe5c62
        node:
          hostname: kind-control-plane
          labels:
            beta_kubernetes_io/arch: amd64
            beta_kubernetes_io/os: linux
            kubernetes_io/arch: amd64
            kubernetes_io/hostname: kind-control-plane
            kubernetes_io/os: linux
            node-role_kubernetes_io/control-plane: ""
            node_kubernetes_io/exclude-from-external-load-balancers: ""
          name: kind-control-plane
          uid: b8d65d6b-61ed-49ef-9770-3b4f40a15a8a
        pod:
          ip: 172.19.0.2
          name: etcd-kind-control-plane
          uid: 08970fcf-bb93-487e-b856-02399d81fb29
      target: kubernetes
    - add_fields:
        fields:
          cluster:
            name: kind
            url: kind-control-plane:6443
        target: orchestrator
    - add_fields:
        fields:
          dataset: kubernetes.container_logs
          namespace: default
          type: logs
        target: data_stream
    - add_fields:
        fields:
          dataset: kubernetes.container_logs
        target: event
    - add_fields:
        fields:
          id: ""
          snapshot: false
          version: 8.3.0
        target: elastic_agent
    - add_fields:
        fields:
          id: ""
        target: agent
  prospector.scanner.symlinks: true
  type: filestream