教程:观察您的 Kubernetes 部署

编辑

教程:观察您的 Kubernetes 部署

编辑

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

一个成功的 Kubernetes 监控解决方案有以下几个要求

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

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

您将学到什么

编辑

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

  • 从 Kubernetes 和您的应用程序收集日志和指标
  • 从部署在 Kubernetes 中的应用程序收集跟踪数据
  • 将数据集中在 Elastic Stack 中
  • 使用定制的仪表板和 Observability 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 中的 Observability 应用程序用于可视化和管理您的可观察性数据。
Kubernetes monitoring architecture

Elastic Agent 的默认安装以 DaemonSet 的形式部署到 Kubernetes,以确保集群的每个节点上都有一个实例在运行。它从 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 文档

第一部分:添加和配置 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 资源(如服务、部署、Cron 作业)是整个基础设施的宝贵资产,并生成需要监控的自身的一组指标。

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 选项
编辑

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

添加元数据

此选项向事件添加元数据。元数据对于分组和探索相关数据很有价值。默认情况下启用此选项。

持有者令牌文件

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

主机

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

周期

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

SSL 验证模式

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

配置 kubelet API 元数据丰富
编辑

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 指标
编辑

您需要先部署 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 指标

监控 Deployment 状态和配置。有关更多信息,请参阅 kube-state-metrics Deployment 指标

Kubernetes Job 指标

监控 Job 完成状态和执行情况。有关更多信息,请参阅 kube-state-metrics Job 指标

Kubernetes 命名空间指标

监控命名空间的活动和终止状态。有关更多信息,请参阅 kube-state-metrics 命名空间指标

Kubernetes 节点指标

监控节点运行状况和资源使用情况。有关更多信息,请参阅 kube-state-metrics 节点指标

Kubernetes PersistentVolume 指标

监控 PersistentVolume 大小、状态和存储配置。有关更多信息,请参阅 kube-state-metrics PersistentVolume 指标

Kubernetes PersistentVolumeClaim 指标

监控 PersistentVolumeClaim 阶段、类和存储请求。有关更多信息,请参阅 kube-state-metrics PersistentVolumeClaim 指标

Kubernetes Pod 指标

监控 Pod 运行状况和性能。有关更多信息,请参阅 kube-state-metrics Pod 指标

Kubernetes ReplicaSet 指标

监控 ReplicaSet 状态和 ReplicaSet 中副本的数量。有关更多信息,请参阅 kube-state-metrics ReplicaSet 指标

Kubernetes ResourceQuota 指标

监控资源限制和当前使用情况。有关更多信息,请参阅 kube-state-metrics ResourceQuota 指标

Kubernetes Service 指标

监控服务配置、可访问性和网络集成。有关更多信息,请参阅 kube-state-metrics 服务指标

Kubernetes StatefulSet 指标

监控 StatefulSet 配置、状态和伸缩。有关更多信息,请参阅 kube-state-metrics StatefulSet 指标

Kubernetes StorageClass 指标

监控存储如何配置和分配。有关更多信息,请参阅 kube-state-metrics StorageClass 指标

配置 kube-state-metrics 选项
编辑

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

添加元数据

此选项向事件添加元数据。元数据对于分组和探索相关数据很有价值。默认情况下启用此选项。

主机

kube-state-metrics 正在运行的地址。端口 8080 是默认端口。

领导者选举

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

周期

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

配置 kube-state-metrics 元数据增强
编辑

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 指标
编辑

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

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

配置 Kubernetes API 服务器选项
编辑

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

持有者令牌文件

用于向 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 指标
编辑

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

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

配置 Kubernetes 代理选项
编辑

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

主机

kube-proxy 正在运行的地址。端口 10249 是默认端口。

周期

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

从 Kubernetes 调度器收集 Kubernetes 指标
编辑

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

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

配置 Kubernetes 调度器选项
编辑

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

持有者令牌文件

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

主机

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

周期

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

SSL 验证模式

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

从 Kubernetes 控制器管理器收集 Kubernetes 指标
编辑

kube-controller-manager 调节集群的状态。启用此选项可从 kube-controller-manager 获取指标。这些指标提供了有关 kube-controller-manager 的性能、资源使用情况和运行状况的见解。

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

配置 Kubernetes 控制器管理器选项
编辑

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

持有者令牌文件

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

主机

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

周期

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

SSL 验证模式

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

从 Kubernetes API 服务器收集 Kubernetes 事件
编辑

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

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

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

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

周期

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

添加元数据

启用此选项可向事件添加元数据。元数据对于分组和探索相关数据非常有价值。

跳过较旧的事件

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

领导者选举

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

收集 Kubernetes 容器日志
编辑

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

默认情况下还启用元数据增强,并且它基于 Kubernetes 提供程序。使用 Kubernetes 提供程序的 add_resource_metadata 代码块对其进行配置。有关配置提供程序的更多信息,请参阅 Kubernetes 提供程序文档。

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

配置 Kubernetes 容器日志
编辑

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

使用符号链接

符号链接是轻量级的,不包含日志文件的数据,而是指向它们的实际位置。默认情况下使用符号链接。

条件

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

收集 Kubernetes 审计日志
编辑

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

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

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

第 2 部分:配置并安装独立的 Elastic Agent

编辑

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

  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 部分:浏览日志和指标

编辑

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

查看性能和健康指标
编辑

要查看 Elastic Agent 收集的性能和健康指标,请在主菜单中查找基础设施或使用全局搜索字段

基础设施清单页面上,您可以在不同视图之间切换,以查看 Kubernetes 上运行的容器和 Pod 的概述

Inventory page that shows Kubernetes pods

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

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

Metrics dashboard that shows CPU usage for Kubernetes pods

有关使用指标浏览器页面的更多信息,请参阅随时间推移浏览基础设施指标

查看 Kubernetes 日志
编辑

全局搜索字段中查找日志浏览器

借助日志浏览器,您可以快速搜索和筛选日志数据,获取有关日志字段结构的信息,并在可视化中显示您的发现。

screenshot of the logs explorer main page

日志浏览器中,您可以从数据选择器中选择 Kubernetes 集成以查看您的 Kubernetes 数据。

screenshot of the logs explorer main page

在这里,您可以筛选日志数据并深入研究各个日志以查找和排除问题。有关更多信息,请参阅

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

编辑

借助 Elastic 应用程序性能监控 (APM),快速分类和排除应用程序性能问题。

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

步骤 1:设置 APM
编辑

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

在与 Kubernetes 配合使用时,有多种部署 APM 的方法,但本指南假定您在 Elastic Cloud 上使用我们托管的 Elasticsearch Service。如果您尚未执行此操作,请在Elasticsearch Service 控制台中启用 APM。

如果您想自己管理 APM,则有以下几种替代方案

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

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

  1. 在主菜单中查找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 代理
编辑

在大多数情况下,设置 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 数据
编辑

在大多数情况下,APM 代理会自动从容器内部读取 Kubernetes 数据并将其发送到 APM Server。如果情况并非如此,或者如果您希望覆盖此数据,您可以设置环境变量供代理读取。这些环境变量通过 Kubernetes pod 规范中的Downward 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:部署您的应用程序
编辑

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 中查看您的应用程序的跟踪
编辑

应用程序跟踪数据在服务清单中可用。要打开服务清单,请在主菜单中查找应用程序,或使用全局搜索字段

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

Applications UI Kubernetes

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

最重要的是,由于 Kubernetes 环境变量已映射到 APM 元数据事件,您可以按 Kubernetes namespacenode.namepod.namepod.uid 过滤您的跟踪数据。

Applications UI Kubernetes

下一步是什么

编辑
  • 想要保护您的端点免受安全威胁?试试Elastic Security。添加端点保护只是您添加到代理策略的另一个集成!
  • 盯着一堵屏幕墙看得眼睛发花了?创建警报,并在您在池畔啜饮您最喜欢的饮料时了解问题。
  • 想让 Elastic 完成繁重的工作吗?使用机器学习来检测异常