Cryostat 入门
摘要
前言
Red Hat build of Cryostat 是 JDK Flight Recorder (JFR)的一个容器原生实现,可用于安全地监控在 OpenShift Container Platform 集群上运行的工作负载中的 Java 虚拟机(JVM)性能。您可以使用 Cryostat 2.4 使用 web 控制台或 HTTP API 启动、停止、检索、存档、导入和导出容器化应用程序中 JVM 的 JFR 数据。
根据您的用例,您可以使用 Cryostat 提供的内置工具直接在 Red Hat OpenShift 集群上存储和分析记录,或者您可以将记录导出到外部监控应用程序,以对记录的数据进行更深入的分析。
红帽构建的 Cryostat 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
使开源包含更多
红帽承诺替换我们的代码、文档和网页属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。详情请查看 CTO Chris Wright 的信息。
第 1 章 Cryostat 概述
Cryostat 是一个基于 JDK Flight Recorder (JFR)的容器原生虚拟化 Java 应用程序,可用于监控在 Red Hat OpenShift 集群上运行的容器化工作负载的 Java 虚拟机(JVM)性能。
您可以在托管容器化 Java 应用程序的 Red Hat OpenShift 项目中部署 Cryostat。您可以创建与用来运行容器化工作负载的 JVM 实例对应的 JVM 目标。您可以将 Cryostat 连接到 JVM 目标,以记录和分析有关堆和非堆内存用量、线程计数、垃圾回收和其他每个 JVM 目标的性能指标的数据。
您可以使用 Cryostat 中包含的工具实时监控 JVM 的性能,捕获 JDK Flight Recorder (JFR)记录和快照,生成自动化分析报告,并使用 Grafana 仪表板视觉化您的记录的性能数据。
Cryostat Web 控制台和 HTTP API 提供了分析容器内 JVM 性能数据的方法,而无需依赖外部监控应用程序。但是,当您需要在集群环境外对数据进行更深入分析时,您还可以将您的记录从 Cryostat 导出到 JDK Mission Control (JMC)的外部实例中。
Cryostat 支持基于角色的访问控制(RBAC),作为 OpenShift Container Platform 的标准功能。您可以为每个用户角色配置不同的授权级别,以确保 Flight Recording 数据的隐私和完整性。
您可以使用 Operator Lifecycle Manager (OLM)在 Red Hat OpenShift 项目中安装 Cryostat。
您还可以从红帽生态系统目录下载最新的 Cryostat 组件镜像。Red Hat Ecosystem Catalog 上对 Cryostat 2.4 存在以下容器镜像:
- Cryostat
- Red Hat build of Cryostat Operator
- Red Hat build of Cryostat Operator 捆绑包
- Cryostat 报告
- Cryostat Grafana 仪表板
- JFR 数据源
第 2 章 使用 Red Hat build of Cryostat Operator 在 Red Hat OpenShift 上安装 Cryostat
您可以使用 Operator Lifecycle Manager (OLM)在 Red Hat OpenShift 集群的项目中安装 Red Hat build of Cryostat Operator。您可以使用 Red Hat build of Cryostat Operator 创建单个命名空间或多命名空间 Cryostat 实例。您可以使用 Red Hat OpenShift Web 控制台访问的 GUI 控制这些实例。
如果需要将 Red Hat build of Cryostat Operator 订阅从 Cryostat 2.0 升级到 Cryostat 2.4,您必须将更新频道从 stable-2.0
改为 stable
。
前提条件
- 创建 OpenShift Container Platform 4.11 或更高版本的集群。
- 创建一个 Red Hat OpenShift 用户帐户,它有权在项目中安装 Red Hat build of Cryostat Operator。
- 在集群中安装了 Operator Lifecycle Manager (OLM)。
使用 Red Hat OpenShift 的 cert-manager Operator 安装 cert-manager Operator。
- 如果使用 OpenShift Container Platform 4.11 或更高版本,您可以为 Red Hat OpenShift 安装 cert-manager Operator。如需更多信息,请参阅 Red Hat OpenShift (OpenShift Container Platform)的 cert-manager Operator。
- 使用 Red Hat OpenShift Web 控制台登录到 Red Hat OpenShift。
流程
- 在浏览器中,使用 Web 控制台进入到 Home > Projects。
- 选择您要在其中安装 Red Hat build of Cryostat Operator 的项目的名称。
安装 Red Hat build of Cryostat Operator:
- 在 Web 控制台的导航菜单中导航到 Operators > OperatorHub。
- 从列表中选择 Red Hat build of Cryostat Operator。您可以使用屏幕右上角的搜索框来查找 Red Hat build of Cryostat Operator。
要在项目中安装 Red Hat build of Cryostat Operator,请点 Install。
Red Hat OpenShift Web 控制台提示您创建 Cryostat 自定义资源(CR)。
注意如果您要安装为多个命名空间启用的 Cryostat 实例,请在 安装模式 中点击 All namespaces on the cluster (default) 单选按钮。
您可以手动或自动创建 CR。如果要手动创建 CR,请参阅第 4 步。如果要自动创建 CR,请参阅第 5 步。
如果要手动创建 CR,请完成以下步骤:
使用 Web 控制台进入到 Operators > Installed Operators,然后从已安装的 Operator 列表中选择 Red Hat build of Cryostat Operator :
图 2.1. 在安装的 operator 列表中查看 Red Hat build of Cryostat operator
- 点 Details 标签页。
要创建单命名空间 Cryostat 实例,请转至 Provided APIs 部分。然后,在 Cryostat 下,单击 Create instance。
注意如果要创建为多个命名空间启用的 Cryostat 实例,请在 Provided APIs 部分中选择 Cluster Cryostat 并点 Create instance。Cluster Cryostat API 具有控制 Cryostat 应用程序的部署及其相关组件的配置选项。如需更多信息,请参阅 在多个命名空间中创建 Cryostat。
图 2.2. 选择由 Red Hat build of Cryostat Operator 提供的 Cryostat API
- 点 Form view 单选按钮或 YAML view 单选按钮。如果要在 YAML 配置文件中输入您的信息,点 YAML 视图。
- 为您要创建的 Cryostat 实例指定一个名称。
可选: 在 Labels 字段中,为您要部署的 Operand 工作负载指定一个标签或注解。
您还可以为部署指定附加配置选项:
图 2.3. 使用 web 控制台中的表单创建 Cryostat 实例
另外,您可以使用 YAML 模板来创建实例并指定额外的配置选项,而不是使用表单:
图 2.4. 通过在 web 控制台中使用 YAML 模板创建 Cryostat 实例
如果要使用自动提示选项创建 CR,请按照提示的说明操作,然后完成以下步骤:
- 点 Form view 单选按钮或 YAML view 单选按钮。如果要在 YAML 配置文件中输入您的信息,点 YAML 视图。
- 为您要创建的 Cryostat 实例指定一个名称。
可选: 在 Labels 字段中,为您要部署的 Operand 工作负载指定一个标签或注解。
您还可以为部署指定附加配置选项:
图 2.5. 使用 web 控制台中的表单创建 Cryostat 实例
另外,您可以使用 YAML 模板来创建实例并指定额外的配置选项,而不是使用表单:
图 2.6. 通过在 web 控制台中使用 YAML 模板创建 Cryostat 实例
要为 Cryostat 实例启动创建过程,请点击 Create。
您必须等待 Cryostat 实例的所有资源就绪,然后才能访问它。
验证
- 在 Web 控制台的导航菜单中点 Operators,然后点 Installed Operators。
- 在安装的 Operator 表中,选择 Red Hat build of Cryostat Operator。
选择 Cryostat 选项卡。
您的 Cryostat 实例在实例表中打开,并列出以下条件:
-
TLSSetupComplete
设置为true
。 -
MainDeploymentAvailable
设置为true
。 可选:如果您启用了报告生成器服务,则会显示
ReportsDeploymentAvailable
并设置为true
。图 2.7. 在 OpenShift 上的 Status 列下将 condition 设置为 True 的条件示例
-
可选: 从 Cryostat 表中选择您的 Cryostat 实例。进入 Cryostat Conditions 表,您可以在其中查看每个条件的更多信息。
图 2.8. 列出每个条件及其条件的 Cryostat Conditions 表示例
2.1. 在多个命名空间中创建 Cryostat
Red Hat build of Cryostat Operator 提供了 Cluster Cryostat API,您可以使用它来创建多个命名空间中的 Cryostat 实例。
前提条件
- 创建 OpenShift Container Platform 4.11 或更高版本的集群。
- 创建一个 Red Hat OpenShift 用户帐户,它有权在项目中安装 Red Hat build of Cryostat Operator。
- 在集群上安装了 Operator Lifecycle Manager (OLM)。
使用 Red Hat OpenShift 的 cert-manager Operator 安装 cert-manager。
- 如果使用 OpenShift Container Platform 4.11 或更高版本,您可以为 Red Hat OpenShift.For 安装 cert-manager Operator。如需更多信息,请参阅 Red Hat OpenShift (OpenShift Container Platform)的 cert-manager Operator。
- 使用 Red Hat OpenShift Web 控制台登录到 Red Hat OpenShift。
流程
- 在浏览器中,使用 Web 控制台进入到 Home > Projects。
- 选择您要安装 Red Hat build of Cryostat Operator 的项目的名称。
安装 Red Hat build of Cryostat Operator。
Red Hat OpenShift Web 控制台提示您创建 Cryostat 自定义资源(CR)。
要创建 CR,请完成以下步骤:
使用 Web 控制台进入到 Operators > Installed Operators,然后从已安装的 Operator 列表中选择 Red Hat build of Cryostat Operator :
图 2.9. 在安装的 Operator 列表中查看 Red Hat build of Cryostat Operator
- 点 Details 标签页。
要创建 Cryostat 的多命名空间实例,请转至 Provided APIs 部分。然后,在 Cluster Cryostat 下,点 Create instance。
图 2.10. 选择由 Red Hat build of Cryostat Operator 提供的 Cluster Cryostat API
- 点 Form view 单选按钮或 YAML view 单选按钮。如果要在 YAML 配置文件中输入您的信息,点 YAML 视图。
为您要创建的 Cluster Cryostat 实例指定唯一名称。
注意确保您为 Cluster Cryostat 实例指定的名称是唯一的,且不会与 Cluster Cryostat 实例的 install 命名空间或目标命名空间中创建的任何单一命名空间 Cryostat 实例的名称冲突。
可选: 在 Labels 字段中,为您要部署的 Operand 工作负载指定一个标签或注解。
您还可以为部署指定附加配置选项:
图 2.11. 使用 web 控制台中的表单创建 Cluster Cryostat 实例
在 Install Namespace 字段中,选择要安装此 Cryostat 实例的命名空间。
提示与 Cryostat 应用程序相比,Red Hat build of Cryostat Operator 使用了更大的权限,而 Cryostat 可能具有比目标工作负载更多的权限。因此,为了获得最佳安全性,将 Cryostat 实例安装到与安装 Cryostat Operator Operator 的 Red Hat build of Cryostat Operator 的不同命名空间中,并从您的目标工作负载所在的位置。
在 Target Namespaces 字段中,选择您要允许此 Cryostat 实例访问和使用的工作负载的命名空间。另外,您可以选择安装 Cryostat 的同一命名空间,也可以选择不同的命名空间。要添加额外命名空间,请点击 +Add Target Namespace。
重要可以访问 Cryostat 实例的用户可以访问对该 Cryostat 实例可见的任何命名空间中的所有目标应用程序。因此,当部署多命名空间 Cryostat 实例时,您必须考虑要选择要监控的命名空间、要将 Cryostat 安装到的命名空间,以及您要授予访问权限的用户。
另外,您可以使用 YAML 模板来创建实例并指定额外的配置选项,而不是使用表单:
图 2.12. 使用 web 控制台中的 YAML 模板创建 Cluster Cryostat 实例
点 Create 为您的 Cryostat 多命名空间实例启动创建过程。
您必须等待 Cluster Cryostat 实例的所有资源就绪,然后才能访问该实例。
验证
- 在 Web 控制台的导航菜单中导航到 Operators > OperatorHub。
- 在安装的 Operator 表中,选择 Red Hat build of Cryostat Operator。
点 Cluster Cryostat 选项卡。
您的 Cryostat 实例在实例表中打开,并列出以下条件:
-
TLSSetupComplete
设置为true
。 -
MainDeploymentAvailable
设置为true
。 可选:如果您启用了报告生成器服务,则显示
ReportsDeploymentAvailable
并设置为true
。图 2.13. OpenShift 上 Cluster Cryostat 实例的 Status 列中设置为 True 的条件示例
-
可选: 从 Cluster Cryostat 表中,选择您的 Cryostat 实例。进入 Conditions 表来查看每个条件的更多信息。
图 2.14. 列出每个条件及其条件的 Cryostat Conditions 表示例
其他资源
第 3 章 配置 Java 应用程序
要启用 Cryostat 来收集、存储和分析有关在 Java 虚拟机(JVM)上运行的目标应用程序的 Java Flight Recorder (JFR)数据,您必须配置应用程序,以便 Cryostat 能够检测和连接它们。
您可以通过以下任一方式配置应用程序:
- 通过使用 Cryostat 代理组件检测和连接,该组件作为 Java Instrumentation Agent 实施,并充当 JVM 上运行的应用程序的插件
- 通过将应用程序配置为允许 Java 管理扩展(JMX)连接,并使用 OpenShift Service 检测和 JMX 连接
- 通过使用 Cryostat 代理检测和 JMX 连接
Cryostat 代理
从 Red Hat build of Cryostat 2.4 之后,Cryostat 代理提供了一个 HTTP API,Cryostat 服务器可以使用它作为应用程序的 JMX 端口的替代选择。通过将正确配置的 Cryostat 代理附加到您部署的工作负载应用程序,您可以使用完整的 Cryostat 功能集,而无需目标应用程序公开 JMX 端口。
在 Red Hat build of Cryostat 2.4 之前,Cryostat 代理提供了一个只读 HTTP API,它只支持一组有限的 JFR 操作。
Cryostat 代理的 HTTP API 与 JMX 端口相比有以下优点:
- 由于 API 面区域减少,安全性更高
- 由于 Cryostat 代理的双角色作为 Cryostat 发现插件,因此部署灵活性
如果 Cryostat 代理检测到应用程序上也配置了 JMX,代理会使用代理 HTTP API 定义和 JMX URL 定义将其发布到 Cryostat 服务器。在这种情况下,您可以使用您喜欢的任何配置选项。
要将 Cryostat 代理与工作负载应用程序搭配使用,您必须将应用程序配置为使用 Cryostat 代理的 JAR 文件的路径传递 -javaagent
JVM 标志(例如 -javaagent:/deployment/app/lib/cryostat-agent.jar
)。此设置可让工作负载应用程序的 JVM 在启动时加载并初始化 Cryostat 代理。Cryostat 代理的基本初始化完成后,您的工作负载应用程序的正常启动过程会照常启动。
将代理的 JAR 文件包含在工作负载应用程序中的选项
您可以通过不同的方式将 Cryostat 代理的 JAR 文件包含在工作负载应用程序中:
-
最简单的选项是将 JAR 文件添加到
pom.xml
或build.gradle
文件中的应用依赖项中。您的构建工具(Maven 或 Gradle)下载 JAR 文件,以包含在应用构建输出中。 -
您可以使用 Maven 插件(如
maven-dependency-plugin
)提供对下载并包含应用程序构建输出中的 JAR 文件的更精细的控制。 -
您可以创建一个包含 JAR 文件的 PersistentVolume 存储卷。然后,重新配置应用程序的
Deployment/DeploymentConfig
以挂载 PersistentVolume,并使用-javaagent:/path/to/persistentvolume/cryostat-agent.jar
。完成此任务的确切方法取决于您在 OpenShift 集群中启用的 PersistentVolume 供应商的类型。
当 Cryostat 代理成功添加到应用程序容器并加载后,应用程序的 stdout
和 控制台日志
开始显示 Cryostat 代理中的日志消息。
代理配置属性
您可以通过两种方式之一指定 Cryostat 代理的配置属性:
-
在应用上使用 JVM 系统属性标志(例如,
-Dcryostat.agent.api.writes-enabled=true
)。 -
通过将所有字母大写字母设为下划线(例如,
CRYOSTAT_AGENT_API_WRITES_ENABLED=true
)来使用环境变量。
您必须配置以下属性,以启用 Cryostat 代理才能成功运行:
|
这指定了 Cryostat 代理向(即内部 OpenShift Service 对象)发布其自身的 Cryostat 服务器后端的 URL 位置,如 |
|
这将指定 Cryostat 代理实例或应用程序本身的 URL 位置。Cryostat 使用此 URL 执行健康检查并从代理请求数据。您可以使用 OpenShift/Kubernetes Downward API 来动态确定这一点。如需更多信息,请参阅 Kubernetes Downward API 文档 on |
根据您的设置要求,您还可以配置以下代理属性:
|
这表明 Cryostat 代理是否允许写操作。默认设置为 注意
即使此属性设置为 |
| 这将指定代理用来绑定其 HTTP API 的 HTTP 端口号(默认为 9977)。如果此与应用程序或其他工具代理使用的现有端口冲突,您必须指定不同的端口号。 |
|
这指定一个标签,用于识别这个 Cryostat 代理实例附加到哪个应用程序(默认为 |
远程 Java 管理扩展(JMX)连接
JMX 是 JVM 上的标准功能,您可以监控和管理在 JVM 上运行的目标应用程序。要使 Cryostat 使用 JMX,您必须在启动 JVM 时启用并配置 JMX,因为 Cryostat 需要目标应用程序公开 JMX 端口。
Cryostat 通过此 JMX 端口与目标应用程序通信,以启动和停止 JFR 记录,并通过网络拉取 JFR 数据,启用 Cryostat 来存储和分析此 JFR 数据。远程监控需要安全性,以确保未授权的人无法访问应用程序。Cryostat 会在 Cryostat 可以访问任何应用程序的 JFR 记录前提示您输入您的凭证。
Cryostat 代理和 JMX 混合
您可以将目标应用程序配置为使用 Cryostat 代理和 JMX 的混合方法。使用这个方法,您可以使用 Cryostat 代理检测目标应用程序和 JMX 将 JFR 数据公开给 Cryostat,从而提高了灵活性。
例如,您可以使用代理来检测应用程序,而无需依赖于特定的端口号,并使用 JMX 连接按需启动和停止 JFR flight 记录。
3.1. 使用 Cryostat 代理配置应用程序
您可以使用 Cryostat 代理(作为 Java Instrumentation Agent)来配置目标应用程序,以便 Cryostat 可以检测应用程序、收集数据,并将数据发送到 Cryostat 进行分析。您还可以选择启用 Cryostat 代理来接受来自 Cryostat 服务器的请求以启动、停止和删除 JFR 记录。
Red Hat build of Cryostat 2.4 分发 Cryostat 代理的 JAR 文件的两个不同变体。根据您的设置要求,您可以使用以下类型的代理 JAR 文件:
一个自包含的 all-in-one "shaded" JAR 文件,其中包含代理代码及其所有依赖项
这个 "shaded" JAR 文件提供了要在现有应用程序中包含的 Cryostat 代理的最方便形式,因为您只需要包含一个额外的代理 JAR 文件。这是类似代理和工具的通用分发模式。
包含没有依赖项的代理代码的标准 JAR 文件
如果您知道代理和工作负载应用程序之间存在依赖项冲突,则这种类型的 JAR 文件很有用。如果要应用自己的策略,以提供每个依赖项的正确版本以满足代理和应用程序的要求,您可以使用独立的 JAR 文件。
在以前的版本中,这个版本提供了 Cryostat 代理的一个发行版本,它是一个一体化的 "shaded" 'JAR 文件。以下流程描述了如何安装 Cryostat 2.4 代理的"shaded" JAR 文件分发。
如 配置 Java 应用程序:Cryostat 代理 中所述,Cryostat 2.4 代理支持将代理的 JAR 文件包含到工作负载应用程序中的不同选项。以下流程描述了如何将 "shaded" JAR 文件添加到 pom.xml
或 build.gradle
文件中的应用程序依赖项中。
前提条件
- 登录到您的 Cryostat web 控制台。
- 已安装 JDK 版本 11 或更高版本。
流程
安装 Cryostat 代理。根据您的应用程序构建,选择以下选项之一:
使用 Maven:
使用 Cryostat 代理 JAR 文件信息更新应用
pom.xml
文件。pom.xml 示例
<project> ... <repositories> <repository> <id>redhat-maven-repository</id> <url>https://maven.repository.redhat.com/earlyaccess/all/</url> </repository> </repositories> ... <build> <plugins> <plugin> <artifactId>maven-dependency-plugin</artifactId> <version>3.3.0</version> <executions> <execution> <phase>prepare-package</phase> <goals> <goal>copy</goal> </goals> <configuration> <artifactItems> <artifactItem> <groupId>io.cryostat</groupId> <artifactId>cryostat-agent</artifactId> <version>0.3.0.redhat-00001</version> <classifier>shaded</classifier> </artifactItem> </artifactItems> <stripVersion>true</stripVersion> </configuration> </execution> </executions> </plugin> </plugins> ... </build> ... </project>
下次构建应用程序时,Cryostat 代理 JAR 文件位于
target/dependency/cryostat-agent-shaded.jar
。使用 Gradle :
更新
build.gradle
文件。build.gradle
文件示例repositories { … maven { url "https://maven.repository.redhat.com/earlyaccess/all/" credentials { username "myusername" password "mytoken" } } }
如何将代理 JAR 文件打包到应用中取决于您用于构建的 Gradle 插件。例如,如果您使用 Jib 插件,请按如下所示更新
build.gradle
文件:build.gradle
文件示例plugins { id 'java' id 'application' id 'com.google.cloud.tools.jib' version '3.3.1' id 'com.ryandens.javaagent-jib' version '0.5.0' } … dependencies { … javaagent 'io.cryostat:cryostat-agent:0.3.0.redhat-00001:shaded'
更新 Docker 文件。以下示例使用
JAVA_OPTS
环境变量传递相关的 JVM 信息。示例
... COPY target/dependency/cryostat-agent.jar /deployments/app/ ... ENV JAVA_OPTS="-javaagent:/deployments/app/cryostat-agent-shaded.jar"
重建特定于应用程序的容器镜像。
docker build -t docker.io/myorg/myapp:latest -f src/main/docker/Dockerfile
要提供需要配置 Cryostat 代理所需的 JVM 系统属性或环境变量,请推送更新的镜像,然后修改应用程序部署。
示例
apiVersion: apps/v1 kind: Deployment ... spec: ... template: ... spec: containers: - name: sample-app image: docker.io/myorg/myapp:latest env: - name: CRYOSTAT_AGENT_APP_NAME value: "myapp" # Replace this with the Kubernetes DNS record # for the Cryostat Service - name: CRYOSTAT_AGENT_BASEURI value: "http://cryostat.mynamespace.mycluster.svc:8181" - name: POD_IP valueFrom: fieldRef: fieldPath: status.podIP - name: CRYOSTAT_AGENT_CALLBACK value: "http://$(POD_IP):9977" 1 # Replace "abcd1234" with a base64-encoded authentication token - name: CRYOSTAT_AGENT_AUTHORIZATION 2 value: "Bearer abcd1234" - name: CRYOSTAT_AGENT_API_WRITES_ENABLED 3 value: true ports: - containerPort: 9977 protocol: TCP resources: {} restartPolicy: Always status: {}
-
<1>:端口号
9977
是代理为服务 Cryostat 请求的内部 Web 服务器公开的默认 HTTP 端口。如果与安装代理的目标应用程序冲突,您可以更改此端口号。 -
<2>:
CRYOSTAT_AGENT_AUTHORIZATION
值显示代理包含在 API 请求中的凭证,以公告其自身存在或推送 JFR 数据。您还可以为此目的创建 Kubernetes服务帐户
,并将abcd1234
替换为与服务帐户关联的 base64 编码身份验证令牌。 -
<3> :
CRYOSTAT_AGENT_API_WRITES_ENABLED
变量默认设置为false
。如果您希望 Cryostat 代理接受来自 Cryostat 服务器的请求以启动、停止或删除 JFR flight 记录,您必须将此变量设置为true
。
-
<1>:端口号
3.2. 使用 JMX 连接配置应用程序
要使 Cryostat 检测并与您的目标 Java 应用程序通信,您可以配置应用程序以允许远程 Java 管理扩展(JMX)连接。
前提条件
- 登录到您的 Cryostat web 控制台。
- 在项目中创建 Cryostat 实例。
流程
要启用远程 JMX 连接,请完成以下步骤:
在应用程序中,定义以下 Java 系统属性:
-Dcom.sun.management.jmxremote.port=<port_num>
注意要添加
-Dcom.sun.management.jmxremote.port=<port_num
> 属性,而无需重建目标应用程序,您可以在应用程序上设置JAVA_OPTS_APPEND
环境变量。JAVA_OPTS_APPEND
是红帽通用基础镜像(UBI)使用的环境变量。如果您使用 Red Hat UBI 构建应用程序镜像,请在应用程序 Docker 文件构建时设置
JAVA_OPTS_APPEND
变量,请运行以下命令:oc set env deployment <name> JAVA_OPTS_APPEND="..."
如果不使用 Red Hat UBI 构建应用程序镜像,请参阅基础镜像的文档,以了解有关如何在构建或运行时添加 Java 系统属性的信息。
通过允许到应用程序的流量来指定应用程序侦听远程 JMX 连接。使用 Red Hat OpenShift Service,并为其远程 JMX 端口指定以下值:
service.yaml
示例apiVersion: v1 kind: Service ... spec: ports: - name: "jfr-jmx" port: 9091 targetPort: 9091 ...
保护远程 JMX 连接:
为应用程序中的远程 JMX 连接启用和配置身份验证和 SSL/TLS:
-Dcom.sun.management.jmxremote.port=<port_num> # enable JMX authentication -Dcom.sun.management.jmxremote.authenticate=true # define users for JMX auth -Dcom.sun.management.jmxremote.password.file=</path/to/jmxremote.password> # set permissions for JMX users -Dcom.sun.management.jmxremote.access.file=</path/to/jmxremote.access> # enable JMX SSL -Dcom.sun.management.jmxremote.ssl=true # enable JMX registry SSL -Dcom.sun.management.jmxremote.registry.ssl=true # set your SSL keystore -Djavax.net.ssl.keyStore=</path/to/keystore> # set your SSL keystore password -Djavax.net.ssl.keyStorePassword=<password>
配置 Cryostat 以信任应用程序 TLS 证书。在与 Cryostat 应用程序相同的命名空间中为应用程序创建一个 secret,并将 Cryostat 配置为引用该 secret。要为证书创建 secret,请运行以下命令:
oc create secret generic myapp-cert --from-file=tls.crt=/path/to/cert.pem
注意证书必须采用
.pem
文件格式。- 在创建 Cryostat 实例时,将 secret 添加到可信 TLS 证书列表中。如需更多信息,请参阅配置 TLS 证书。
要允许应用程序通过密码身份验证以外的方式验证 Cryostat 是否连接到它们,请启用 TLS 客户端身份验证:
-Dcom.sun.management.jmxremote.ssl.need.client.auth=true -Djavax.net.ssl.trustStore=</path/to/truststore> -Djavax.net.ssl.trustStorePassword=<password>
注意TLS 客户端身份验证需要 Red Hat OpenShift 的 cert-manager 操作器。
如果将 TLS 客户端身份验证用于远程 JMX 连接,应用程序信任存储必须包含 Cryostat 证书。Cryostat operator cert-manager 集成为 Cryostat 部署创建一个自签名证书。此证书位于 <
cryostat>-tls
secret 中,其中 <cryostat> 是您创建的 Cryostat 实例的名称。注意cert-manager Operator 还会将 Java 密钥存储信任存储放在 secret 中。
要在应用程序部署中挂载此信任存储,请运行以下命令,将 "<myapp>" 替换为应用程序部署的名称,并将 "<cryostat>" 替换为 Cryostat 实例的名称:
oc set volumes deploy <myapp> --add --name=truststore \ --secret-name=<cryostat>-tls --sub-path=truststore.p12 \ --mount-path=/var/run/secrets/<myapp>/truststore.p12
Cryostat 操作器生成 truststore 密码,您可以在 <
cryostat>-keystore
secret 中找到。要将它作为环境变量挂载到应用程序部署中,请运行以下命令:oc set env deploy <myapp> --from='secret/<cryostat>-keystore'
为容器配置 Java 参数。运行以下命令:
-Dcom.sun.management.jmxremote.ssl.need.client.auth=true -Djavax.net.ssl.trustStore=/var/run/secrets/<myapp>/truststore.p12 -Djavax.net.ssl.trustStorePassword="$(KEYSTORE_PASS)"
警告如果您在测试环境中部署 Cryostat 和应用程序,您可能需要配置目标应用程序,而无需任何 JMX 或 TLS 身份验证。您可以使用以下 Java 系统属性集合,但这种配置不安全且不推荐这样做。
-Dcom.sun.management.jmxremote.port=<port_num> -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
其他资源
3.3. 使用 Cryostat 代理和 JMX 连接配置应用程序
您可以配置在 Java 虚拟机(JVM)上运行的目标应用程序,以使用 Cryostat 代理和 Java 管理扩展(JMX)连接的组合来检测并与目标应用程序通信。
您可以使用 Cryostat 代理来检测和与目标应用程序通信,并使用 JMX 来公开 Java Flight Recorder (JFR)数据。
您必须将 Cryostat 代理配置为与 Cryostat 通信,并且代理可以通过 JMX 而不是通过 HTTP 访问。
前提条件
- 登录到您的 Cryostat web 控制台。
- 在项目中创建 Cryostat 实例。
流程
安装 Cryostat 代理。对于使用 Maven 的应用构建,请使用 Cryostat 代理 JAR 文件信息更新应用
pom.xml
文件。pom.xml
文件示例<project> ... <repositories> <repository> <id>redhat-maven-repository</id> <url>https://maven.repository.redhat.com/earlyaccess/all/</url> </repository> </repositories> ... <build> <plugins> <plugin> <artifactId>maven-dependency-plugin</artifactId> <version>3.3.0</version> <executions> <execution> <phase>prepare-package</phase> <goals> <goal>copy</goal> </goals> <configuration> <artifactItems> <artifactItem> <groupId>io.cryostat</groupId> <artifactId>cryostat-agent</artifactId> <version>0.3.0.redhat-00001</version> <classifier>shaded</classifier> </artifactItem> </artifactItems> <stripVersion>true</stripVersion> </configuration> </execution> </executions> </plugin> </plugins> ... </build> ... </project>
修改应用程序部署:
示例
apiVersion: apps/v1 kind: Deployment ... spec: ... template: ... spec: containers: - name: sample-app image: docker.io/myorg/myapp:latest env: - name: CRYOSTAT_AGENT_APP_NAME value: "myapp" # Replace this with the Kubernetes DNS record # for the Cryostat Service - name: CRYOSTAT_AGENT_BASEURI value: "http://cryostat.mynamespace.mycluster.svc:8181" - name: POD_IP valueFrom: fieldRef: fieldPath: status.podIP - name: CRYOSTAT_AGENT_CALLBACK value: "http://$(POD_IP):9977" - name: CRYOSTAT_AGENT_AUTHORIZATION # Replace "abcd1234" with a base64-encoded authentication token value: "Bearer abcd1234" # This environment variable is key to the Cryostat agent # and JMX "hybrid" setup. # Set the Cryostat agent to register itself with Cryostat # as reachable through JMX, rather than reachable through HTTP. - name: CRYOSTAT_AGENT_REGISTRATION_PREFER_JMX value: "true" # Configure the application to load the agent JAR file and # to enable JMX, so that the Cryostat agent can register # itself as reachable through JMX. # To configure authentication and SSL/TLS for the JMX # connections, see <1>. - name: JAVA_OPTS value: >- -javaagent:/deployments/app/cryostat-agent-shaded.jar -Dcom.sun.management.jmxremote.port=9091 1 ports: - containerPort: 9977 protocol: TCP resources: {} restartPolicy: Always status: {}
<1>:要为 JMX 连接配置身份验证和 SSL/TLS,并查看更多配置选项,请参阅使用 JMX 连接 配置应用程序。
要启用 Cryostat 来检测目标应用程序并连接到 Cryostat 代理,请配置
应用程序服务
:示例
apiVersion: v1 kind: Service ... spec: ports: - name: "jfr-jmx" port: 9091 targetPort: 9091 - name: "cryostat-agent" port: 9977 targetPort: 9977 ...
第 4 章 使用 Cryostat 创建 JFR 记录
使用 Cryostat,您可以创建一个在容器化应用程序中监控 JVM 性能的 JDK Flight Recorder (JFR)记录。另外,您可以对活跃的 JFR 记录进行快照来捕获任何收集的数据(最多为目标 JVM 应用程序的特定点)。
4.1. 在 Cryostat web 控制台中创建 JFR 记录
您可以创建一个 JFR 记录来监控容器化应用程序中的 JVM 性能。创建 JFR 记录后,您可以启动 JFR 来捕获 JVM 的实时数据,如堆和非堆内存用量。
前提条件
- 使用 OperatorHub 选项在 Red Hat OpenShift 上安装 Cryostat 2.4。
- 在 Red Hat OpenShift 项目中创建一个 Cryostat 实例。
登录到您的 Cryostat web 控制台。
- 您可以使用 Red Hat OpenShift Web 控制台检索 Cryostat 应用程序的 URL。
流程
在 Cryostat web 控制台的 Dashboard 面板中,从 Target 列表中选择一个目标 JVM。
注意根据您配置目标应用程序的方式,您的目标 JVM 可能会使用 JMX 连接或代理 HTTP 连接。有关配置目标应用程序的更多信息,请参阅配置 Java 应用程序。
重要如果您的目标 JVM 使用代理 HTTP 连接,请确保在将目标应用程序配置为加载 Cryostat 代理时将
cryostat.agent.api.writes-enabled
属性设为true
。否则,Cryostat 代理无法接受启动和停止 JFR 记录的请求。图 4.1. 为您的 Cryostat 实例选择 Target JVM 的示例
可选: 在 仪表板 面板中,您可以创建一个目标 JVM。在 Target 列表中,单击 Create Target。此时会打开 Create Custom Target 窗口。
- 在 Connection URL 字段中,输入 JVM 的 Java 管理扩展(JMX)端点的 URL。
- 可选: 要测试您指定的 连接 URL 是否有效,请点击 点击来测试 示例节点镜像。如果 Connection URL 存在问题,则会显示一条错误消息,其中提供了问题的描述以及要排除故障的指导。
- 可选: 在 Alias 字段中输入 JMX Service URL 的别名。
点 Create。
图 4.2. 创建自定义目标窗口
- 在 Cryostat web 控制台的导航菜单中点 Recordings。
可选: 根据您如何配置目标 JVM,在 web 控制台中可能会打开一个 Authentication Required 对话框。在 Authentication Required 对话框中,输入您的用户名 和 密码。要为目标 JVM 提供您的凭据,请单击 Save。
图 4.3. Cryostat 身份验证所需的窗口示例
注意如果所选目标 JMX 为 JMX 连接启用了安全套接字层(SSL)认证,则必须在提示时添加其证书。
Cryostat 在 Red Hat OpenShift 上的持久性卷声明(PVC)上加密并存储目标 JVM 应用程序的凭证。请参阅 清理和管理凭证 (使用 Cryostat 管理 JFR 记录)。
在 Active Recordings 选项卡中,单击 Create。
图 4.4. 创建活跃记录的示例
在 Custom Flight Recording 选项卡中:
- 在 Name 字段中输入您要创建的记录的名称。如果您以无效的格式输入名称,Web 控制台会显示错误消息。
如果您希望 Cryostat 自动重启现有的记录,请选择 Restart if record already exists 复选框。
注意如果您输入了一个已存在的名称,但没有选择 Restart (如果记录已存在), 则 Cryostat 会在点 Create 按钮时拒绝创建自定义记录。
- 在 Duration 字段中,选择是否要在指定持续时间后停止此记录,或者在不停止的情况下持续运行。如果您希望 Cryostat 在记录停止后自动归档新的 JFR 记录,请点击 Stop 的 Archive。
- 在 Template 字段中,选择您要用于记录的模板。
以下示例显示了连续 JVM 监控,您可以通过从 Duration 字段上方选择 continuous 来启用它。此设置意味着记录将继续,直到手动停止记录为止。这个示例还显示了从 Template 字段中选择 Profiling 模板。这为 JFR 记录提供额外的 JVM 信息,用于故障排除。
图 4.5. 创建自定义 flight 记录的示例
要访问更多选项,请点击以下可扩展超链接:
- 显示高级选项,您可以在其中选择额外的选项来自定义 JFR 记录。
- 显示元数据选项,您可以在其中将自定义标签和元数据添加到 JFR 记录中。
要创建 JFR 记录,请点击 Create。Active Recordings 选项卡会打开并列出您的 JFR 记录。
您的活跃 JFR 记录开始在容器化应用程序中的目标 JVM 位置收集数据。如果您为 JFR 记录指定了固定持续时间,则目标 JVM 会在达到固定持续时间设置时停止记录。否则,您必须手动停止记录。
可选: 在 Active Recording 选项卡中,您还可以停止记录。
- 选中 JFR 记录名称旁边的复选框。在 Active Recordings 选项卡中的工具栏上,Cryostat web 控制台会激活 Stop 按钮。
点 Stop。JFR 采用
STOPPED
状态,因此它会停止监控目标 JVM。JFR 仍然显示在 Active Recording 选项卡下。图 4.6. 停止活跃记录的示例
重要在以下情况下,JFR 记录数据可能会丢失:
- 目标 JVM 失败
- 目标 JVM 重启
- 目标 JVM Red Hat OpenShift Deployment 缩减
归档您的 JFR 记录,以确保您不会丢失 JFR 记录的数据。
其他资源
- 请参阅 上传 SSL 证书 (使用 Cryostat 管理 JFR 记录)。
- 请参阅 Archiving JDK Flight Recorder (JFR)记录 (Uing Cryostat)来管理 JFR 记录。
4.2. 从活跃的记录创建快照
您可以对活跃的 JFR 记录进行快照来捕获任何收集的数据(最多为目标 JVM 应用程序的特定点)。快照像一个检查点标记,它在运行的 JFR 记录中具有给定时间段的起点和端点。
快照存储在目标 JVM 应用程序的内存中。这与 Cryostat 中的存档不同,在云存储磁盘上存储存档,这是存储 JFR 记录数据的更持久解决方案。
如果要试验活跃 JFR 记录之间的不同配置更改,您可以对记录进行快照。
当您为 JFR 记录创建快照时,Cryostat 会创建一个名为 snapshot - <snapshot_number>
的新目标 JVM,其中 <snapshot_number
> 是 Cryostat 自动分配给快照的数字。
目标 JVM 将快照识别为活跃的记录。Cryostat 在 STOPPED
状态中设置任何 JFR 快照,这意味着 JFR 快照不会将新数据记录到目标 JVM。根据 JFR 配置,活跃的 JFR 记录可能会继续监控目标 JVM,而不考虑所执行的快照数量。
对于您为目标 JVM 应用程序的持续监控而设置的 JFR 记录,请确保创建归档的记录以避免丢失 JFR 记录数据。
如果您选择使用常规快照来存储 JFR 记录数据,则目标 JVM 应用程序可能会通过将旧的记录数据替换为较新的记录数据来释放其一些数据存储空间。
前提条件
- 输入您的 Cryostat 实例的验证详情。
- 创建目标 JVM 记录并输入您经过身份验证的详情来访问 Recordings 菜单。请参阅 创建 JDK Flight Recorder (JFR)记录 (使用 Cryostat 创建 JFR 记录)。
流程
在 Active Recordings 选项卡中,点 Create 按钮。web 控制台中打开一个新窗口。
图 4.7. 创建活跃记录的示例
点 Snapshot Recording 选项卡。
图 4.8. 创建快照记录示例
点 Create。Active Recordings 表将打开,它会列出您的 JFR 快照记录。以下示例显示了名为
snapshot-3
的 JFR 快照记录。图 4.9. 完成的快照记录示例
注意您可以从活跃记录列表中根据 快照 前缀来识别快照。
后续步骤
- 要归档您的 JFR 快照记录,请参阅 Archiving JDK Flight Recorder (JFR)记录。
4.3. JFR 记录的标签
当您在 Cryostat 2.4 上创建 JDK Flight Recorder (JFR)记录时,您可以通过指定一系列键值对将元数据添加到记录中。
另外,您可以将自定义标签附加到目标 JVM 中的 JFR 记录,以便您可以轻松地识别和更好地管理 JFR 记录。
以下列表详细介绍了一些常见记录标签用例:
- 将元数据附加到您的 JFR 记录中。
- 对包含相同标签的记录执行批处理操作。
- 在记录中运行查询时使用标签。
您可以使用 Cryostat 创建 JFR 记录来监控容器化应用程序中 JVM 的性能。另外,您可以对活跃的 JFR 记录进行快照来捕获任何收集的数据(最多为目标 JVM 应用程序的特定点)。
4.3.1. 在 JFR 记录中添加标签
当您在 Cryostat 2.4 上创建 JFR 记录时,您可以使用标签为记录添加包含键值对的元数据。
Cryostat 将默认记录标签应用到创建的 JFR 记录。这些默认标签捕获 Cryostat 用于创建 JFR 记录的事件模板的信息。
您可以在 JFR 记录中添加自定义标签,以便您可以运行满足您的需要的特定查询,如识别特定的 JFR 记录或使用同一应用标签对记录执行批处理操作。
前提条件
- 登录到您的 Cryostat web 控制台。
- 为您的 Cryostat 实例创建或选择一个目标 JVM。
流程
- 在 Cryostat web 控制台中点 Recordings。
- 在 Active Recordings 选项卡下,单击 Create。
在 Custom Flight Recording 选项卡中,展开 Show metadata options。
注意在 Custom Flight Recording 选项卡中,您必须完成标记为星号的任何强制字段。
点 Add label。
图 4.10. 在 Custom Flight Recording 选项卡下显示的 Add Label 按钮
- 在提供的 Key 和 Value 字段中输入值。例如,如果要与记录相关的问题,您可以在 Key 字段中输入原因,然后在 Value 字段中输入问题类型。
点 Create 创建 JFR 记录。然后您的记录会在 Active Recordings 选项卡下显示,以及任何指定的记录标签和自定义标签。
提示您可以从归档菜单访问归档的 JFR 记录。请参阅 将 JFR 记录上传到 Cryostat 归档位置 (使用 Cryostat 管理 JFR 记录)。
示例
以下示例显示了两个默认记录标签,即 template.name: Profiling
and template.type: TARGET
,以及一个自定义标签,原因:service-outage
。
图 4.11. 带有定义的记录标签和自定义标签的活跃记录示例
4.3.2. 为您的 JFR 记录编辑标签
在 Cryostat web 控制台中,您可以导航到 Recordings 菜单,然后编辑 JFR 记录的标签及其元数据。您还可以编辑上传到存档的 JFR 记录的标签和元数据。
前提条件
- 登录到您的 Cryostat web 控制台。
- 创建 JFR 记录,并将标签附加到此记录。
流程
- 在 Cryostat web 控制台中,点 Recording 菜单。
- 在 Active Recordings 选项卡中,找到您的 JFR 记录,然后选中它旁边的复选框。
点击 Edit Labels。在 Cryostat web 控制台中打开 Edit Recording Label 窗格,您可以使用它来为 JFR 记录添加、编辑或删除标签。
提示您可以选择每个记录旁边的复选框来选择多个 JFR 记录。如果要批量编辑包含相同标签的记录,或者向多个记录添加新的相同标签,点 Edit Labels 按钮。
可选 : 您可以从 Edit Recording Labels 窗格中执行以下操作:
- 点 Add 创建标签。
-
点击标签旁边的
X
来删除标签。 - 通过修改字段中的任何内容来编辑标签。编辑内容后,字段中会显示绿色勾号以指示编辑。
- 点击 Save。
可选 : 您可以通过完成以下步骤来归档 JFR 记录及其标签:
- 选中记录名称旁边的复选框。
点 归档 按钮。您可以在 Archived Recordings 选项卡下找到您的记录。
通过将记录与其标签归档,您可以在您要稍后阶段找到记录时增强搜索功能。您还可以在上传到 Cryostat 归档的任何记录中添加额外标签。
注意Cryostat 在归档记录生命周期中保留带有记录的任何标签。
验证
- 在 Active Recordings 选项卡中,检查您的更改是否显示在您的记录的 Labels 部分。
更新于 2024-03-06