3.2. 使用 Cryostat 代理配置应用程序
您可以使用 Cryostat 代理(作为 Java Instrumentation Agent 实施)来配置目标应用程序,以便 Cryostat 可以检测应用程序,收集数据,并将数据发送到 Cryostat 以进行分析。您还可以选择启用 Cryostat 代理,以接受来自 Cryostat 服务器的请求,以启动、停止和删除 JFR 记录。
Red Hat build of Cryostat 3.0 分发了 Cryostat 代理的 JAR 文件的两个不同变体。根据您的设置要求,您可以使用以下一种代理 JAR 文件:
一个一体化的"shaded" JAR 文件,该文件是自包含的,包括代理代码及其所有依赖项
此"shaded" JAR 文件提供了在现有应用程序中包括的最方便的 Cryostat 代理形式,因为您只需要包含一个额外的代理 JAR 文件。这是类似代理和工具的常见分发模式。
包含没有依赖项的代理代码的标准 JAR 文件
如果您知道代理和工作负载应用程序之间存在依赖关系冲突,则这种类型的 JAR 文件很有用。如果您打算应用自己的策略,以提供每个依赖项的正确版本以满足代理和应用程序的要求,您可以使用独立 JAR 文件。
之前的版本提供了 Cryostat 代理的一个发行版,它是一个"shaded""JAR 文件。以下流程描述了如何安装 Cryostat 3.0 代理的"shaded" JAR 文件分发。
如 配置 Java 应用程序:Cryostat 代理 中所述,Cryostat 3.0 代理支持不同的选项,以将代理的 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.4.0.redhat-xxxxx</version> <classifier>shaded</classifier> </artifactItem> </artifactItems> <stripVersion>true</stripVersion> </configuration> </execution> </executions> </plugin> </plugins> ... </build> ... </project>
注意在前面的示例中,将
0.4.0.redhat-xxxxx
替换为 Cryostat 代理的最新构建版本(例如0.4.0.redhat-00001
)。有关 Cryostat 代理的最新构建版本的详情,请参考 Red Hat Maven 存储库。下次构建应用程序时,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.4.0.redhat-xxxxx:shaded'
注意在前面的示例中,将
0.4.0.redhat-xxxxx
替换为 Cryostat 代理的最新构建版本(例如0.4.0.redhat-00001
)。有关 Cryostat 代理的最新构建版本的详情,请参考 Red Hat Maven 存储库。
更新 Docker 文件。以下示例使用
JAVA_OPTS
环境变量传递相关的 JVM 信息。Example
... 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 系统属性或环境变量,请推送更新的镜像,然后修改应用程序部署。
Example
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:4180" - name: POD_IP valueFrom: fieldRef: fieldPath: status.podIP - name: CRYOSTAT_AGENT_CALLBACK value: "http://$(POD_IP):9977" 1 # Replace "abcd1234" with a plain-text 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
替换为与服务帐户关联的纯文本身份验证令牌。 -
<3>:默认情况下
CRYOSTAT_AGENT_API_WRITES_ENABLED
变量设为false
。如果您希望 Cryostat 代理接受来自 Cryostat 服务器的请求以启动、停止或删除 JFR flight 记录,您必须将此变量设置为true
。
-
<1>: 端口号
3.2.1. 将 Cryostat 代理配置为信任 Cryostat 服务器
当您将 Cryostat 代理与启用了 cert-manager 集成的 Cryostat 实例搭配使用时,Cryostat 代理会通过安全 HTTPS 连接与 Cryostat 通信。在这种情况下,Cryostat Operator 使用 cert-manager 来生成自签名证书颁发机构(CA)证书,该证书存储在 secret 中。您必须将 Cryostat 代理配置为信任此 CA 证书。
流程
创建一个 Cryostat CR,为您的 Cryostat 实例和目标应用程序定义命名空间。
例如,如果要在
cryostat
命名空间中创建 Cryostat CR,该 CR 配置为连接到apps
命名空间中的目标应用程序,请输入以下详情:apiVersion: operator.cryostat.io/v1beta2 kind: Cryostat metadata: name: cryostat-sample namespace: cryostat spec: enableCertManager: true targetNamespaces: - apps
在 Cryostat 可用时,要获取目标应用程序命名空间中的 CA 证书 secret,请输入以下命令:
$ oc project apps $ oc get secret "cryostat-ca-$(echo -n 'cryostat/cryostat-sample' | sha256sum | cut -d ' ' -f 1)"
在前面的示例中,将
apps
替换为您的目标应用程序的命名空间,并将cryostat/cryostat-sample
替换为 Cryostat 实例的命名空间和名称。另外,请确保 Cryostat 实例的命名空间和名称用正斜杠(/
)分隔。前面的命令会生成类似如下的输出:
如上例所示,secret 名称包含一个哈希后缀,以防止与集群中的其他 Cryostat 实例冲突。
通过创建 init 容器将证书导入到信任存储中,将 Cryostat 代理配置为信任 Cryostat 的 CA 证书。
注意此步骤假设您在
apps
命名空间中有一个名为my-app
的目标应用程序,该应用程序安装了 Cryostat 代理,否则会正确配置。在以下示例中,将任何出现
my-app
和apps
替换为目标应用程序的名称和命名空间。使用在第 2 步中 获取的 secret 名称,为部署中的 Cryostat CA secret 创建卷。
例如:
$ oc set volumes deploy/my-app --add --name=cryostat-ca --secret-name=cryostat-ca-30268177e44252b3f9b7d9bf3a6db48f3a1cd3656700a6830952afc4456c0048
前面的命令会生成类似如下的输出:
deployment.apps/my-app volume updated
创建一个
emptyDir
卷,以在 init 容器和应用程序容器间共享信任存储:例如:
$ oc set volumes deploy/my-app --add --name=truststore -m /var/run/secrets/io.cryostat/truststore
前面的命令会生成类似如下的输出:
deployment.apps/my-app volume updated
向目标应用程序的部署 YAML 文件中添加一个 init 容器。
例如:
initContainers: - name: pem-to-truststore image: registry.access.redhat.com/ubi8/openjdk-11-runtime:latest command: - /bin/bash args: - -c - >- keytool -import -file /var/run/secrets/io.cryostat/cryostat-ca/tls.crt -keystore /var/run/secrets/io.cryostat/truststore/truststore.jks -trustcacerts -noprompt -storepass <my password> volumeMounts: - mountPath: /var/run/secrets/io.cryostat/cryostat-ca name: cryostat-ca - mountPath: /var/run/secrets/io.cryostat/truststore name: truststore
在前面的示例中,将 &
lt;my
password> 替换为您要使用的密码。在应用程序中定义
javax.ssl.trustStore
Java 系统属性。例如:
env: - name: JAVA_OPTS_APPEND value: |- # … -Djavax.net.ssl.trustStore=/var/run/secrets/io.cryostat/truststore/truststore.jks -Djavax.net.ssl.trustStorePassword=<my password>
在前面的示例中,将
<my
password> 替换为您在上一步中指定的密码。注意如何设置 Java 系统属性取决于应用程序的构建方式以及您使用的基础镜像。前面的示例假设您使用通过 OpenJDK UBI 镜像构建的应用程序。