你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
适用于:开发人员 | 高级
本文提供将 Azure API 管理 自承载网关 组件部署到 Azure 容器应用的步骤。
将自承载网关部署到容器应用,以访问托管在同一 Azure 容器应用环境中的 API。
先决条件
完成以下快速入门: 创建 Azure API 管理实例。
对于 Azure CLI:
在 Azure Cloud Shell 中使用 Bash 环境。 有关详细信息,请参阅 Azure Cloud Shell 入门。
如需在本地运行 CLI 参考命令,请安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI。
如果使用的是本地安装,请使用 az login 命令登录到 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅 使用 Azure CLI 向 Azure 进行身份验证。
出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展的详细信息,请参阅 使用和管理 Azure CLI 中的扩展。
运行az version命令,以查看已安装的版本和依赖库。 若要升级到最新版本,请运行az upgrade。
注释
本文中的 Azure CLI 命令示例需要
containerappAzure CLI 扩展。 如果尚未使用az containerapp命令,则运行第一个az containerapp命令时,扩展会动态安装。 详细了解 Azure CLI 扩展。
在 Azure API 管理实例中预配网关
在部署自承载网关之前,请在 Azure API 管理实例中预配网关资源。 有关步骤,请参阅 配置自托管网关。 在本文的示例中,网关被命名为my-gateway。
从 API 管理获取网关部署设置
若要部署网关,需要网关的 令牌 和 配置终结点 值。 可以在 Azure 门户中找到它们:
- 登录到 Azure 门户,并转到 Azure API 管理实例。
- 在左侧菜单中的 “部署 + 基础结构”下,选择 “自承载网关”。
- 选择预配的网关资源,然后选择 “设置>部署”。
- 复制 令牌 和 配置终结点 值。
将自托管网关部署到容器应用
可以使用 Azure 门户、Azure CLI 或其他工具将自承载网关容器映像部署到容器应用。 本文介绍使用 Azure CLI 的步骤。
创建容器应用环境
首先,使用 az containerapp env create 命令创建容器应用环境:
#!/bin/bash
az containerapp env create --name my-environment --resource-group myResourceGroup \
--location centralus
此命令创建:
- 用于对容器应用进行分组的
my-environment容器应用环境。 - 日志分析工作区
为自承载网关创建容器应用
若要将自承载网关部署到环境中的容器应用,请运行 az containerapp create 命令。
首先为 Azure API 管理网关资源中的“令牌”和“配置终结点”值设置变量。
#!/bin/bash
endpoint="<API Management configuration endpoint>"
token="<API Management gateway token>"
使用 az containerapp create 以下命令创建容器应用:
#!/bin/bash
az containerapp create --name my-gateway \
--resource-group myResourceGroup --environment 'my-environment' \
--image "mcr.microsoft.com/azure-api-management/gateway:2.9.2" \
--target-port 8080 --ingress external \
--min-replicas 1 --max-replicas 3 \
--env-vars "config.service.endpoint"="$endpoint" "config.service.auth"="$token" "net.server.http.forwarded.proto.enabled"="true"
此命令创建:
名为
my-gateway的容器应用在myResourceGroup资源组中。 在此示例中,容器应用使用mcr.microsoft.com/azure-api-management/gateway:2.9.2映像。 有关自托管网关的详细信息,请参阅 容器映像。支持端口 8080 上的容器应用外部入口。
容器应用的至少 1 个副本和最多 3 个副本。
通过在环境变量中传递配置值,实现从自承载网关到 Azure API 管理实例的连接。 有关详细信息,请参阅自主托管网关容器配置参数。
注释
Azure 容器应用入口将 HTTPS 请求转发到自托管网关容器应用,转换为 HTTP。 此处,环境变量
net.server.http.forwarded.proto.enabled设置为true使自承载网关使用X-Forwarded-Proto标头来确定请求的原始协议。
确认容器应用正在运行
登录到 Azure 门户,并转到容器应用。
在容器应用的“概述”页上,检查状态是否正在运行。
将测试请求发送到状态端点
/status-012345678990abcdef。 例如,使用类似于以下的curl命令。curl -i https://my-gateway.happyvalley-abcd1234.centralus.azurecontainerapps.io/status-012345678990abcdef成功的请求返回
200 OK响应。
小窍门
使用 CLI,还可以运行 az containerapp show 命令来检查容器应用的状态。
确认网关健康状态正常
登录到 Azure 门户 并转到 Azure API 管理实例。
在左侧菜单中的 “部署 + 基础结构”下,选择 “自承载网关”。
在 “概述 ”页上,检查网关 的状态。 如果网关正常,它将报告常规网关检测信号。
示例方案
以下示例演示如何使用自承载网关访问在同一环境中的容器应用中托管的 API。 如下图所示,可以从 Internet 访问自承载网关,而 API 只能在容器应用环境中访问。
- 在与自承载网关相同的环境中部署托管 API 的容器应用。
- 将 API 添加到 Azure API 管理实例。
- 通过自托管网关调用 API。
在与自承载网关相同的环境中部署托管 API 的容器应用
在此示例中,将示例音乐专辑 API 部署到容器应用。 若要稍后使用自承载网关访问 API,请在与自承载网关相同的环境中部署 API。 有关此示例中使用的资源的详细步骤和信息,请参阅 快速入门:从本地源代码生成和部署到 Azure 容器应用。 缩写的步骤如下:
将 Python 源代码 下载到本地计算机。 如果愿意,请使用所选其他语言下载源代码。
将源代码提取到本地文件夹,并更改为 containerapps-albumapi-python-main/src 文件夹。
运行以下 az containerapp up 命令,将 API 部署到与自承载网关相同的环境中的容器应用。
.请注意命令末尾,该命令将当前文件夹指定为容器应用的源。#!/bin/bash az containerapp up --name albums-api \ --resource-group myResourceGroup --location centralus \ --environment my-environment --source .确认容器应用正在运行,并且可以通过命令输出中返回的 FQDN 外部访问。 默认情况下,API 可在
/albums终结点上访问。 示例:https://albums-api.happyvalley-abcd1234.centralus.azurecontainerapps.io/albums/albums。
为内部入口配置 API
现在更新托管示例 API 的容器应用,以仅在容器环境中启用流入量。 此设置仅限制从部署的自承载网关访问 API。
- 登录到 Azure 门户,并转到容器应用。
- 在左侧菜单中,选择 “网络>入口”。
- 将 入口 设置为 “已启用”。
- 在 入口流量中,选择“ 仅限容器应用环境”。
- 查看其余设置,然后选择“ 保存”。
将 API 添加到 Azure API 管理实例
以下步骤演示如何将 API 添加到 Azure API 管理实例并配置 API 后端。 有关详细信息,请参阅 将 API 添加到 Azure API 管理。
将 API 添加到 API 管理实例
- 在 Azure 门户中,转到配置自承载网关的 API 管理实例。
- 在左侧菜单中,选择 API>API>+ 添加 API。
- 选择HTTP,再选择完整。 输入以下设置:
- 显示名称:输入描述性名称。 示例: 相册 API。
-
Web 服务 URL:输入容器应用托管的 API 内部 FQDN。 示例:
http://albums-api.internal.happyvalley-abcd1234.centralus.azurecontainerapps.io。 - URL 方案:选择 “HTTP(S)”。
- API URL 后缀:输入所选的后缀。 示例: albumapi。
- 网关:选择预配的自托管网关。 示例: my-gateway。
- 根据方案配置其他 API 设置。 选择 创建。
添加 API 操作
- 在左侧菜单中,选择 API>相册 API。
- 选择 “+ 添加操作”。
- 输入作业设置:
- 显示名称:输入操作的描述性名称。 示例: 获取专辑。
URL :选择获取 并为终结点输入 。 - 选择“保存”。
通过自托管网关调用 API
使用容器应用中运行的自托管网关的 FQDN 来调用 API。 在 Azure 门户的容器应用的 “概述 ”页上找到 FQDN,或运行以下命令 az containerapp show 。
#!/bin/bash
az containerapp show --name my-gateway --resource-group myResourceGroup \
--query "properties.configuration.ingress.fqdn" --output tsv
例如,运行以下 curl 命令以在 /albumapi/albums 终结点上调用 API。 如果 API 需要订阅密钥,请将 API 管理实例的有效订阅密钥作为请求中的标头传递:
curl -i https://my-gateway.happyvalley-abcd1234.centralus.azurecontainerapps.io/albumapi/albums -H "Ocp-Apim-Subscription-Key: <subscription-key>"
当测试成功时,后端会使用成功的 HTTP 响应代码和某些数据进行响应。
HTTP/1.1 200 OK
content-length: 751
content-type: application/json
date: Wed, 28 Feb 2024 22:45:09 GMT
[...]
[{"id":1,"title":"You, Me and an App Id","artist":"Daprize","price":10.99,"image_url":"https://aka.ms/albums-daprlogo"},{"id":2,"title":"Seven Revision Army","artist":"The Blue-Green Stripes","price":13.99,"image_url":"https://aka.ms/albums-containerappslogo"},{"id":3,"title":"Scale It Up","artist":"KEDA Club","price":13.99,"image_url":"https://aka.ms/albums-kedalogo"},{"id":4,"title":"Lost in Translation","artist":"MegaDNS","price":12.99,"image_url":"https://aka.ms/albums-envoylogo"},{"id":5,"title":"Lock Down Your Love","artist":"V is for VNET","price":12.99,"image_url":"https://aka.ms/albums-vnetlogo"},{"id":6,"title":"Sweet Container O' Mine","artist":"Guns N Probeses","price":14.99,"image_url":"https://aka.ms/albums-containerappslogo"}]
小窍门
如果启用将 API 日志记录到 Application Insights,可查询日志来查看请求和响应。
局限性
自托管网关实例依赖于 UDP 协议进行 心跳信号和速率限制通信。 由于 Azure 容器应用当前不支持 UDP 协议,既不支持入口流量,也不支持内部流量,因此 rate-limit 策略无法跨实例同步其计数器。 因此,维护限制为 X 的自托管网关容器应用的三个副本可能会导致流量高达三倍,直到达到限制 X。
Azure 容器应用将请求线性分配到每个可用且运行正常的副本。 若要实现速率限制,可以将所需限制除以要运行的副本数,并在配置中设置结果值。 此方法有其自身的缺点,因为当容器应用缩放时,可能无法考虑调整后的计数器。