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
其他资源