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

自托管网关概述

自承载网关是每个 API 管理服务中包含的默认托管网关的可选容器化版本。 对于将网关置于托管 API 的同一环境中等场景,它非常有用。 使用自承载网关可改善 API 流量流,并满足 API 安全性与合规性要求。

本文介绍 Azure API 管理的自托管网关功能如何实现混合和多云 API 管理,从较高层面演示其体系结构,并重点介绍其功能。

有关各种网关产品/服务的功能的概述,请参阅 API 管理中的 API 网关

可用性

重要

此功能在 API 管理的“高级”和“开发人员”层中可用。

有关 v2 层(预览版)中的功能可用性,请参阅 v2 层概述

混合和多云 API 管理

自承载网关功能扩展了混合和多云环境的 API 管理支持,使组织能够安全有效地从 Azure 中的单个 API 管理服务来管理本地和跨云承载的 API。

借助自承载网关,客户可以灵活地将 API 管理网关组件的容器化版本部署到用于承载其 API 的相同环境。 所有自承载网关都是通过与它们联合的 API 管理服务进行管理的,因此,在所有内部和外部 API 中可为客户提供直观统一的管理体验。

每个 API 管理服务由以下关键组件构成:

  • 作为 API 公开的管理平面,用于通过 Azure 门户、PowerShell 和其他支持的机制配置服务。
  • 网关(或数据平面),负责代理 API 请求、应用策略以及收集遥测数据
  • 开发人员门户,供开发人员用来发现、学习 API 以及在登记后使用 API

默认情况下,所有这些组件都部署在 Azure 中,因此,无论实现 API 的后端承载在何处,所有 API 流量(在下图中以黑色实线箭头指示)都会流经 Azure。 此模型虽然在操作上比较简单,但代价是增大延迟,造成合规性问题,而且在某些情况下还会产生额外的数据传输费。

API traffic flow without self-hosted gateways

如果将自托管网关部署到后端 API 实现所在的相同环境,则可以使 API 流量直接流向后端 API,从而减少延迟,减少数据传输成本,并且在实现合规性的同时,可以继续享有单一管理点、以及发现并观察组织中所有 API 的优势,而不管这些 API 的实现托管在何处。

API traffic flow with self-hosted gateways

打包

自托管网关在 Microsoft Artifact Registry 中以基于 Linux 的 Docker 容器映像的形式提供。 它可以部署到 Docker、Kubernetes,或任何其他在本地服务器节点上、云基础结构上或出于评估和开发目的在个人计算机上运行的容器业务流程解决方案。 还可将自承载网关作为群集扩展部署到已启用 Azure Arc 的 Kubernetes 群集

容器映像

为了满足你的需求,我们提供了用于自承载网关的各种容器映像:

标记约定 建议 示例 滚动标记 推荐用于生产
{major}.{minor}.{patch} 使用此标记就可以始终运行同一版本的网关 2.0.0
v{major} 使用此标记就可以始终使用每个新功能和补丁运行一个主版本的网关。 v2
v{major}-preview 如果你始终需要运行最新的预览版容器映像,请使用此标记。 v2-preview
latest 如果要评估自承载网关,请使用此标记。 latest
beta1 如果要评估自托管网关的预览版本,请使用此标记。 beta

可以在此处找到可用标记的完整列表。

1预览版不受官方支持,仅用于实验目的。 请参阅自承载网关支持策略

在我们的官方部署选项中使用标记

Azure 门户中的部署选项使用 v2 标记,使客户可以使用最新版自承载网关 v2 容器映像和所有功能更新及补丁。

注意

我们提供了命令和 YAML 代码片段作为参考,你可以随意使用更具体的标记。

使用 Helm chart 进行安装时,将会为你优化图像标记。 Helm 图表的应用程序版本会将网关固定到给定版本,而不依赖于 latest

详细了解如何使用 Helm 在 Kubernetes 上安装 API 管理自托管网关

使用滚动标记的风险

滚动标记是发布新版容器映像时可能会更新的标记。 因此,容器用户可接收容器映像的更新,而无需更新其部署。

这意味着你可能会在不知道的情况下并行运行不同版本,例如,在更新 v2 标记后执行缩放操作时就是如此。

示例 - v2 标记已通过 2.0.0 容器映像发布,但当发布 2.1.0 时,v2 标记将链接到 2.1.0 映像。

重要

请考虑在生产环境中使用特定版本的标记,以避免无意中升级到较新版本。

连接到 Azure

自托管网关需要通过端口 443 来与 Azure 建立出站 TCP/IP 连接。 每个自托管网关必须与单个 API 管理服务相关联,并通过其管理平面进行配置。 自托管网关使用与 Azure 的连接来执行以下操作:

  • 通过每隔一分钟发送检测信号消息来报告自身的状态
  • 定期(每隔 10 秒)检查配置更新,每当有可用更新时应用这些更新
  • 将指标发送到 Azure Monitor(如果采用此配置)
  • 将事件发送到 Application Insights(如果采用此设置)

重要

对 Azure API 管理自承载网关版本 0 和版本 1 容器映像的支持及其相应配置 API v1 将于 2023 年 10 月 1 日结束。 使用迁移指南,将自承载网关 v2.0.0 或更高版本与配置 API v2 结合使用。 在弃用文档中了解详细信息

FQDN 依赖项

若要正常运行,每个自托管网关需要在端口 443 上与以下终结点建立出站连接,这些终结点与其基于云的 API 管理示例关联:

说明 v1 所需 v2 所需 注释
的配置终结点的主机名 <apim-service-name>.management.azure-api.net <apim-service-name>.configuration.azure-api.net1 还支持自定义主机名,可以使用自定义主机名,而不是默认主机名。
API 管理实例的公网 IP 地址 主要位置的 IP 地址足以满足需要。
Azure 存储服务标记的公共 IP 地址 可选2 IP 地址必须与 API 管理实例的主要位置相对应。
Azure Blob 存储帐户的主机名 可选2 与实例 (<blob-storage-account-name>.blob.core.windows.net) 关联的帐户
Azure 表存储帐户的主机名 可选2 与实例 (<table-storage-account-name>.table.core.windows.net) 关联的帐户
适用于 Azure 资源管理器的终结点 可选3 所需的终结点为 management.azure.com
用于 Microsoft Entra 集成的终结点 可选4 所需的终结点包括 <region>.login.microsoft.comlogin.microsoftonline.com
Azure Application Insights 集成的终结点 可选5 可选5 最少需要的终结点是:
  • rt.services.visualstudio.com:443
  • dc.services.visualstudio.com:443
  • {region}.livediagnostics.monitor.azure.com:443
Azure Monitor 文档中了解详细信息
事件中心集成的终结点 可选5 可选5 Azure 事件中心文档中进行详细的了解
外部缓存集成的终结点 可选5 可选5 此要求取决于正在使用的外部缓存

1对于内部虚拟网络中的 API 管理实例,请从自承载网关的位置启用到 v2 配置终结点的专用连接,例如,在对等互连网络中使用专用 DNS。
2仅当在策略中使用 API 检查器或配额时才需要在 v2 中。
3只有使用 Microsoft Entra 身份验证对 RBAC 权限进行验证时才需要。
4只有使用 Microsoft Entra 身份验证或 Microsoft Entra 相关策略时才需要。
5仅在使用了功能并且需要公共 IP 地址、端口和主机名信息时需要。

重要

  • DNS 主机名必须可解析为 IP 地址,并且相应的 IP 地址必须可访问。
  • 关联的存储帐户名称列在 Azure 门户的服务的“网络连接状态”页。
  • 关联存储帐户下的公共 IP 地址是动态的,可能在不另行通知的情况下更改。

身份验证选项

若要对自承载网关与基于云的 API 管理实例的配置终结点之间的连接进行身份验证,可在网关容器的配置设置中使用以下选项。

选项 注意事项
Microsoft Entra 身份验证 配置一个或多个 Microsoft Entra 应用以访问网关

按应用单独管理访问权限

根据组织的策略为机密配置更长的过期时间

使用标准 Microsoft Entra 过程向应用分配或撤销用户或组权限,并轮换机密

网关访问令牌(也称为身份验证密钥) 令牌最多每 30 天过期一次,必须在容器中续订

由可以独立轮换的网关密钥提供支持(例如,撤销访问权限)

重新生成网关密钥时,使用它创建的所有访问令牌都会失效

连接失败

与 Azure 断开连接时,自托管网关无法接收配置更新、报告自身的状态或上传遥测数据。

自托管网关采用“静态失败”设计,在暂时与 Azure 断开连接时可以留存。 可以在启用或不启用本地配置备份的情况下部署自托管网关。 通过配置备份,自托管网关会定期将下载配置的备份副本保存在已附加到其容器或 pod 的持久性卷上。

已禁用配置备份且与 Azure 中断连接时:

  • 正在运行的自托管网关将使用配置的内存中副本继续正常工作
  • 已停止的自承载网关将无法启动

已启用配置备份且与 Azure 中断连接时:

  • 正在运行的自托管网关将使用配置的内存中副本继续正常工作
  • 已停止的自托管网关将可以使用配置的备份副本启动

连接恢复后,受中断影响的每个自承载网关将自动重新连接到其关联的 API 管理服务,并下载它处于“脱机”状态时发生的所有配置更新。

安全性

限制

托管网关中的以下功能在自托管网关中不可用:

  • TLS 会话恢复。
  • 客户端证书重新协商。 若要使用客户端证书身份验证,API 使用者必须出示其证书作为初始 TLS 握手的一部分。 为确保此行为,请在配置自承载网关自定义主机名(域名)时启用协商客户端证书设置。

传输层安全 (TLS) (Transport Layer Security) (TLS)

重要

此概述仅适用于自承载网关 v1 和 v2。

支持的协议

默认情况下,自承载网关支持 TLS v1.2。

使用自定义域的客户可以在控制平面启用 TLS v1.0 和/或 v1.1。

可用密码套件

重要

此概述仅适用于自承载网关 v2。

自承载网关对客户端和服务器连接使用以下密码套件:

  • TLS_AES_256_GCM_SHA384
  • TLS_CHACHA20_POLY1305_SHA256
  • TLS_AES_128_GCM_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  • TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
  • TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  • TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  • TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  • TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  • TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  • TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
  • TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
  • TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  • TLS_RSA_WITH_AES_256_GCM_SHA384
  • TLS_RSA_WITH_AES_128_GCM_SHA256
  • TLS_RSA_WITH_AES_256_CBC_SHA256
  • TLS_RSA_WITH_AES_128_CBC_SHA256
  • TLS_RSA_WITH_AES_256_CBC_SHA
  • TLS_RSA_WITH_AES_128_CBC_SHA

管理密码套件

从 v2.1.1 及更高版本起,可以通过配置管理正在使用的密码:

  • 使用 net.server.tls.ciphers.allowed-suites 可以定义以逗号分隔的密码列表,以用于 API 客户端和自承载网关之间的 TLS 连接。
  • 使用 net.client.tls.ciphers.allowed-suites 可以定义以逗号分隔的密码列表,以用于自承载网关和后端之间的 TLS 连接。

后续步骤