基于条件的自动发现
编辑基于条件的自动发现
编辑您可以在每个输入中定义自动发现条件,以允许 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 提供程序。以下是一些条件用法示例
- 对于标签为
app.kubernetes.io/name=ingress-nginx
的 pod,条件应为condition: ${kubernetes.labels.app.kubernetes.io/name} == "ingress-nginx"
。 - 对于带有注解
prometheus.io/scrape: "true"
的 pod,条件应为${kubernetes.annotations.prometheus.io/scrape} == "true"
。 - 对于名称为
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
您现在应该能够在 metrics-redis.info-default
索引上看到 Redis 数据流。请确保您的 Redis 清单文件中的端口与 Redis 输入中使用的端口匹配。
与 Redis 集成相关的所有资产(仪表板、摄取管道等)均未安装。您需要通过 Kibana 显式安装它们。
条件还可以在输入配置中使用,以便根据 Pod 的标签动态设置目标 Pod 的目标主机。这对于以特定 Pod 为目标的如 kube-scheduler
或 kube-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 都不可见。在这种情况下,无法使用此示例所需的 scheduler 指标集。请参阅scheduler 和 controller manager 了解更多信息。
按照 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