搜索

3.2. 使用 Cryostat 代理配置应用程序

download PDF

您可以使用 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.xmlbuild.gradle 文件中的应用程序依赖项中。

先决条件

  • 登录到您的 Cryostat web 控制台。
  • 安装了 JDK 版本 11 或更高版本。

流程

  1. 安装 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 存储库

  2. 更新 Docker 文件。以下示例使用 JAVA_OPTS 环境变量传递相关的 JVM 信息。

    Example

    ...
    COPY target/dependency/cryostat-agent.jar /deployments/app/
    ...
    ENV JAVA_OPTS="-javaagent:/deployments/app/cryostat-agent-shaded.jar"

  3. 重建特定于应用程序的容器镜像。

    docker build -t docker.io/myorg/myapp:latest -f src/main/docker/Dockerfile
  4. 要提供您需要配置 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

3.2.1. 将 Cryostat 代理配置为信任 Cryostat 服务器

当您将 Cryostat 代理与启用了 cert-manager 集成的 Cryostat 实例搭配使用时,Cryostat 代理会通过安全 HTTPS 连接与 Cryostat 通信。在这种情况下,Cryostat Operator 使用 cert-manager 来生成自签名证书颁发机构(CA)证书,该证书存储在 secret 中。您必须将 Cryostat 代理配置为信任此 CA 证书。

流程

  1. 创建一个 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
  2. 在 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 实例的命名空间和名称用正斜杠(/)分隔。

    前面的命令会生成类似如下的输出:

    获取 CA 证书 secret

    如上例所示,secret 名称包含一个哈希后缀,以防止与集群中的其他 Cryostat 实例冲突。

  3. 通过创建 init 容器将证书导入到信任存储中,将 Cryostat 代理配置为信任 Cryostat 的 CA 证书。

    注意

    此步骤假设您在 apps 命名空间中有一个名为 my-app 的目标应用程序,该应用程序安装了 Cryostat 代理,否则会正确配置。

    在以下示例中,将任何出现 my-appapps 替换为目标应用程序的名称和命名空间。

    1. 使用在第 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
    2. 创建一个 emptyDir 卷,以在 init 容器和应用程序容器间共享信任存储:

      例如:

      $ oc set volumes deploy/my-app --add --name=truststore -m /var/run/secrets/io.cryostat/truststore

      前面的命令会生成类似如下的输出:

      deployment.apps/my-app volume updated
    3. 向目标应用程序的部署 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> 替换为您要使用的密码。

    4. 在应用程序中定义 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 镜像构建的应用程序。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.