你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

教程:在 Azure 容器应用中使用 init 容器配置应用程序性能管理 (APM) Java 代理

在本教程中,你将了解如何在 Azure 容器应用中使用 init 容器配置应用程序性能管理 (APM) Java 代理。 APM 有助于增强容器应用的可观察性。 可以将 APM 插件与你的应用打包在同一映像或 Dockerfile 中,但它会将管理事项(例如,发布以及公共漏洞和暴露 (CVE) 缓解)绑定在一起。 你可以在 Azure 容器应用中使用 Java 代理和 init 容器来注入 APM 解决方案(无需修改应用映像),而不是将这些事项绑定在一起。

在本教程中,你将了解:

  • 准备映像以设置 Java 代理并将其推送到 Azure 容器注册表。
  • 创建容器应用环境和容器应用作为目标 Java 应用。
  • 配置 init 容器和卷装载以设置 Application Insights 集成。

先决条件

设置环境

使用以下步骤来定义环境变量并确保容器应用扩展保持最新:

  1. 使用以下命令定义环境变量:

    export SUBSCRIPTION_ID="<SUBSCRIPTION_ID>" # Replace with your own Azure subscription ID
    export APP_INSIGHTS_RESOURCE_ID="/subscriptions/$SUBSCRIPTION_ID/resourceGroups/my-resource-group/providers/microsoft.insights/components/my-app-insights"
    export CONTAINER_REGISTRY_NAME="myacr"
    export RESOURCE_GROUP="my-resource-group"
    export ENVIRONMENT_NAME="my-environment"
    export CONTAINER_APP_NAME="my-container-app"
    export LOCATION="eastus"
    
  2. 使用以下命令登录到 Azure CLI:

    az login
    az account set --subscription $SUBSCRIPTION_ID
    
  3. 使用以下命令确保具有适用于容器应用和 Application Insights 的最新版本的 Azure CLI 扩展:

    az extension add --name containerapp --upgrade
    az extension add --name application-insights --upgrade
    
  4. 使用以下命令检索 Application Insights 实例的连接字符串:

    CONNECTION_STRING=$(az monitor app-insights component show \
        --ids $APP_INSIGHTS_RESOURCE_ID \
        --query connectionString)
    

准备容器映像

若要构建 Application Insights Java 代理的安装映像,请在同一目录中使用以下步骤:

  1. 创建包含以下内容的 Dockerfile:

    FROM mcr.microsoft.com/cbl-mariner/base/core:2.0
    
    ARG version="3.5.4"
    
    RUN tdnf update -y && tdnf install -y curl ca-certificates
    
    RUN curl -L "https://github.com/microsoft/ApplicationInsights-Java/releases/download/${version}/applicationinsights-agent-${version}.jar" > agent.jar
    
    ADD setup.sh /setup.sh
    
    ENTRYPOINT ["/bin/sh", "setup.sh"]
    
  2. 创建具有以下内容的 setup.sh 文件:

    #!/bin/sh
    
    if [[ -z "$CONNECTION_STRING" ]]; then
      echo "Environment variable CONNECTION_STRING is not found. Exiting..."
      exit 1
    else
      echo "{\"connectionString\": \"$CONNECTION_STRING\"}" > /java-agent/applicationinsights.json
      cp agent.jar /java-agent/agent.jar
    fi
    
  3. 使用以下命令创建一个映像:

    docker build . --tag "$CONTAINER_REGISTRY_NAME.azurecr.io/samples/java-agent-setup:1.0.0"
    
  4. 使用以下命令将该映像推送到 Azure 容器注册表或其他容器映像注册表:

    az acr login --name $CONTAINER_REGISTRY_NAME
    docker push "$CONTAINER_REGISTRY_NAME.azurecr.io/samples/java-agent-setup:1.0.0"
    

提示

可以在 azure-container-apps-java-samples GitHub 存储库中找到与此步骤相关的代码。

创建容器应用环境和容器应用作为目标 Java 应用

若要创建容器应用环境和作为目标 Java 应用的容器应用,请使用以下步骤:

  1. 通过使用以下命令来创建容器应用环境:

    az containerapp env create \
        --name $ENVIRONMENT_NAME \
        --resource-group $RESOURCE_GROUP \
        --location "$LOCATION" \
        --query "properties.provisioningState"
    

    成功创建容器应用环境后,命令行将返回 Succeeded 消息。

  2. 使用以下命令创建用于进一步配置的容器应用:

    az containerapp create \
        --name $CONTAINER_APP_NAME \
        --environment $ENVIRONMENT_NAME \
        --resource-group $RESOURCE_GROUP \
        --query "properties.provisioningState"
    

    创建容器应用后,命令行将返回 Succeeded 消息。

配置 init 容器、机密、环境变量和卷以设置 Application Insights 集成

使用以下步骤为 init 容器配置机密、环境变量和卷。 此配置允许将存储的信息用于 Application Insights 实例。

  1. 使用以下命令将正在运行的容器应用的当前配置写入当前目录中的 app.yaml 文件:

    az containerapp show \
        --resource-group $RESOURCE_GROUP \
        --name $CONTAINER_APP_NAME \
        --output yaml \
    > app.yaml
    
  2. 使用以下步骤编辑 app.yaml 文件。 这些编辑操作将机密、临时存储和 init 容器添加到文件,并更新应用容器。

    1. 使用以下示例为 Application Insights 连接字符串添加机密。 将 $CONNECTION_STRING 替换为你的 Application Insights 连接字符串。

      properties:
        configuration:
           secrets:
           - name: app-insights-connection-string
             value: $CONNECTION_STRING
      
    2. 使用以下示例为 Java 代理文件添加临时存储卷:

      properties:
        template:
          volumes:
          - name: java-agent-volume
            storageType: EmptyDir
      
    3. 使用以下示例添加包含卷装载和环境变量的 init 容器。 将 <CONTAINER_REGISTRY_NAME> 替换为你的 Azure 容器注册表名称。

      properties:
        template:
          initContainers:
          - image: <CONTAINER_REGISTRY_NAME>.azurecr.io/samples/java-agent-setup:1.0.0
            name: java-agent-setup
            resources:
              cpu: 0.25
              memory: 0.5Gi
            env:
            - name: CONNECTION_STRING
              secretRef: app-insights-connection-string
            volumeMounts:
            - mountPath: /java-agent
              volumeName: java-agent-volume
      
    4. 使用以下示例更新包含卷装载和环境变量的应用容器:

      properties:
        template:
          containers:
          - name: test-java-app
            image: mcr.microsoft.com/azurespringapps/samples/hello-world:0.0.1
            resources:
              cpu: 0.5
              memory: 1Gi
            env:
            - name: JAVA_TOOL_OPTIONS
              value: -javaagent:/java-agent/agent.jar
            volumeMounts:
            - mountPath: /java-agent
               volumeName: java-agent-volume
      
  3. 使用以下命令使用修改后的 app.yaml 文件更新容器应用:

    az containerapp update \
        --resource-group $RESOURCE_GROUP \ 
        --name $CONTAINER_APP_NAME \
        --yaml app.yaml \
        --query "properties.provisioningState"
    

    更新容器应用后,命令将返回 Succeeded 消息。 现在,你可以通过在 Azure 门户中查看 Application Insights 实例来验证容器应用是否已连接。

清理资源

你在本教程中创建的资源将计入你的 Azure 帐单。 如果你长期不需要它们,请使用以下命令删除资源组及其资源:

az group delete --resource-group $RESOURCE_GROUP

除了 Azure Application Insights 之外,社区中还有其他常用的 APM 解决方案。 如果要将 Azure 容器应用与其他 APM 提供程序集成,只需替换 Java 代理 JAR 和相关配置文件。