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

在 Azure 容器应用中使用会话池

会话池为新建池提供亚秒级的会话分配时间,并负责每个会话的管理和生命周期。

配置

可以使用以下参数 az containerapp sessionpool create来控制会话池的行为。

目的 资产 Description
设置最大会话数 max-sessions 池中允许的最大并发会话数。 达到最大限制后,进入的请求将返回一个 404 服务器错误,表示不会再向池分配会话。
等待时间 cooldown-period 会话在终止前允许空闲的秒数。 每次调用会话的 API 时,都会重置空闲期。 值必须介于 3003600.
目标会话数量 ready-sessions 池中备妥的目标会话数。

创建池

创建池的过程略有不同,具体取决于是创建代码解释器池还是自定义容器池。

代码解释器池

若要使用 Azure CLI 创建代码解释器会话池,请使用以下命令确保具有最新版本的 Azure CLI 和 Azure 容器应用扩展:

# Upgrade the Azure CLI
az upgrade

# Install or upgrade the Azure Container Apps extension
az extension add --name containerapp --upgrade --allow-preview true -y

使用az containerapps sessionpool create命令创建池。 以下示例创建名为 my-session-pool 的 Python 代码解释器会话池。 在运行命令之前,请确保将 <RESOURCE_GROUP> 替换为您的资源组名称。

az containerapp sessionpool create \
    --name my-session-pool \
    --resource-group <RESOURCE_GROUP> \
    --location westus2 \
    --container-type PythonLTS \
    --max-sessions 100 \
    --cooldown-period 300 \
    --network-status EgressDisabled

创建会话池时,可以定义以下设置:

设置 Description
--container-type 要使用的代码解释器的类型。 支持的值包括 PythonLTSNodeLTSShell
--max-sessions 允许同时分配的最大会话数量。 最大值为 600
--cooldown-period 终止前允许的空闲秒数。 每次调用会话的 API 时,都会重置空闲期。 允许的范围介于 3003600.
--network-status 指定是否允许从会话发送出站网络流量。 有效值为 EgressDisabled (默认值) 和 EgressEnabled

重要

如果启用出口,会话中运行的代码可以访问 Internet。 当代码不受信任时,请小心,因为它可用于执行恶意活动,例如拒绝服务攻击。

获取管理 API 终结点

若要通过 LLM 框架集成或通过直接调用管理 API 终结点来使用代码解释器会话,需要获取池的管理 API 终结点。

终结点采用格式 https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>

若要检索会话池的管理 API 终结点,请使用 az containerapps sessionpool show 该命令。 在运行命令之前,请确保将<RESOURCE_GROUP>替换为你的资源组名称。

az containerapp sessionpool show \
    --name my-session-pool \
    --resource-group <RESOURCE_GROUP> \
    --query 'properties.poolManagementEndpoint' -o tsv

自定义容器池

若要创建自定义容器会话池,需要提供容器映像和池配置设置。

使用 HTTP 请求调用或与每个会话通信。 自定义容器必须在指定的端口上公开 HTTP 服务器以响应这些请求。

若要使用 Azure CLI 创建自定义容器会话池,请使用以下命令确保具有最新版本的 Azure CLI 和 Azure 容器应用扩展:

az upgrade
az extension add --name containerapp --upgrade --allow-preview true -y

自定义容器会话池需要启用了工作负载配置文件的 Azure 容器应用环境。 如果没有环境,请使用 az containerapp env create -n <ENVIRONMENT_NAME> -g <RESOURCE_GROUP> --location <LOCATION> --enable-workload-profiles 命令创建一个。

az containerapp sessionpool create使用命令创建自定义容器会话池。

以下示例创建一个使用自定义容器映像my-session-pool命名myregistry.azurecr.io/my-container-image:1.0的会话池。

在发送请求之前,请将括号之间的 <> 占位符替换为会话池和会话标识符的相应值。

az containerapp sessionpool create \
    --name my-session-pool \
    --resource-group <RESOURCE_GROUP> \
    --environment <ENVIRONMENT> \
    --registry-server myregistry.azurecr.io \
    --registry-username <USER_NAME> \
    --registry-password <PASSWORD> \
    --container-type CustomContainer \
    --image myregistry.azurecr.io/my-container-image:1.0 \
    --cpu 0.25 --memory 0.5Gi \
    --target-port 80 \
    --cooldown-period 300 \
    --network-status EgressDisabled \
    --max-sessions 10 \
    --ready-sessions 5 \
    --env-vars "key1=value1" "key2=value2" \
    --location <LOCATION>

此命令创建具有以下设置的会话池:

参数 价值 Description
--name my-session-pool 会话池的名称。
--resource-group my-resource-group 包含会话池的资源组。
--environment my-environment 容器应用环境的名称或资源 ID。
--container-type CustomContainer 会话池的容器类型。 必须为自定义容器会话的 CustomContainer
--image myregistry.azurecr.io/my-container-image:1.0 用于会话池的容器映像。
--registry-server myregistry.azurecr.io 容器注册表服务器主机名。
--registry-username my-username 要登录到容器注册表的用户名。
--registry-password my-password 登录到容器注册表的密码。
--cpu 0.25 所需的 CPU 核心数量。
--memory 0.5Gi 所需的内存。
--target-port 80 用于入口流量的会话端口。
--cooldown-period 300 会话在终止前允许空闲的秒数。 每次调用会话的 API 时,都会重置空闲期。 值必须介于 3003600.
--network-status EgressDisabled 指定是否允许从会话发送出站网络流量。 有效值为 EgressDisabled (默认值) 和 EgressEnabled
--max-sessions 10 可以同时分配的最大会话数。
--ready-sessions 5 会话池中始终处于就绪状态的目标会话数。 如果会话的分配速度快于池的补充速度,请增加此数字。
--env-vars "key1=value1" "key2=value2" 在容器中设置的环境变量。
--location "Supported Location" 会话池的位置。

若要检查会话池的状态,请使用 az containerapp sessionpool show 以下命令:

az containerapp sessionpool show \
    --name <SESSION_POOL_NAME> \
    --resource-group <RESOURCE_GROUP> \
    --query "properties.poolManagementEndpoint" \
    --output tsv

若要更新会话池,请使用 az containerapp sessionpool update 命令。

重要

如果会话用于运行不受信任的代码,请不要包含不希望不受信任的代码访问的信息或数据。 假设代码是恶意的,并且对容器具有完全访问权限,包括其环境变量、机密和文件。

管理终结点

重要

会话标识符是敏感信息,在创建和管理其值时需要安全进程。 若要保护此值,应用程序必须确保每个用户或租户仅有权访问其自己的会话。

无法保护对会话的访问可能会导致滥用或未经授权的访问存储在用户会话中的数据。 有关详细信息,请参阅 会话标识符

以下终结点可用于管理池中的会话:

终结点路径 方法 Description
code/execute POST 在会话中执行代码。
files/upload POST 将文件上传到会话。
files/content/{filename} GET 从会话下载文件。
files GET 列出会话中的文件。

通过将池的管理 API 终结点与终结点路径连接在一起,为每个终结点生成完整的 URL。 查询字符串必须包含包含 identifier 会话标识符的参数,以及 api-version 具有值 2024-02-02-preview的参数。

例如:https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/code/execute?api-version=2024-02-02-preview&identifier=<IDENTIFIER>

若要检索会话池的管理终结点,请使用 az containerapp sessionpool show 以下命令:

az containerapp sessionpool show \
    --name <SESSION_POOL_NAME> \
    --resource-group <RESOURCE_GROUP> \
    --query "properties.poolManagementEndpoint" \
    --output tsv

对池管理终结点的所有请求都必须包含具有持有者令牌的 Authorization 标头。 若要了解如何使用池管理 API 进行身份验证,请参阅 “身份验证”。

每个 API 请求还必须包含具有会话 ID 的查询字符串参数 identifier 。 此唯一会话 ID 使应用程序能够与特定会话进行交互。 若要了解有关会话标识符的详细信息,请参阅 会话标识符

图像缓存

创建或更新会话池时,Azure 容器应用将缓存池中的容器映像。 此缓存有助于加快创建新会话的过程。

对图像所做的任何更改不会自动反映在会话中。 若要更新映像,请使用新的映像标签更新会话池。 为确保拉取新的映像,每次更新映像时请使用唯一的标签。