教程:观察您的 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 提供了以下组件
- 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 集成添加到您的策略,并配置您要收集的指标和日志。
步骤 1:将 Kubernetes 集成添加到您的部署
编辑按照以下步骤将 Kubernetes 集成添加到您的策略
- 在主菜单中找到 集成 或使用 全局搜索字段。
- 在搜索栏中输入“Kubernetes”,然后选择 Kubernetes 集成。
- 单击 Kubernetes 集成页面顶部的 添加 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 服务器的地址。 |
周期 |
轮询 kubelet API 获取指标的频率。默认值为每 10 秒。 |
SSL 验证模式 |
指定如何处理 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 的效率和稳定性。有关更多信息,请参阅 |
CronJob 指标 |
监控 CronJob 性能并确保它们可靠高效地运行。有关更多信息,请参阅 |
Kubernetes DaemonSet 指标 |
监控 DaemonSet 运行状况和分布。有关更多信息,请参阅 |
Kubernetes Deployment 指标 |
监控 Deployment 状态和配置。有关更多信息,请参阅 |
Kubernetes Job 指标 |
监控 Job 完成状态和执行情况。有关更多信息,请参阅 |
Kubernetes 命名空间指标 |
监控命名空间的活动和终止状态。有关更多信息,请参阅 |
Kubernetes 节点指标 |
监控节点运行状况和资源使用情况。有关更多信息,请参阅 |
Kubernetes PersistentVolume 指标 |
监控 PersistentVolume 大小、状态和存储配置。有关更多信息,请参阅 |
Kubernetes PersistentVolumeClaim 指标 |
监控 PersistentVolumeClaim 阶段、类和存储请求。有关更多信息,请参阅 |
Kubernetes Pod 指标 |
监控 Pod 运行状况和性能。有关更多信息,请参阅 |
Kubernetes ReplicaSet 指标 |
监控 ReplicaSet 状态和 ReplicaSet 中副本的数量。有关更多信息,请参阅 |
Kubernetes ResourceQuota 指标 |
监控资源限制和当前使用情况。有关更多信息,请参阅 |
Kubernetes Service 指标 |
监控服务配置、可访问性和网络集成。有关更多信息,请参阅 |
Kubernetes StatefulSet 指标 |
监控 StatefulSet 配置、状态和伸缩。有关更多信息,请参阅 |
Kubernetes StorageClass 指标 |
监控存储如何配置和分配。有关更多信息,请参阅 |
配置 kube-state-metrics
选项
编辑为每个 kube-state-metrics
选项提供以下信息
添加元数据 |
此选项向事件添加元数据。元数据对于分组和探索相关数据很有价值。默认情况下启用此选项。 |
主机 |
|
领导者选举 |
启用此选项(默认行为)后,只有持有领导者锁的 Elastic Agent 才会从 |
周期 |
轮询 |
配置 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
指标
持有者令牌文件 |
用于向 |
主机 |
集成连接到的 Kubernetes API 服务器的地址。它使用 |
领导者选举 |
启用此选项(默认行为)后,只有持有领导者锁的 Elastic Agent 才会从 |
周期 |
轮询 |
SSL 证书颁发机构 |
用于验证 Kubernetes API 服务器 TLS 证书的证书颁发机构 (CA) 捆绑包的路径。 |
从 Kubernetes 代理收集 Kubernetes 指标
编辑kube-proxy
在每个节点上运行并维护网络规则。默认情况下,启用从 kube-proxy
收集指标。这些指标提供了有关代理的网络活动、性能和资源使用情况的见解。
有关收集的指标的更多信息,请参阅 kube-proxy
指标。
配置 Kubernetes 代理选项
编辑提供以下信息以收集 Kubernetes 代理指标
主机 |
|
周期 |
轮询 |
从 Kubernetes 调度器收集 Kubernetes 指标
编辑kube-scheduler 将未分配节点的新的 Pod 分配到最合适的节点。启用此选项可从 kube-scheduler 获取指标。这些指标提供了有关 kube-scheduler
的性能、资源使用情况和运行状况的见解。
有关收集的指标的更多信息,请参阅 kube-scheduler
指标。
配置 Kubernetes 调度器选项
编辑提供以下信息以收集 Kubernetes 调度器指标
持有者令牌文件 |
用于向 |
主机 |
Elastic 集成应从中收集指标的 |
周期 |
轮询 |
SSL 验证模式 |
指定如何处理 SSL 验证。默认为 |
从 Kubernetes 控制器管理器收集 Kubernetes 指标
编辑kube-controller-manager
调节集群的状态。启用此选项可从 kube-controller-manager
获取指标。这些指标提供了有关 kube-controller-manager 的性能、资源使用情况和运行状况的见解。
有关收集的指标的更多信息,请参阅 kube-controller-manager
指标。
配置 Kubernetes 控制器管理器选项
编辑提供以下信息以收集 kube-controller-manager
指标
持有者令牌文件 |
用于向 |
主机 |
集成应从中收集指标的 |
周期 |
轮询 |
SSL 验证模式 |
指定如何处理 SSL 验证。默认为 |
从 Kubernetes API 服务器收集 Kubernetes 事件
编辑事件指标为您提供了集群中正在发生的情况的整体视图。这些指标可帮助您了解集群中正在发生的情况并提高可靠性和稳定性。默认情况下,启用从 Kubernetes API 服务器收集 Kubernetes 事件。
有关收集的指标的更多信息,请参阅 事件指标。
配置来自 Kubernetes API 服务器的事件
编辑提供以下信息以收集 Kubernetes 事件指标
周期 |
轮询 |
添加元数据 |
启用此选项可向事件添加元数据。元数据对于分组和探索相关数据非常有价值。 |
跳过较旧的事件 |
忽略在特定时间之前发生的事件 |
领导者选举 |
启用此选项(默认行为)后,只有持有领导者锁的 Elastic Agent 才会从 |
收集 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
编辑配置完集成后,您需要下载并更新清单。首先,通过完成以下步骤下载清单
- 在添加 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 部分:浏览日志和指标
编辑使用 Kibana 查看 Elastic Agent 收集的指标和日志数据。有关查看数据的更多信息,请参阅以下部分。
查看性能和健康指标
编辑要查看 Elastic Agent 收集的性能和健康指标,请在主菜单中查找基础设施或使用全局搜索字段。
在基础设施清单页面上,您可以在不同视图之间切换,以查看 Kubernetes 上运行的容器和 Pod 的概述
有关使用“清单”页面的更多信息,请参阅按资源类型查看基础设施指标。
在指标浏览器页面上,您可以对您正在监控的资源的指标进行分组和分析。
有关使用指标浏览器页面的更多信息,请参阅随时间推移浏览基础设施指标。
查看 Kubernetes 日志
编辑在全局搜索字段中查找日志浏览器
。
借助日志浏览器,您可以快速搜索和筛选日志数据,获取有关日志字段结构的信息,并在可视化中显示您的发现。
在日志浏览器中,您可以从数据选择器中选择 Kubernetes 集成以查看您的 Kubernetes 数据。
在这里,您可以筛选日志数据并深入研究各个日志以查找和排除问题。有关更多信息,请参阅
- 日志浏览器,了解日志浏览器的概述。
- 在日志浏览器中筛选日志,了解有关在日志浏览器中筛选日志的更多信息。
第 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 中创建或更新您的密钥令牌
- 在主菜单中查找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 代理
编辑在大多数情况下,设置 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 下载代理并将其添加到您的应用程序中。有关完整详细信息,请参阅设置代理。代理设置完成后,请跳转到此页面上的配置代理部分。
使用 init 容器下载并提取代理
.Net 代理会自动检测 .NET Core 2.2 及更高版本,无需任何应用程序代码更改。为此,您需要一个init 容器,该容器会拉取并解压缩最新的代理版本。
# ... 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 代理
将 Node.js 的 APM 代理作为依赖项安装到您的应用程序中。
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" 字段。允许的字符: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 代理
将 Python 的 APM 代理作为依赖项安装
# 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 数据
编辑在大多数情况下,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 元数据事件字段
环境变量 | 元数据字段名称 |
---|---|
|
system.kubernetes.node.name |
|
system.kubernetes.pod.name |
|
system.kubernetes.namespace |
|
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 运行时指标。
只需点击几下即可访问应用程序级别的见解,可以大大减少您在调试错误、响应时间缓慢和崩溃上花费的时间。
最重要的是,由于 Kubernetes 环境变量已映射到 APM 元数据事件,您可以按 Kubernetes namespace
、node.name
、pod.name
和 pod.uid
过滤您的跟踪数据。
下一步是什么
编辑- 想要保护您的端点免受安全威胁?试试Elastic Security。添加端点保护只是您添加到代理策略的另一个集成!
- 盯着一堵屏幕墙看得眼睛发花了?创建警报,并在您在池畔啜饮您最喜欢的饮料时了解问题。
- 想让 Elastic 完成繁重的工作吗?使用机器学习来检测异常。