监控 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 提供以下组件
- Elastic Agent 是一种统一的方式,可以为您的主机添加日志和指标等数据的监控。
- Elastic Agent Kubernetes 集成与 Elastic Agent 协同工作,从 Kubernetes 集群收集日志和指标。
- APM(稍后介绍)用于监控、检测和诊断复杂的应用程序性能问题。
- Elasticsearch 用于存储和搜索您的数据。
- Kibana 中的可观测性应用程序用于可视化和管理您的可观测性数据。
Elastic Agent 的默认安装部署到 Kubernetes 作为 DaemonSet,以确保在集群的每个节点上运行一个实例。它从 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 文档。
第 1 部分:添加和配置 Kubernetes 集成编辑
要开始从您的 Kubernetes 集群收集日志和指标,首先将 Kubernetes 集成 添加到您的策略,并配置您要收集的指标和日志。
步骤 1:将 Kubernetes 集成添加到您的部署编辑
按照以下步骤将 Kubernetes 集成添加到您的策略
- 从部署的主页选择 添加集成。
- 在搜索栏中输入“Kubernetes”,然后选择 Kubernetes 集成。
- 单击 Kubernetes 集成页面顶部的 添加 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 服务器的地址,用于收集指标。 |
周期 |
轮询 kubelet API 以获取指标的频率。默认值为每 10 秒一次。 |
SSL 验证模式 |
指定如何处理 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 的效率和稳定性。在 |
CronJob 指标 |
监控 CronJob 性能并确保它们可靠且高效地运行。在 |
Kubernetes DaemonSet 指标 |
监控 DaemonSet 的运行状况和分布。在 |
Kubernetes Deployment 指标 |
监控部署状态和配置。在 |
Kubernetes Job 指标 |
监控作业完成状态和执行情况。在 |
Kubernetes 命名空间指标 |
监控命名空间的活动和终止状态。在 |
Kubernetes 节点指标 |
监控节点运行状况和资源使用情况。在 |
Kubernetes 持久卷指标 |
监控持久卷的大小、状态和存储配置。在 |
Kubernetes 持久卷声明指标 |
监控持久卷声明的阶段、类和存储请求。在 |
Kubernetes Pod 指标 |
监控 Pod 的运行状况和性能。在 |
Kubernetes ReplicaSet 指标 |
监控 ReplicaSet 的状态和 ReplicaSet 中的副本数量。在 |
Kubernetes 资源配额指标 |
监控资源限制和当前使用情况。在 |
Kubernetes 服务指标 |
监控服务配置、可访问性和网络集成。在 |
Kubernetes StatefulSet 指标 |
监控 StatefulSet 的配置、状态和扩展。在 |
Kubernetes 存储类指标 |
监控存储的配置和分配方式。在 |
配置 kube-state-metrics
选项edit
为每个 kube-state-metrics
选项提供以下信息
添加元数据 |
此选项将元数据添加到事件中。元数据对于对相关数据进行分组和探索非常有价值。此选项默认情况下处于启用状态。 |
主机 |
|
领导者选举 |
启用时(默认行为),只有持有领导者锁的 Elastic Agent 才会从 |
周期 |
轮询 |
配置 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 令牌文件 |
用于向 |
主机 |
集成连接到的 Kubernetes API 服务器的地址。它使用 |
领导者选举 |
启用时(默认行为),只有持有领导者锁的 Elastic Agent 才会从 |
周期 |
轮询 |
SSL 证书颁发机构 |
用于验证 Kubernetes API 服务器的 TLS 证书的证书颁发机构 (CA) 捆绑包的路径。 |
从 Kubernetes 代理收集 Kubernetes 指标edit
kube-proxy
在每个节点上运行并维护网络规则。从 kube-proxy
收集指标默认情况下处于启用状态。这些指标提供了有关代理网络活动、性能和资源使用情况的洞察。
有关收集的指标的更多信息,请参阅 kube-proxy
指标。
配置 Kubernetes 代理选项edit
提供以下信息以收集 Kubernetes 代理指标
主机 |
|
周期 |
轮询 |
从 Kubernetes 调度程序收集 Kubernetes 指标edit
kube-scheduler 将没有节点分配的新 Pod 分配到最合适的节点。启用此选项以从 kube-scheduler 获取指标。这些指标提供了有关 kube-scheduler 性能、资源使用情况和运行状况的洞察。
有关收集的指标的更多信息,请参阅 kube-scheduler
指标。
配置 Kubernetes 调度程序选项edit
提供以下信息以收集 Kubernetes 调度程序指标
Bearer 令牌文件 |
用于向 |
主机 |
Elastic 集成应从中收集指标的 |
周期 |
轮询 |
SSL 验证模式 |
指定如何处理 SSL 验证。默认值为 |
从 Kubernetes 控制器管理器收集 Kubernetes 指标edit
kube-controller-manager
规范集群的状态。启用此选项以从 kube-controller-manager
获取指标。这些指标提供了有关 kube-controller-manager 性能、资源使用情况和运行状况的洞察。
有关收集的指标的更多信息,请参阅kube-controller-manager
指标。
配置 Kubernetes 控制器管理器选项edit
提供以下信息以收集 kube-controller-manager
指标
Bearer 令牌文件 |
用于向 |
主机 |
集成应从中收集指标的 |
周期 |
轮询 |
SSL 验证模式 |
指定如何处理 SSL 验证。默认值为 |
从 Kubernetes API 服务器收集 Kubernetes 事件edit
事件指标为您提供了集群中发生情况的总体视图。这些指标有助于您了解集群中发生的情况,并提高可靠性和稳定性。默认情况下,从 Kubernetes API 服务器收集 Kubernetes 事件处于启用状态。
有关收集的指标的更多信息,请参阅事件指标。
配置来自 Kubernetes API 服务器的事件edit
提供以下信息以收集 Kubernetes 事件指标
周期 |
轮询 |
添加元数据 |
启用以向事件添加元数据。元数据对于对相关数据进行分组和探索非常有价值。 |
跳过较旧的事件 |
忽略在特定时间之前发生的事件 |
领导者选举 |
启用时(默认行为),只有持有领导者锁的 Elastic Agent 才会从 |
收集 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
配置完集成后,您需要下载并更新清单。首先,通过完成以下步骤下载清单
- 在 添加 Kubernetes 集成 页面底部,单击 保存并继续。
- 单击 将 Elastic Agent 添加到您的主机。
-
在 加入 Fleet? 下,选择 独立运行。
- 在 配置代理 下,选择 下载清单。
下载清单后,打开它并在 DaemonSet 中更新 ES_USERNAME
和 ES_PASSWORD
环境变量,使其与您的 Elasticsearch 凭据匹配。
您还可以进一步修改清单以满足您的需求。例如,您可能希望启用自动发现以自动发现容器日志。有关在清单中启用自动发现的更多信息,请参阅 Fleet 指南中的自动发现文档。
准备部署 Elastic Agent 后
-
从您下载清单的目录中,运行以下应用命令
kubectl apply -f elastic-agent-standalone-kubernetes.yml
-
使用以下命令检查 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 的概述
有关使用清单页面的更多信息,请参阅按资源类型查看基础设施指标。
在 指标资源管理器 页面上,您可以对正在监控的资源的指标进行分组和分析。
有关使用 指标资源管理器 页面的更多信息,请参阅随时间推移探索基础设施指标。
查看日志edit
要查看 Kubernetes 日志,请打开 Kibana 并转到 可观察性 → 日志资源管理器。使用 日志资源管理器,您可以快速搜索和过滤日志数据,获取有关日志字段结构的信息,并将您的发现显示在可视化中。
从 日志资源管理器 中,您可以从数据选择器中选择 Kubernetes 集成以查看您的 Kubernetes 数据。
从这里,您可以过滤日志数据并深入研究单个日志以查找和解决问题。有关更多信息,请参阅
- 日志资源管理器,了解日志资源管理器的概述。
- 在日志资源管理器中过滤日志,了解在日志资源管理器中过滤日志的更多信息。
第 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 中创建或更新您的秘密令牌
- 打开 Kibana 并导航到 Fleet。
- 在 代理策略 选项卡下,选择您要配置的策略。
- 找到 Elastic APM 集成并选择 操作 → 编辑集成。
- 导航到 代理授权 → 秘密令牌 并设置令牌的值。
- 单击保存集成。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 代理并因此检测您的应用程序就像安装一个库并添加几行代码一样简单。
选择您的应用程序的语言以获取详细信息
安装代理
安装 Go 的 APM 代理包。
go get go.elastic.co/apm
检测您的应用程序
使用提供的检测模块或直接使用跟踪器 API 检测您的 Go 应用程序。
import ( "net/http" "go.elastic.co/apm/module/apmhttp" ) func main() { mux := http.NewServeMux() ... http.ListenAndServe(":8080", apmhttp.Wrap(mux)) }
配置代理
使用环境变量配置代理
# ... - 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"
默认值为 |
|
从之前创建的 |
|
允许的字符:a-z、A-Z、0-9、-、_ 和空格 |
在代理参考中了解更多信息
附加代理
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']
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
配置代理
使用环境变量配置代理
# ... - 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
默认值为 |
|
从之前创建的 |
|
允许的字符:a-z、A-Z、0-9、-、_ 和空格 |
|
用于确定堆栈跟踪帧是应用程序内帧还是库帧。 |
|
之前已解释 |
在代理参考中了解更多信息
这些说明适用于 .NET Core v2.2+。所有其他用例都需要从 NuGet 下载代理并将其添加到您的应用程序中。有关完整详细信息,请参阅 设置代理。代理设置完成后,请跳转到本页面的 配置代理 部分。
使用初始化容器下载并解压缩代理
.Net 代理会自动检测 .NET Core 版本 2.2 及更高版本,无需任何应用程序代码更改。为此,您需要一个 初始化容器,该容器会拉取并解压缩最新的代理版本
# ... 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 并执行提供的 |
|
获取最新的 |
要将代理连接到您的应用程序,请将 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"
配置代理
使用环境变量配置代理
# ... - 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"
默认值为 |
|
从之前创建的 |
|
允许的字符:a-z、A-Z、0-9、-、_ 和空格 |
|
之前已解释,仅在使用无代码检测方法时才需要。 |
在代理参考中了解更多信息
安装 APM 代理
将 APM 代理作为 Node.js 应用程序的依赖项安装。
npm install elastic-apm-node --save
启动代理
在您需要 Node.js 应用程序中的任何其他模块(在 express
、http
等之前)之前启动代理非常重要。
var apm = require('elastic-apm-node').start()
配置代理
使用环境变量配置代理
# ... - 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"
默认值为 |
|
从之前创建的 |
|
默认情况下为 package.json 中的“name”字段,如果未指定,则为“name”字段。允许的字符:a-z、A-Z、0-9、-、_ 和空格 |
在代理参考中了解更多信息
安装代理
使用 已发布的软件包 之一安装 PHP 代理。
要使用 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
如果您找不到您的发行版,您可以通过 从源代码构建 来安装代理。
配置代理
使用环境变量配置代理
# ... - 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"
默认值为 |
|
从之前创建的 |
|
允许的字符:a-z、A-Z、0-9、-、_ 和空格 |
在代理参考中了解更多信息
安装 APM 代理
将 APM 代理作为 Python 的依赖项安装
# Django pip install elastic-apm # Flask pip install elastic-apm[flask]
将代理添加到您的应用程序
对于 Django,将 elasticapm.contrib.django
添加到设置中的 INSTALLED_APPS
INSTALLED_APPS = ( # ... 'elasticapm.contrib.django', )
对于 Flask,使用环境变量为您的应用程序初始化代理
from elasticapm.contrib.flask import ElasticAPM app = Flask(__name__) apm = ElasticAPM(app)
配置代理
使用环境变量配置代理
# ... - 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"
默认值为 |
|
从之前创建的 |
|
允许的字符:a-z、A-Z、0-9、-、_ 和空格 |
在代理参考中了解更多信息
安装 APM 代理
将代理添加到您的 Gemfile 中。
gem 'elastic-apm'
启动代理
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 }
配置代理
使用环境变量配置代理
# ... - 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"
默认值为 |
|
从之前创建的 |
|
允许的字符: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 元数据事件字段
环境变量 | 元数据字段名称 |
---|---|
|
system.kubernetes.node.name |
|
system.kubernetes.pod.name |
|
system.kubernetes.namespace |
|
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 运行时指标)。
只需点击几下即可访问应用程序级洞察,这可以大幅减少您花费在调试错误、缓慢响应时间和崩溃上的时间。
最棒的是,由于 Kubernetes 环境变量已映射到 APM 元数据事件,因此您可以按 Kubernetes namespace
、node.name
、pod.name
和 pod.uid
筛选跟踪数据。
下一步edit
- 想要保护您的端点免受安全威胁?试试 Elastic Security。添加端点保护只是您添加到代理策略中的另一个集成!
- 您的眼睛是否因为盯着屏幕而变得模糊?创建警报,并在您在泳池边啜饮您最喜欢的饮料时了解问题。
- 想要 Elastic 来完成繁重的工作?使用机器学习来 检测异常。