教程:观察您的 Kubernetes 部署
Elastic Stack
在像 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 的组件
- Elastic Agent 是一种单一的、统一的方式,可为您的主机添加对日志和指标等数据的监控。
- Elastic Agent Kubernetes 集成与 Elastic Agent 配合使用,可从 Kubernetes 集群收集日志和指标。
- APM(稍后描述)用于监控、检测和诊断复杂的应用程序性能问题。
- Elasticsearch 用于存储和搜索您的数据。
- Kibana 中的 Observability 应用用于可视化和管理您的可观察性数据。

Elastic Agent 的默认安装作为 DaemonSet 部署到 Kubernetes,以确保集群的每个节点上都运行一个实例。 它从在 Kubernetes 上运行的 Pod、容器和应用程序收集日志和指标。
Elastic Agent 提供处理器,用于向事件添加元数据。 元数据对于分组和浏览相关数据非常有价值。 例如,在分析容器日志时,您需要知道主机和容器名称,并且能够关联日志、指标和跟踪。
默认部署包括在需要时使用处理器来丰富包含云和主机元数据的事件。

有关这些处理器的更多信息,请参阅 add_cloud_metadata
和 add_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 集成添加到您的策略
- 在主菜单中找到 集成,或使用全局搜索字段。
- 在搜索栏中输入“Kubernetes”,然后选择 Kubernetes 集成。
- 单击 Kubernetes 集成页面顶部的 添加 Kubernetes。
- 单击“添加集成即可(跳过代理安装)”在添加集成页面底部。
Kubernetes 集成可以从多个组件获取指标和日志。 在 添加 Kubernetes 集成 页面中,配置您要收集的指标和日志的选项。 以下部分概述了配置选项。
收集指标
收集关于 Kubernetes 集群以及在其上运行的工作负载的指标是 Kubernetes 可观察性的一个关键方面。 您需要收集关于底层基础设施上运行的资源(例如,您的 Kubernetes 集群的机器)的指标、整个集群的指标以及容器和 Pod 的各个指标。 具体来说,您需要监控以下内容的运行状况和性能
- Kubernetes 组件运行的主机。 每个主机都会生成诸如 CPU、内存、磁盘利用率以及磁盘和网络 I/O 之类的指标。
- Kubernetes 容器,它们会生成自己的一组指标。
- 作为 Kubernetes Pod 运行的应用程序,例如应用程序服务器和数据库,每个都会生成自己的一组指标。
- 其他 Kubernetes 资源(如服务、部署、cronjob)是整个基础设施的宝贵资产,并且会生成自己的一组需要监控的指标。
Elastic Agent 与 Kubernetes 集成一起提供了一个统一的解决方案来监控您的 Kubernetes 技术堆栈的所有层,因此您不需要多种技术来收集指标。
您可以使用以下选项来收集关于您的 Kubernetes 集群以及在其上运行的工作负载的指标
- 从 kubelet API 收集 Kubernetes 指标
- 从
kube-state-metrics
收集 Kubernetes 指标 - 从 Kubernetes API 服务器收集 Kubernetes 指标
- 从 Kubernetes 代理收集 Kubernetes 指标
- 从 Kubernetes 调度器收集 Kubernetes 指标
- 从 Kubernetes controller-manager 收集 Kubernetes 指标
- 从 Kubernetes API Server 收集 Kubernetes 事件
收集日志
收集和分析 Kubernetes 核心组件以及在 Kubernetes 上运行的各种应用程序的日志是 Kubernetes 可观察性的强大工具。 在 Kubernetes Pod 中运行的容器会将日志发布到 stdout 或 stderr。
您可以使用以下选项来收集 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 选项提供以下信息
- 添加元数据
- 此选项会将元数据添加到事件。 元数据对于分组和浏览相关数据很有价值。 默认情况下,此选项处于启用状态。
- Bearer Token 文件
- 用于向 kubelet API 进行身份验证的令牌的文件路径。
- 主机
- Elastic 将连接以收集指标的 kubelet API 服务器的地址。
${env.NODE_NAME}
是一个环境变量,表示 Kubernetes 节点的名称。 端口10250
是 kubelet API 监听 HTTPS 连接的默认端口。 - 周期
- 轮询 kubelet API 以获取指标的频率。 默认值为每 10 秒一次。
- SSL 验证模式
- 指定如何处理 SSL 验证。
none
表示 SSL 验证已禁用。
在 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
收集指标处于启用状态。 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
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 指标
- 监控 ReplicaSets 状态和 ReplicaSets 中的副本数。 请访问
kube-state-metrics
ReplicaSet 指标 了解更多信息。 - Kubernetes ResourceQuota 指标
- 监控资源限制和当前使用情况。 请访问
kube-state-metrics
ResourceQuota 指标 了解更多信息。 - Kubernetes Service 指标
- 监控服务配置、可访问性和网络集成。 请访问
kube-state-metrics
service 指标 了解更多信息。 - Kubernetes StatefulSet 指标
- 监控 StatefulSet 配置、状态和缩放。 请访问
kube-state-metrics
StatefulSet 指标 了解更多信息。 - Kubernetes StorageClass 指标
监控存储的配置和分配方式。 请访问
kube-state-metrics
StorageClass 指标 了解更多信息。
为每个 kube-state-metrics
选项提供以下信息
- 添加元数据
- 此选项会将元数据添加到事件。 元数据对于分组和浏览相关数据很有价值。 默认情况下,此选项处于启用状态。
- 主机
kube-state-metrics
正在运行的地址。 端口 8080 是默认端口。- 领导者选举
- 启用时(默认行为),只有持有领导者锁的 Elastic Agent 才会从
kube_state_metrics
检索指标。 这可以防止多节点 Kubernetes 集群中出现重复数据。 - 周期
- 轮询
kube-state-metrics
以获取指标的频率。 默认值为每 10 秒一次。
在 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
默认情况下,从 kube-apiserver
收集指标处于启用状态。 kube-apiserver
设置和验证 Pod、服务和其他 API 对象。 这些指标提供了对 API 服务器的性能、工作负载和运行状况的深入了解。
有关收集的指标的更多信息,请参阅 kube-apiserver
指标。
提供以下信息以收集 kube-apiserver
指标
- Bearer Token 文件
- 用于向
kube-apiserver
进行身份验证的令牌的文件路径。 - 主机
- 集成连接到的 Kubernetes API 服务器的地址。 它使用
KUBERNETES_SERVICE_HOST
和KUBERNETES_SERVICE_PORT
环境变量。 - 领导者选举
- 启用时(默认行为),只有持有领导者锁的 Elastic Agent 才会从
kube-apiserver
检索指标。 这可以防止多节点 Kubernetes 集群中出现重复数据。 - 周期
- 轮询
kube-state-metrics
以获取指标的频率。 默认值为每 30 秒一次。 - SSL 证书颁发机构
- 用于验证 Kubernetes API 服务器的 TLS 证书的证书颁发机构 (CA) 捆绑包的路径。
kube-proxy
在每个节点上运行并维护网络规则。 默认情况下,从 kube-proxy
收集指标处于启用状态。 这些指标提供了对代理的网络活动、性能和资源使用情况的深入了解。
有关收集的指标的更多信息,请参阅 kube-proxy
指标。
提供以下信息以收集 Kubernetes 代理指标
- 主机
kube-proxy
正在运行的地址。 端口 10249 是默认端口。- 周期
- 轮询
kube-state-metrics
以获取指标的频率。 默认值为每 10 秒一次。
kube-scheduler 将没有节点分配的新 Pod 分配给最合适的节点。 启用此选项可从 kube-scheduler 获取指标。 这些指标提供了对 kube-scheduler
的性能、资源使用情况和运行状况的深入了解。
有关收集的指标的更多信息,请参阅 kube-scheduler
指标。
提供以下信息以收集 Kubernetes 调度器指标
- Bearer Token 文件
- 用于向
kube-scheduler
进行身份验证的令牌的文件路径。 - 主机
- Elastic 集成应从中收集指标的
kube-scheduler
的地址和端口。 端口10259
是默认端口。 - 周期
- 轮询
kube-scheduler
以获取指标的频率。 默认值为每 10 秒一次。 - SSL 验证模式
- 指定如何处理 SSL 验证。 默认为
none
,表示 SSL 验证已禁用。
kube-controller-manager
管理集群的状态。开启此选项可从 kube-controller-manager
获取指标。这些指标提供了关于 kube-controller-manager 的性能、资源使用和健康状况的洞察。
有关收集的指标的更多信息,请参阅 kube-controller-manager
指标。
提供以下信息以收集 kube-controller-manager
指标
- Bearer Token 文件
- 用于向
kube-controller-manager
进行身份验证的令牌的文件路径。 - 主机
- 集成应从中收集指标的
kube-controller-manager
的地址和端口。默认端口为 10259。 - 周期
- 轮询
kube-controller-manager
以获取指标的频率。默认值为每 10 秒。 - SSL 验证模式
- 指定如何处理 SSL 验证。 默认为
none
,表示 SSL 验证已禁用。
事件指标让你全面了解集群中发生的事情。这些指标帮助你了解集群中发生的事情并提高可靠性和稳定性。默认情况下,从 Kubernetes API 服务器收集 Kubernetes 事件已开启。
有关收集的指标的更多信息,请参阅 事件指标。
提供以下信息以收集 Kubernetes 事件指标
- 周期
- 轮询
kube-api-server
以获取事件的频率。默认值为每 10 秒。 - 添加元数据
- 开启此选项可向事件添加元数据。元数据对于分组和浏览相关数据很有价值。
- 跳过较旧的事件
- 忽略在某个时间之前发生的事件
- 领导者选举
- 启用时(默认行为),只有持有领导者锁的 Elastic Agent 才会从
kube-apiserver
检索指标。 这可以防止多节点 Kubernetes 集群中出现重复数据。
默认情况下,已开启收集和解析 Kubernetes 容器日志。在 Kubernetes Pod 中运行的容器将日志发布到 stdout 或 stderr。这些日志会被写入 kubelet 已知的位置。默认情况下,容器解析器已启用。你可以在高级设置中启用其他解析器。
默认情况下,也启用了元数据丰富,并且基于 Kubernetes 提供程序。使用 Kubernetes 提供程序的 add_resource_metadata
块对其进行配置。有关配置提供程序的更多信息,请参阅 Kubernetes 提供程序 文档。
有关收集容器日志的更多信息,请参阅 Kubernetes 容器日志。
提供以下信息以收集容器日志
- 使用符号链接
- 符号链接很轻巧,不包含日志文件的数据,但指向它们的实际位置。默认情况下使用符号链接。
- 条件
- 你可以指定一个条件来控制是否将配置应用于正在运行的 Elastic Agent。
此功能处于技术预览阶段,可能会在将来的版本中更改或删除。Elastic 将努力解决任何问题,但技术预览版中的功能不受官方 GA 功能的支持 SLA 的约束。
开启此选项可收集审计日志。 Kubernetes 审计日志记录来自内部和外部组件的 Kubernetes API 请求。这些日志可以帮助你了解集群行为并调试问题。
有关收集审计日志的更多信息,请参阅 Kubernetes 审计日志。
配置集成后,你需要下载并更新你的清单。首先,通过完成以下步骤下载清单
在 添加 Kubernetes 集成 页面的底部,单击 保存并继续。
单击 将 Elastic Agent 添加到你的主机。
在 注册 Fleet? 下,选择 以独立模式运行。
在 配置 Agent 下,选择 下载清单。
下载清单后,打开它并更新 DaemonSet 中的 ES_USERNAME
和 ES_PASSWORD
环境变量以匹配你的 Elasticsearch 凭据。
你还可以进一步修改清单以满足你的需求。例如,你可能想要启用自动发现以自动发现容器日志。有关在清单中启用自动发现的更多信息,请参阅 Fleet 指南中的 自动发现文档。
准备好部署 Elastic Agent 后
从你下载清单的目录中,运行以下 apply 命令
kubectl apply -f elastic-agent-standalone-kubernetes.yml
使用以下命令检查 Elastic Agent 状态
kubectl -n kube-system get pods -l app=elastic-agent
如果在配置或安装 Elastic Agent 时遇到任何问题,请参阅 调试独立的 Elastic Agents。
使用 Kibana 查看 Elastic Agent 收集的指标和日志数据。有关查看数据的更多信息,请参阅以下部分。
要查看 Elastic Agent 收集的性能和健康状况指标,请在主菜单中找到 基础设施 或使用 全局搜索字段。
在 基础设施清单 页面上,你可以在不同的视图之间切换以查看 Kubernetes 上运行的容器和 Pod 的概览

有关使用清单页面的更多信息,请参阅 按资源类型查看基础设施指标。
在 指标资源管理器 页面上,你可以对正在监视的资源的指标进行分组和分析。

有关使用 指标资源管理器 页面的更多信息,请参阅 随时间推移探索基础设施指标。
在 全局搜索字段 中查找 Discover
。
从 数据视图 菜单中,选择 所有日志
。 从这里,你可以快速搜索和筛选你的日志数据,获取有关日志字段结构的信息,并在可视化中显示你的发现。 然后,你可以筛选你的日志数据并深入研究单个日志以查找和排除问题。 有关更多信息,请参阅
- 在 Discover 中探索日志,了解在 Discover 中查看日志的概述。
- 在 Discover 中筛选日志,了解有关在 Discover 中筛选日志的更多信息。
借助 Elastic 应用程序性能监视 (APM),快速诊断和排除应用程序性能问题。
想想延迟峰值 — APM 可以帮助你将调查范围缩小到单个服务。因为你还摄取并关联了日志和指标,所以你可以将问题链接到特定 Kubernetes Pod 的 CPU 和内存使用率或错误日志条目。
应用程序监视数据从 Kubernetes 中运行的应用程序流式传输到 APM,在那里对其进行验证、处理并转换为 Elasticsearch 文档。
在处理 Kubernetes 时,有许多方法可以部署 APM,但本指南假设你使用的是 Elastic Cloud 托管的部署。如果尚未执行此操作,请在 Elastic Cloud Console 中启用 APM。
如果你想自己管理 APM,还有一些替代方案
展开替代方案
- Elastic Cloud on Kubernetes (ECK) — Elastic 推荐的用于管理与 Kubernetes 一起部署的 APM Server 的方法。ECK 基于 Kubernetes Operator 模式构建,扩展了基本的 Kubernetes 编排功能,以支持在 Kubernetes 上设置和管理 APM Server。
- 将 APM Server 部署为 DaemonSet — 确保在集群中的每个节点上运行 APM Server 的一个实例。当节点中的所有 Pod 应共享单个 APM Server 实例时,此方法很有用。
- 将 APM Server 部署为 sidecar — 对于不应共享 APM Server 的环境,例如当将来自多个应用程序的跟踪定向到单独的 Elasticsearch 集群时。
- 下载并安装 APM Server — 经典的非 Kubernetes 选项。
一个 密钥令牌 用于保护 APM Agent 和 APM Server 之间的通信。要在 Kibana 中创建或更新你的密钥令牌,
- 在主菜单中找到 Fleet,或者使用 全局搜索字段。
- 在 Agent policies(Agent策略) 选项卡下,选择你想要配置的策略。
- 找到 Elastic APM 集成,然后选择 Actions(操作)→ Edit integration(编辑集成)。
- 导航到 Agent authorization(Agent授权)→ Secret token(密钥令牌),并设置你的令牌值。
- 单击 Save integration(保存集成)。APM Server 将在更改生效前重启。
为避免暴露密钥令牌,你可以将其存储在 Kubernetes Secret 中。例如
kubectl create secret generic apm-secret --from-literal=ELASTIC_APM_SECRET_TOKEN=asecretpassword --namespace=kube-system
- 在你将部署应用程序的同一命名空间中创建 Secret。
如果你自己管理 APM Server,请参阅 密钥令牌,获取有关如何设置密钥令牌的说明。
如果你使用 ECK 设置 APM Server,则操作员会自动为你生成一个 {{APM-server-name}}-apm-token
secret。
在大多数情况下,设置 APM Agent 从而检测你的应用程序就像安装一个库并添加几行代码一样简单。
选择你的应用程序的语言以获取详细信息
安装 Agent
为 Go 安装 APM Agent 包。
go get go.elastic.co/apm
检测你的应用程序
通过使用提供的检测模块之一或直接使用 tracer API 来检测你的 Go 应用程序。
import (
"net/http"
"go.elastic.co/apm/module/apmhttp"
)
func main() {
mux := http.NewServeMux()
...
http.ListenAndServe(":8080", apmhttp.Wrap(mux))
}
配置 Agent
使用环境变量配置 Agent
# ...
- 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: "service-name-goes-here"
- 默认为
http://localhost:8200
- 从先前创建的
apm-secret
密钥库中传入ELASTIC_APM_SECRET_TOKEN
- 允许的字符:a-z、A-Z、0-9、-、_ 和空格
在 Agent 参考中了解更多信息
附加 Agent
Java Agent 可以在不更改应用程序镜像或代码的情况下检测受支持的技术。为此,你需要一个基于官方 Elastic APM Docker 镜像的 init container。
在你的应用程序启动之前,将 Agent 从 init container 复制到共享卷中。例如,使用 Java Agent
# ...
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 Agent 镜像构建
initContainer
- 将 Agent 复制到共享卷
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
配置
配置 Agent
使用环境变量配置 Agent
# ...
- 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
- 默认为
http://localhost:8200
- 从先前创建的
apm-secret
密钥库中传入ELASTIC_APM_SECRET_TOKEN
- 允许的字符:a-z、A-Z、0-9、-、_ 和空格
- 用于确定堆栈跟踪帧是应用内帧还是库帧。
- 先前已解释
在 Agent 参考中了解更多信息
这些说明适用于 .NET Core v2.2+。所有其他用例都需要从 NuGet 下载 Agent 并将其添加到你的应用程序。有关完整详细信息,请参阅设置 Agent。Agent 设置完成后,跳转到此页面上的 配置 Agent 部分。
使用 init container 下载并提取 Agent
.Net Agent 会自动检测 .NET Core 2.2 及更高版本,无需任何应用程序代码更改。为此,你需要一个 init container,它会提取并解压缩最新的 Agent 版本
# ...
spec:
volumes:
- name: elastic-apm-agent
emptyDir: {}
initContainers:
- name: elastic-dotnet-agent
image: busybox
command: ["/bin/sh","-c"]
args:
- wget -qO './elastic-apm-agent/ElasticApmAgent.zip' https://github.com/elastic/apm-agent-dotnet/releases/download/1.7.0/ElasticApmAgent_1.7.0.zip;
cd elastic-apm-agent;
cat ElasticApmAgent.zip | busybox unzip -;
volumeMounts:
- mountPath: /elastic-apm-agent
name: elastic-apm-agent
- 共享卷。
- 运行 shell 并执行提供的
args
。 - 获取最新的
apm-agent-dotnet
版本并将其保存到elastic-apm-agent/ElasticApmAgent.zip
。然后cd
进入目录并解压缩该文件的内容。不要忘记使用你要使用的 Agent 版本更新此命令中的 GitHub URL。
要将 Agent 连接到你的应用程序,请将 DOTNET_STARTUP_HOOKS
环境变量指向现在位于 elastic-apm-agent
卷的 /elastic-apm-agent
目录中的 ElasticApmAgentStartupHook.dll
文件。
# ...
containers:
- name: your-app-container
volumeMounts:
- mountPath: /elastic-apm-agent
name: elastic-apm-agent
env:
# ...
- name: DOTNET_STARTUP_HOOKS
value: "/elastic-apm-agent/ElasticApmAgentStartupHook.dll"
配置 Agent
使用环境变量配置 Agent
# ...
- 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: DOTNET_STARTUP_HOOKS
value: "/elastic-apm-agent/ElasticApmAgentStartupHook.dll"
- 默认为
http://localhost:8200
- 从先前创建的
apm-secret
密钥库中传入ELASTIC_APM_SECRET_TOKEN
- 允许的字符:a-z、A-Z、0-9、-、_ 和空格
- 先前已解释,仅在使用无代码检测方法时才需要。
在 Agent 参考中了解更多信息
安装 APM Agent
将 Node.js 的 APM Agent 作为你应用程序的依赖项安装。
npm install elastic-apm-node --save
启动 Agent
重要的是,在你在 Node.js 应用程序中需要任何其他模块之前(在 express
、http
等之前)启动 Agent。
var apm = require('elastic-apm-node').start()
配置 Agent
使用环境变量配置 Agent
# ...
- 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: "service-name-goes-here"
- 默认为
http://localhost:8200
- 从先前创建的
apm-secret
密钥库中传入ELASTIC_APM_SECRET_TOKEN
- 如果未指定,则默认为 package.json 中的“name”字段。允许的字符:a-z、A-Z、0-9、-、_ 和空格
在 Agent 参考中了解更多信息
安装 Agent
使用 已发布的包之一安装 PHP Agent。
要使用 RPM 包(RHEL/CentOS 和 Fedora)
rpm -ivh <package-file>.rpm
要使用 DEB 包(Debian 和 Ubuntu)
dpkg -i <package-file>.deb
要使用 APK 包(Alpine)
apk add --allow-untrusted <package-file>.apk
如果你找不到你的发行版,你可以通过从源代码构建来安装 Agent。
配置 Agent
使用环境变量配置 Agent
# ...
- 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: "service-name-goes-here"
- 默认为
http://localhost:8200
- 从先前创建的
apm-secret
密钥库中传入ELASTIC_APM_SECRET_TOKEN
- 允许的字符:a-z、A-Z、0-9、-、_ 和空格
在 Agent 参考中了解更多信息
安装 APM Agent
将 Python 的 APM Agent 作为依赖项安装
# Django
pip install elastic-apm
# Flask
pip install elastic-apm[flask]
将 Agent 添加到你的应用程序
对于 Django,将 elasticapm.contrib.django
添加到你的设置中的 INSTALLED_APPS
INSTALLED_APPS = (
# ...
'elasticapm.contrib.django',
)
对于 Flask,使用环境变量初始化你的应用程序的 Agent
from elasticapm.contrib.flask import ElasticAPM
app = Flask(__name__)
apm = ElasticAPM(app)
配置 Agent
使用环境变量配置 Agent
# ...
- 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: "service-name-goes-here"
- 默认为
http://localhost:8200
- 从先前创建的
apm-secret
密钥库中传入ELASTIC_APM_SECRET_TOKEN
- 允许的字符:a-z、A-Z、0-9、-、_ 和空格
在 Agent 参考中了解更多信息
安装 APM Agent
将 Agent 添加到你的 Gemfile。
gem 'elastic-apm'
启动 Agent
Rails:当你的应用程序启动时,APM 将自动启动。
Rack:包含中间件并启动和停止 Elastic APM
# config.ru
app = lambda do |env|
[200, {'Content-Type' => 'text/plain'}, ['ok']]
end
# Wraps all requests in transactions and reports exceptions
use ElasticAPM::Middleware
# Start an instance of the Agent
ElasticAPM.start()
run app
# Gracefully stop the agent when process exits.
# Makes sure any pending transactions have already sent.
at_exit { ElasticAPM.stop }
配置 Agent
使用环境变量配置 Agent
# ...
- 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: "service-name-goes-here"
- 默认为
http://localhost:8200
- 从先前创建的
apm-secret
密钥库中传入ELASTIC_APM_SECRET_TOKEN
- 允许的字符:a-z、A-Z、0-9、-、_ 和空格
在 Agent 参考中了解更多信息
在大多数情况下,APM Agent 会自动从容器内部读取 Kubernetes 数据并将其发送到 APM Server。如果不是这种情况,或者你希望覆盖此数据,你可以为 Agent 设置环境变量以进行读取。这些环境变量通过 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 |
APM Agent 与你的应用程序一起部署。
资源配置文件示例
基于先前步骤的完整资源配置文件。
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
应用程序跟踪数据在 Service Inventory(服务清单) 中可用。要打开 Service Inventory(服务清单),请在主菜单中找到 Applications(应用程序),或者使用 全局搜索字段。
Applications(应用程序) 应用程序允许你实时监控你的软件服务和应用程序:可视化你的服务的详细性能信息,识别和分析错误,并监控主机级别和 Agent 特定的指标,如 JVM 和 Go 运行时指标。

只需点击几下即可访问应用程序级别的见解,可以大大减少你花费在调试错误、响应时间慢和崩溃上的时间。
最重要的是,由于 Kubernetes 环境变量已映射到 APM 元数据事件,因此你可以按 Kubernetes namespace
、node.name
、pod.name
和 pod.uid
过滤你的跟踪数据。

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