监控 Kubernetes:观察 Kubernetes 部署的健康状况和性能

编辑

监控 Kubernetes:观察 Kubernetes 部署的健康状况和性能编辑

在 Kubernetes 等容器化环境中运行的应用程序带来了独特的监控挑战:如何在数千(或数百万)个容器中运行的数百个微服务上诊断和解决问题,这些容器在短暂且可丢弃的 Pod 中运行?

成功的 Kubernetes 监控解决方案需要满足以下几个要求

  • 监控技术栈的所有层,包括

    • 运行 Kubernetes 的主机系统。
    • Kubernetes 核心组件、节点、Pod 和集群中运行的容器。
    • 在 Kubernetes 容器中运行的所有应用程序和服务。
  • 自动检测和监控动态出现的服务。
  • 提供一种关联相关数据的方法,以便您可以对相关指标、日志和其他可观测性数据进行分组和探索。

您将学到什么编辑

本指南介绍如何使用 Elastic 可观测性来观察应用程序的所有层,包括编排软件本身

  • 收集来自 Kubernetes 和应用程序的日志和指标
  • 收集使用 Kubernetes 部署的应用程序的跟踪数据
  • 将数据集中在 Elastic Stack 中
  • 使用定制仪表板和可观测性 UI 实时探索数据

本指南介绍如何使用 Elastic Agent 清单文件将 Elastic 监控代理部署为 DaemonSet。有关其他部署选项,请参阅来自 Elastic Cloud on Kubernetes (ECK) 的 Kubernetes 运算符和自定义资源定义。

监控架构编辑

Elastic Stack 为监控 Kubernetes 提供以下组件

  1. Elastic Agent 是一种统一的方式,可以为您的主机添加日志和指标等数据的监控。
  2. Elastic Agent Kubernetes 集成与 Elastic Agent 协同工作,从 Kubernetes 集群收集日志和指标。
  3. APM(稍后介绍)用于监控、检测和诊断复杂的应用程序性能问题。
  4. Elasticsearch 用于存储和搜索您的数据。
  5. Kibana 中的可观测性应用程序用于可视化和管理您的可观测性数据。
Kubernetes monitoring architecture

Elastic Agent 的默认安装部署到 Kubernetes 作为 DaemonSet,以确保在集群的每个节点上运行一个实例。它从 Kubernetes 上运行的 Pod、容器和应用程序收集日志和指标。

元数据编辑

Elastic Agent 提供处理器,用于将元数据添加到事件中。元数据对于对相关数据进行分组和探索非常有价值。例如,在分析容器日志时,您需要了解主机和容器名称,并能够关联日志、指标和跟踪。

默认部署包括处理器(如果需要),用于使用云和主机元数据丰富事件。

Metadata processors for cloud

有关这些处理器的更多信息,请参阅 add_cloud_metadataadd_host_metadata 文档。

默认情况下,Kubernetes 集成使用有价值的元数据丰富日志和指标。

默认情况下,所有 Kubernetes 指标都使用元数据进行丰富。丰富在代码中进行,并且可以使用每个数据集上的 add_resource_metadata 块进行配置。有关配置 add_resource_metadata 块的更多信息,请参阅 配置 kubelet API 元数据丰富配置 kube-state-metrics 元数据丰富

默认情况下,所有 Kubernetes 日志都使用元数据进行丰富。有关配置元数据丰富的更多信息,请参阅 收集 Kubernetes 容器日志

现在您已经对监控架构有了基本的了解,让我们学习如何将监控部署到您的 Kubernetes 环境中。

开始之前编辑

在您可以监控 Kubernetes 之前,您需要以下内容

  • Elasticsearch 用于存储和搜索您的可观测性数据,以及 Kibana 用于可视化和管理它。
  • 如果您想收集 Kubernetes 状态指标,您需要部署 kube-state-metrics。有关部署说明,请参阅 Kubernetes 文档

第 1 部分:添加和配置 Kubernetes 集成编辑

要开始从您的 Kubernetes 集群收集日志和指标,首先将 Kubernetes 集成 添加到您的策略,并配置您要收集的指标和日志。

步骤 1:将 Kubernetes 集成添加到您的部署编辑

按照以下步骤将 Kubernetes 集成添加到您的策略

  1. 从部署的主页选择 添加集成
  2. 在搜索栏中输入“Kubernetes”,然后选择 Kubernetes 集成。
  3. 单击 Kubernetes 集成页面顶部的 添加 Kubernetes
  4. 单击添加集成页面底部的 仅添加集成(跳过代理安装)

继续 步骤 2:配置您的 Kubernetes 集成

步骤 2:配置您的 Kubernetes 集成编辑

Kubernetes 集成可以从多个组件获取指标和日志。从 添加 Kubernetes 集成 页面,配置您要收集的指标和日志的选项。以下部分概述了配置选项。

收集指标

收集有关 Kubernetes 集群和在其上运行的工作负载的指标是 Kubernetes 可观测性的一个关键方面。您需要收集有关基础设施上运行的资源(例如,Kubernetes 集群的机器)的指标,有关整个集群的指标,以及有关容器和 Pod 的单个指标。具体来说,您需要监控以下内容的健康状况和性能

  • 运行 Kubernetes 组件的主机。每个主机都会生成指标,例如 CPU、内存、磁盘利用率以及磁盘和网络 I/O。
  • Kubernetes 容器,它们会生成自己的指标集。
  • 作为 Kubernetes Pod 运行的应用程序,例如应用程序服务器和数据库,每个应用程序都会生成自己的指标集。
  • 其他 Kubernetes 资源(如服务、部署、cronjob)是整个基础设施的宝贵资产,它们会生成自己的需要监控的指标集。

Elastic Agent 与 Kubernetes 集成一起提供了一种统一的解决方案来监控 Kubernetes 技术栈的所有层,因此您不需要多种技术来收集指标。

您可以选择以下选项来收集有关 Kubernetes 集群和在其上运行的工作负载的指标

收集日志

收集和分析 Kubernetes 核心组件和在 Kubernetes 上运行的各种应用程序的日志是 Kubernetes 可观测性的一个强大工具。在 Kubernetes Pod 中运行的容器会将日志发布到 stdout 或 stderr。

您可以选择以下选项来收集 Kubernetes 日志

从 kubelet API 收集 Kubernetes 指标编辑

从 kubelet API 收集指标默认情况下处于启用状态。Kubelet 是在每个 Kubernetes 节点上运行的代理,它对于管理单个 Pod 和托管它们的节点至关重要。有关 kubelet 的更多信息,请参阅 Kubernetes kubelet 文档

Elastic Agent 与 Kubernetes 集成一起可以从 kubelet API 收集指标,以收集有关 Kubernetes 节点、Pod、容器和其他资源状态的重要信息。pale 展开以下列表以查看来自 kubelet API 的所有可用指标。

展开以查看来自 kubelet API 的可用指标

容器指标

监控容器级别的总体资源使用情况、性能和状态。在 kubelet 容器指标 中了解更多信息。

节点指标

监控节点级别的总体资源使用情况、性能和状态。在 kubelet 节点指标 中了解更多信息。

Pod 指标

监控 Pod 级别的整体资源使用情况、性能和状态。在 kubelet pod 指标 中了解更多信息。

系统指标

监控系统容器的整体资源使用情况、性能和状态。在 kubelet 系统指标 中了解更多信息。

卷指标

监控持久卷的存储使用情况和容量。在 kubelet 卷指标 中了解更多信息。

配置 kubelet API 选项edit

为每个 kubelet API 选项提供以下信息

添加元数据

此选项将元数据添加到事件中。元数据对于对相关数据进行分组和探索非常有价值。此选项默认情况下处于启用状态。

Bearer 令牌文件

用于向 kubelet API 进行身份验证的令牌的文件路径。

主机

Elastic 将连接到的 kubelet API 服务器的地址,用于收集指标。 ${env.NODE_NAME} 是一个环境变量,表示 Kubernetes 节点的名称。端口 10250 是 kubelet API 监听 HTTPS 连接的默认端口。

周期

轮询 kubelet API 以获取指标的频率。默认值为每 10 秒一次。

SSL 验证模式

指定如何处理 SSL 验证。 none 表示 SSL 验证已禁用。

配置 kubelet API 元数据丰富edit

Kubernetes 容器指标Kubernetes Pod 指标 下,您可以从 高级选项 → 添加节点和命名空间元数据 配置元数据丰富。

从这里开始,更新 add_resource_metadata 块以配置丰富。

 add_resource_metadata:
   namespace:
     include_labels: ["namespacelabel1"]
   node:
     include_labels: ["nodelabel2"]
     include_annotations: ["nodeannotation1"]
   deployment: false

kube-state-metrics 收集 Kubernetes 指标edit

您需要部署 kube-state-metrics 才能使用它来收集指标数据。要了解如何操作,请参阅 Kubernetes 部署文档

kube-state-metrics 收集指标默认情况下处于启用状态。 kube-state-metrics 服务提供有关 Kubernetes 对象运行状况的集群范围指标。有关更多信息,请参阅 kube-state-metrics 文档

kube-state-metrics 提供水平分片以支持大型 Kubernetes 部署。有关更多信息,请参阅 kube-state-metrics 分片 文档。

使用 Kubernetes 集成,您可以使用 kube-state-metrics 收集大量指标。展开以下列表以查看来自 kube-state-metrics 的所有可用指标。

展开以查看来自 kube-state-metrics 的可用指标

容器指标

监控容器性能以确保 Pod 的效率和稳定性。在 kube-state-metrics 容器指标 中了解更多信息。

CronJob 指标

监控 CronJob 性能并确保它们可靠且高效地运行。在 kube-state-metrics CronJob 指标 中了解更多信息。

Kubernetes DaemonSet 指标

监控 DaemonSet 的运行状况和分布。在 kube-state-metrics DaemonSet 指标 中了解更多信息。

Kubernetes Deployment 指标

监控部署状态和配置。在 kube-state-metrics 部署指标 中了解更多信息。

Kubernetes Job 指标

监控作业完成状态和执行情况。在 kube-state-metrics 作业指标 中了解更多信息。

Kubernetes 命名空间指标

监控命名空间的活动和终止状态。在 kube-state-metrics 命名空间指标 中了解更多信息。

Kubernetes 节点指标

监控节点运行状况和资源使用情况。在 kube-state-metrics 节点指标 中了解更多信息。

Kubernetes 持久卷指标

监控持久卷的大小、状态和存储配置。在 kube-state-metrics 持久卷指标 中了解更多信息。

Kubernetes 持久卷声明指标

监控持久卷声明的阶段、类和存储请求。在 kube-state-metrics 持久卷声明指标 中了解更多信息。

Kubernetes Pod 指标

监控 Pod 的运行状况和性能。在 kube-state-metrics Pod 指标 中了解更多信息。

Kubernetes ReplicaSet 指标

监控 ReplicaSet 的状态和 ReplicaSet 中的副本数量。在 kube-state-metrics ReplicaSet 指标 中了解更多信息。

Kubernetes 资源配额指标

监控资源限制和当前使用情况。在 kube-state-metrics 资源配额指标 中了解更多信息。

Kubernetes 服务指标

监控服务配置、可访问性和网络集成。在 kube-state-metrics 服务指标 中了解更多信息。

Kubernetes StatefulSet 指标

监控 StatefulSet 的配置、状态和扩展。在 kube-state-metrics StatefulSet 指标 中了解更多信息。

Kubernetes 存储类指标

监控存储的配置和分配方式。在 kube-state-metrics 存储类指标 中了解更多信息。

配置 kube-state-metrics 选项edit

为每个 kube-state-metrics 选项提供以下信息

添加元数据

此选项将元数据添加到事件中。元数据对于对相关数据进行分组和探索非常有价值。此选项默认情况下处于启用状态。

主机

kube-state-metrics 运行的地址。端口 8080 为默认端口。

领导者选举

启用时(默认行为),只有持有领导者锁的 Elastic Agent 才会从 kube_state_metrics 中检索指标。这可以防止在多节点 Kubernetes 集群中出现重复数据。

周期

轮询 kube-state-metrics 以获取指标的频率。默认值为每 10 秒一次。

配置 kube-state-metrics 元数据丰富edit

Kubernetes 容器指标Kubernetes Pod 指标 下,您可以从 高级选项 → 添加节点和命名空间元数据 配置元数据丰富。

从这里开始,更新 add_resource_metadata 块以配置丰富。

add_resource_metadata:
  namespace:
   enabled: true
    #use_regex_include: false
    include_labels: ["namespacelabel1"]
    #use_regex_exclude: false
    #exclude_labels: ["namespacelabel2"]
  node:
   enabled: true
    #use_regex_include: false
    include_labels: ["nodelabel2"]
    include_annotations: ["nodeannotation1"]
    #use_regex_exclude: false
    #exclude_labels: ["nodelabel3"]
  #deployment: false
  #cronjob: false

从 Kubernetes API 服务器收集 Kubernetes 指标edit

kube-apiserver 收集指标默认情况下处于启用状态。 kube-apiserver 设置并验证 Pod、服务和其他 API 对象。这些指标提供了有关 API 服务器性能、工作负载和运行状况的洞察。

有关收集的指标的更多信息,请参阅 kube-apiserver 指标

配置 Kubernetes API 服务器选项edit

提供以下信息以收集 kube-apiserver 指标

Bearer 令牌文件

用于向 kube-apiserver 进行身份验证的令牌的文件路径。

主机

集成连接到的 Kubernetes API 服务器的地址。它使用 KUBERNETES_SERVICE_HOSTKUBERNETES_SERVICE_PORT 环境变量。

领导者选举

启用时(默认行为),只有持有领导者锁的 Elastic Agent 才会从 kube-apiserver 中检索指标。这可以防止在多节点 Kubernetes 集群中出现重复数据。

周期

轮询 kube-state-metrics 以获取指标的频率。默认值为每 30 秒一次。

SSL 证书颁发机构

用于验证 Kubernetes API 服务器的 TLS 证书的证书颁发机构 (CA) 捆绑包的路径。

从 Kubernetes 代理收集 Kubernetes 指标edit

kube-proxy 在每个节点上运行并维护网络规则。从 kube-proxy 收集指标默认情况下处于启用状态。这些指标提供了有关代理网络活动、性能和资源使用情况的洞察。

有关收集的指标的更多信息,请参阅 kube-proxy 指标

配置 Kubernetes 代理选项edit

提供以下信息以收集 Kubernetes 代理指标

主机

kube-proxy 运行的地址。端口 10249 为默认端口。

周期

轮询 kube-state-metrics 以获取指标的频率。默认值为每 10 秒一次。

从 Kubernetes 调度程序收集 Kubernetes 指标edit

kube-scheduler 将没有节点分配的新 Pod 分配到最合适的节点。启用此选项以从 kube-scheduler 获取指标。这些指标提供了有关 kube-scheduler 性能、资源使用情况和运行状况的洞察。

有关收集的指标的更多信息,请参阅 kube-scheduler 指标

配置 Kubernetes 调度程序选项edit

提供以下信息以收集 Kubernetes 调度程序指标

Bearer 令牌文件

用于向 kube-scheduler 进行身份验证的令牌的文件路径。

主机

Elastic 集成应从中收集指标的 kube-scheduler 的地址和端口。端口 10259 为默认端口。

周期

轮询 kube-scheduler 以获取指标的频率。默认值为每 10 秒一次。

SSL 验证模式

指定如何处理 SSL 验证。默认值为 none,表示 SSL 验证已禁用。

从 Kubernetes 控制器管理器收集 Kubernetes 指标edit

kube-controller-manager 规范集群的状态。启用此选项以从 kube-controller-manager 获取指标。这些指标提供了有关 kube-controller-manager 性能、资源使用情况和运行状况的洞察。

有关收集的指标的更多信息,请参阅kube-controller-manager 指标

配置 Kubernetes 控制器管理器选项edit

提供以下信息以收集 kube-controller-manager 指标

Bearer 令牌文件

用于向 kube-controller-manager 进行身份验证的令牌的文件路径。

主机

集成应从中收集指标的 kube-controller-manager 的地址和端口。端口 10259 为默认端口。

周期

轮询 kube-controller-manager 以获取指标的频率。默认值为每 10 秒一次。

SSL 验证模式

指定如何处理 SSL 验证。默认值为 none,表示 SSL 验证已禁用。

从 Kubernetes API 服务器收集 Kubernetes 事件edit

事件指标为您提供了集群中发生情况的总体视图。这些指标有助于您了解集群中发生的情况,并提高可靠性和稳定性。默认情况下,从 Kubernetes API 服务器收集 Kubernetes 事件处于启用状态。

有关收集的指标的更多信息,请参阅事件指标

配置来自 Kubernetes API 服务器的事件edit

提供以下信息以收集 Kubernetes 事件指标

周期

轮询 kube-api-server 以获取事件的频率。默认值为每 10 秒一次。

添加元数据

启用以向事件添加元数据。元数据对于对相关数据进行分组和探索非常有价值。

跳过较旧的事件

忽略在特定时间之前发生的事件

领导者选举

启用时(默认行为),只有持有领导者锁的 Elastic Agent 才会从 kube-apiserver 中检索指标。这可以防止在多节点 Kubernetes 集群中出现重复数据。

收集 Kubernetes 容器日志edit

默认情况下,收集和解析 Kubernetes 容器日志处于启用状态。在 Kubernetes Pod 中运行的容器会将日志发布到 stdout 或 stderr。这些日志被写入 kubelet 已知的位置。容器解析器默认情况下处于启用状态。您可以在 高级设置 中启用其他解析器。

元数据丰富也默认情况下处于启用状态,并且基于 Kubernetes 提供程序。使用 Kubernetes 提供程序的 add_resource_metadata 块来配置它。有关配置提供程序的更多信息,请参阅Kubernetes 提供程序 文档。

有关收集容器日志的更多信息,请参阅Kubernetes 容器日志

配置 Kubernetes 容器日志edit

提供以下信息以收集容器日志

使用符号链接

符号链接很轻巧,不包含日志文件的数据,但指向其实际位置。默认情况下使用符号链接。

条件

您可以指定一个条件来控制是否将配置应用于正在运行的 Elastic Agent。

收集 Kubernetes 审计日志edit

此功能处于技术预览阶段,可能会在将来的版本中更改或删除。Elastic 将努力解决任何问题,但技术预览中的功能不受官方 GA 功能支持 SLA 的约束。

启用此选项以收集审计日志。Kubernetes 审计日志记录来自内部和外部组件的 Kubernetes API 的请求。这些日志有助于您了解集群行为并调试问题。

有关收集审计日志的更多信息,请参阅Kubernetes 审计日志

第 2 部分:配置和安装独立 Elastic Agentedit

配置完集成后,您需要下载并更新清单。首先,通过完成以下步骤下载清单

  1. 添加 Kubernetes 集成 页面底部,单击 保存并继续
  2. 单击 将 Elastic Agent 添加到您的主机
  3. 加入 Fleet? 下,选择 独立运行

    Select run standalone under Enroll in Fleet
  4. 配置代理 下,选择 下载清单

下载清单后,打开它并在 DaemonSet 中更新 ES_USERNAMEES_PASSWORD 环境变量,使其与您的 Elasticsearch 凭据匹配。

您还可以进一步修改清单以满足您的需求。例如,您可能希望启用自动发现以自动发现容器日志。有关在清单中启用自动发现的更多信息,请参阅 Fleet 指南中的自动发现文档

准备部署 Elastic Agent 后

  1. 从您下载清单的目录中,运行以下应用命令

    kubectl apply -f elastic-agent-standalone-kubernetes.yml
  2. 使用以下命令检查 Elastic Agent 状态

    kubectl -n kube-system get pods -l app=elastic-agent

如果您在配置或安装 Elastic Agent 时遇到任何问题,请参阅调试独立 Elastic Agent

第 3 部分:探索日志和指标edit

使用 Kibana 查看 Elastic Agent 收集的指标和日志数据。有关查看数据的更多信息,请参阅以下部分。

查看性能和运行状况指标edit

要查看 Elastic Agent 收集的性能和运行状况指标,请打开 Kibana 并转到 可观察性 → 基础设施

清单 页面上,您可以切换不同的视图以查看 Kubernetes 上运行的容器和 Pod 的概述

Inventory page that shows Kubernetes pods

有关使用清单页面的更多信息,请参阅按资源类型查看基础设施指标

指标资源管理器 页面上,您可以对正在监控的资源的指标进行分组和分析。

Metrics dashboard that shows CPU usage for Kubernetes pods

有关使用 指标资源管理器 页面的更多信息,请参阅随时间推移探索基础设施指标

查看日志edit

要查看 Kubernetes 日志,请打开 Kibana 并转到 可观察性 → 日志资源管理器。使用 日志资源管理器,您可以快速搜索和过滤日志数据,获取有关日志字段结构的信息,并将您的发现显示在可视化中。

screenshot of the logs explorer main page

日志资源管理器 中,您可以从数据选择器中选择 Kubernetes 集成以查看您的 Kubernetes 数据。

screenshot of the logs explorer main page

从这里,您可以过滤日志数据并深入研究单个日志以查找和解决问题。有关更多信息,请参阅

第 4 部分:监控应用程序性能edit

借助 Elastic 应用程序性能监控 (APM),您可以快速排查和解决应用程序性能问题。

考虑一下延迟峰值 - APM 可以帮助您将调查范围缩小到单个服务。由于您还摄取并关联了日志和指标,因此您可以将问题与特定 Kubernetes Pod 的 CPU 和内存利用率或错误日志条目相关联。

步骤 1:设置 APMedit

应用程序监控数据从在 Kubernetes 中运行的应用程序流式传输到 APM,在那里它被验证、处理并转换为 Elasticsearch 文档。

在使用 Kubernetes 时,有许多方法可以部署 APM,但本指南假设您正在使用我们托管的 Elastic Cloud 上的 Elasticsearch 服务。如果您尚未这样做,请在Elasticsearch 服务控制台 中启用 APM。

如果您想自己管理 APM,则有一些替代方案

展开替代方案
  • Elastic Cloud on Kubernetes (ECK) - Elastic 建议用于管理在 Kubernetes 上部署的 APM Server 的方法。ECK 基于 Kubernetes 运算符模式构建,扩展了基本的 Kubernetes 编排功能以支持在 Kubernetes 上设置和管理 APM Server。
  • 将 APM Server 部署为 DaemonSet - 确保在集群中的每个节点上运行一个 APM Server 实例。当节点中的所有 Pod 应该共享单个 APM Server 实例时,这很有用。
  • 将 APM Server 部署为 sidecar - 对于不应该共享 APM Server 的环境,例如当将来自多个应用程序的跟踪定向到单独的 Elasticsearch 集群时。
  • 下载并安装 APM Server - 经典的非 Kubernetes 选项。

步骤 2:保存您的秘密令牌edit

一个秘密令牌 用于保护 APM 代理和 APM Server 之间的通信。要在 Kibana 中创建或更新您的秘密令牌

  1. 打开 Kibana 并导航到 Fleet。
  2. 代理策略 选项卡下,选择您要配置的策略。
  3. 找到 Elastic APM 集成并选择 操作 → 编辑集成
  4. 导航到 代理授权 → 秘密令牌 并设置令牌的值。
  5. 单击保存集成。APM Server 将在更改生效之前重新启动。

为了避免公开秘密令牌,您可以将其存储在 Kubernetes 秘密中。例如

kubectl create secret generic apm-secret --from-literal=ELASTIC_APM_SECRET_TOKEN=asecretpassword --namespace=kube-system 

在您将要部署应用程序的相同命名空间中创建秘密。

如果您自己管理 APM Server,请参阅秘密令牌,了解有关如何设置秘密令牌的说明。

如果您使用 ECK 设置 APM Server,则运算符会自动为您生成一个 {APM-server-name}-apm-token 秘密。

步骤 3:安装和配置 APM 代理edit

在大多数情况下,设置 APM 代理并因此检测您的应用程序就像安装一个库并添加几行代码一样简单。

选择您的应用程序的语言以获取详细信息

附加代理

Java 代理可以在不更改应用程序镜像或代码的情况下检测支持的技术。为此,您需要一个基于官方 Elastic APM Docker 镜像的 初始化容器

在您的应用程序启动之前,将代理从初始化容器复制到共享卷中。例如,使用 Java 代理

    # ...
    spec:
      volumes:
      - name: elastic-apm-agent 
        emptyDir: {}
      initContainers:
      - name: elastic-java-agent
        image: docker.elastic.co/observability/apm-agent-java:1.12.0 
        volumeMounts:
        - mountPath: /elastic/apm/agent
          name: elastic-apm-agent
        command: ['cp', '-v', '/usr/agent/elastic-apm-agent.jar', '/elastic/apm/agent'] 

共享卷

从官方 Elastic Java 代理镜像构建 initContainer

将代理复制到共享卷

Java 命令行需要一种方法来获取此 javaagent 配置。您可以使用标准 JVM TI JAVA_TOOL_OPTIONS 环境变量来执行此操作。它不需要显式指定,并在 JVM 启动时自动获取。

对于不支持此选项的 JVM,您可以使用任何其他环境变量——无论是启动脚本中已定义的变量(例如某些 servlet 容器脚本中的 JAVA_OPTS),还是添加一个专用的空变量,如果未设置,则该变量不会产生任何影响。

      # ...
      containers:
      - name: your-app-container
        env:
        # ...
        - name: JAVA_TOOL_OPTIONS 
          value: -javaagent:/elastic/apm/agent/elastic-apm-agent.jar

用于命令行获取 javaagent 配置

配置代理

使用环境变量配置代理

        # ...
        - name: ELASTIC_APM_SERVER_URLS
          value: "apm-server-url-goes-here" 
        - name: ELASTIC_APM_SECRET_TOKEN
          valueFrom:
            secretKeyRef:
              name: apm-secret
              key: ELASTIC_APM_SECRET_TOKEN 
        - name: ELASTIC_APM_SERVICE_NAME
          value: "service-name-goes-here" 
        - name: ELASTIC_APM_APPLICATION_PACKAGES
          value: "org.springframework.samples.petclinic" 
        - name: JAVA_TOOL_OPTIONS 
          value: -javaagent:/elastic/apm/agent/elastic-apm-agent.jar

默认值为 https://127.0.0.1:8200

从之前创建的 apm-secret 密钥库中传入 ELASTIC_APM_SECRET_TOKEN

允许的字符:a-z、A-Z、0-9、-、_ 和空格

用于确定堆栈跟踪帧是应用程序内帧还是帧。

之前已解释

在代理参考中了解更多信息

步骤 4:配置 Kubernetes 数据edit

在大多数情况下,APM 代理会自动从容器内部读取 Kubernetes 数据并将其发送到 APM Server。如果不是这种情况,或者您希望覆盖此数据,您可以设置代理读取的环境变量。这些环境变量通过 Kubernetes pod 规范中的 向下 API 设置

      # ...
      containers:
      - name: your-app-container
        env:
        # ...
        - name: KUBERNETES_NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        - name: KUBERNETES_POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: KUBERNETES_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: KUBERNETES_POD_UID
          valueFrom:
            fieldRef:
              fieldPath: metadata.uid

下表将这些环境变量映射到 APM 元数据事件字段

环境变量 元数据字段名称

KUBERNETES_NODE_NAME

system.kubernetes.node.name

KUBERNETES_POD_NAME

system.kubernetes.pod.name

KUBERNETES_NAMESPACE

system.kubernetes.namespace

KUBERNETES_POD_UID

system.kubernetes.pod.uid

步骤 5:部署您的应用程序edit

APM 代理与您的应用程序一起部署。

资源配置文件示例

基于先前步骤的完整资源配置文件。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: <<your-app>>
  namespace: kube-system
  labels:
    app: <<your-app>>
    service: <<your-app>>
spec:
  replicas: 1
  selector:
    matchLabels:
      app: <<your-app>>
  template:
    metadata:
      labels:
        app: <<your-app>>
        service: <<your-app>>
    spec:
      dnsPolicy: ClusterFirstWithHostNet
      volumes:
      - name: elastic-apm-agent
        emptyDir: {}
      initContainers:
      - name: elastic-java-agent
        image: docker.elastic.co/observability/apm-agent-java:1.12.0
        volumeMounts:
        - mountPath: /elastic/apm/agent
          name: elastic-apm-agent
        command: ['cp', '-v', '/usr/agent/elastic-apm-agent.jar', '/elastic/apm/agent']
      containers:
      - name: <<your-app>>
        image: <<your-app>>
        volumeMounts:
        - mountPath: /elastic/apm/agent
          name: elastic-apm-agent
        env:
        - name: ELASTIC_APM_SERVER_URL
          value: "apm-server-url-goes-here"
        - name: ELASTIC_APM_SECRET_TOKEN
          valueFrom:
            secretKeyRef:
              name: apm-secret
              key: ELASTIC_APM_SECRET_TOKEN
        - name: ELASTIC_APM_SERVICE_NAME
          value: "petclinic"
        - name: ELASTIC_APM_APPLICATION_PACKAGES
          value: "org.springframework.samples.petclinic"
        - name: ELASTIC_APM_ENVIRONMENT
          value: test
        - name: JAVA_TOOL_OPTIONS
          value: -javaagent:/elastic/apm/agent/elastic-apm-agent.jar
        - name: KUBERNETES_NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        - name: KUBERNETES_POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: KUBERNETES_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: KUBERNETES_POD_UID
          valueFrom:
            fieldRef:
              fieldPath: metadata.uid
kubectl apply -f demo.yml

在 Kibana 中查看您的跟踪edit

要查看应用程序的跟踪数据,请打开 Kibana 并转到 可观察性 → 服务

APM 应用程序允许您实时监控软件服务和应用程序:可视化服务上的详细性能信息,识别和分析错误,以及监控主机级和代理特定指标(如 JVM 和 Go 运行时指标)。

APM app Kubernetes

只需点击几下即可访问应用程序级洞察,这可以大幅减少您花费在调试错误、缓慢响应时间和崩溃上的时间。

最棒的是,由于 Kubernetes 环境变量已映射到 APM 元数据事件,因此您可以按 Kubernetes namespacenode.namepod.namepod.uid 筛选跟踪数据。

APM app Kubernetes

下一步edit

  • 想要保护您的端点免受安全威胁?试试 Elastic Security。添加端点保护只是您添加到代理策略中的另一个集成!
  • 您的眼睛是否因为盯着屏幕而变得模糊?创建警报,并在您在泳池边啜饮您最喜欢的饮料时了解问题。
  • 想要 Elastic 来完成繁重的工作?使用机器学习来 检测异常