使用虚拟网络保护 Azure 机器学习推理环境 (v1)

适用于:Python SDK azureml v1

适用于:Azure CLI ml 扩展 v1

本文介绍如何在 Azure 机器学习中使用虚拟网络保护推理环境。 本文针对将模型部署为 Web 服务的 SDK/CLI v1 部署工作流。

提示

本文是介绍如何保护 Azure 机器学习工作流系列文章的一部分。 请参阅本系列中的其他文章:

有关创建安全工作区的教程,请参阅教程:创建安全工作区教程:使用模板创建安全工作区

本文介绍如何在虚拟网络中保护以下推理资源:

  • 默认 Azure Kubernetes 服务 (AKS) 群集
  • 专用 AKS 群集
  • 具有专用链接的 AKS 群集

先决条件

  • 阅读网络安全概述一文,了解常见的虚拟网络方案和总体虚拟网络体系结构。

  • 用于计算资源的现有虚拟网络和子网。

  • 若要将资源部署到虚拟网络或子网中,你的用户帐户必须在 Azure 基于角色的访问控制 (Azure RBAC) 中具有以下操作的权限:

    • 虚拟网络资源上的“Microsoft.Network/*/read”。 对于 Azure 资源管理器 (ARM) 模板部署,不需要此权限。
    • “Microsoft.Network/virtualNetworks/join/action”(在虚拟网络资源上)。
    • "Microsoft.Network/virtualNetworks/subnets/join/action"(在子网资源上)。

    若要详细了解如何将 Azure RBAC 与网络配合使用,请参阅网络内置角色

重要

本文中的一些 Azure CLI 命令使用适用于 Azure 机器学习的 azure-cli-ml 或 v1 扩展。 对 v1 扩展的支持将于 2025 年 9 月 30 日结束。 在该日期之前,你将能够安装和使用 v1 扩展。

建议在 2025 年 9 月 30 日之前转换为 ml 或 v2 扩展。 有关 v2 扩展的详细信息,请参阅 Azure ML CLI 扩展和 Python SDK v2

限制

Azure 容器实例

使用专用终结点配置 Azure 机器学习工作区时,不支持部署到 VNet 中的 Azure 容器实例。 相反,请考虑使用具有网络隔离的托管联机终结点

Azure Kubernetes 服务

  • 如果 AKS 群集位于 VNet 后,则工作区及其关联的资源(存储、密钥保管库、Azure 容器注册表)必须在与 AKS 群集相同的 VNet 中具有专用终结点或服务终结点。 请阅读教程创建安全工作区,将这些专用终结点或服务终结点添加到 VNet。
  • 如果工作区具有专用终结点,则 Azure Kubernetes 服务群集必须与工作区位于同一 Azure 区域中。
  • Azure 机器学习不支持使用具有专用 AKS 群集的公共完全限定的域名 (FQDN)

Azure Kubernetes 服务

重要

若要在虚拟网络中使用 AKS 群集,请先遵循在 Azure Kubernetes Service (AKS) 中配置高级网络中的先决条件。

若要将虚拟网络中的 AKS 添加到工作区,请执行以下步骤:

  1. 登录 Azure 机器学习工作室,然后选择你的订阅和工作区。

  2. 在左侧选择“计算”,从中心选择“推理群集”,然后选择“+ 新建” 。

    “创建推理群集”对话框的屏幕截图。

  3. 从“创建推理群集”对话框中选择“新建”以及要用于该群集的 VM 大小 。 最后,选择“下一步”。

    VM 设置的屏幕截图。

  4. 在“配置设置”部分,输入计算名称,选择“群集用途”和“节点数”,然后选择“高级”,以显示网络设置。 在“配置虚拟网络”区域中,设置以下值:

    • 设置要使用的“虚拟网络”。

      提示

      如果工作区使用专用终结点来连接到虚拟网络,则“虚拟网络”选择字段会灰显。

    • 设置要在其中创建该群集的“子网”。

    • 在“Kubernetes 服务地址范围”字段中,输入 Kubernetes 服务地址范围。 此地址范围使用无类域间路由 (CIDR) 表示法表示的 IP 范围来定义群集可用的 IP 地址。 此范围不得与任何子网 IP 范围重叠(例如 10.0.0.0/16)。

    • 在“Kubernetes DNS 服务 IP 地址”字段中,输入 Kubernetes DNS 服务 IP 地址。 此 IP 地址将分配给 Kubernetes DNS 服务。 此 IP 地址必须在 Kubernetes 服务地址范围内(例如 10.0.0.10)。

    • 在“Docker 桥地址”字段中,输入 Docker 桥地址。 此 IP 地址将分配给 Docker 网桥。 该地址不得在任何子网 IP 范围或 Kubernetes 服务地址范围(例如,172.18.0.1/16)内。

    配置网络设置的屏幕截图。

  5. 将模型作为 Web 服务部署到 AKS 时,将创建一个评分终结点来处理推理请求。 如果需要从虚拟网络外部调用评分终结点,请确保用于控制虚拟网络的网络安全组 (NSG) 包含一条已为该终结点的 IP 地址启用的入站安全规则。

    若要查找评分终结点的 IP 地址,请查看已部署服务的评分 URI。 有关查看评分 URI 的详细信息,请参阅使用部署为 Web 服务的模型

    重要

    保留 NSG 的默认出站规则。 有关详细信息,请参阅安全组中的“默认安全规则”。

    显示入站安全规则的屏幕截图。](./media/how-to-secure-inferencing-vnet/aks-vnet-inbound-nsg-scoring.png#lightbox)

    重要

    图像中显示的评分终结点的 IP 地址将因你的部署而异。 尽管一个 AKS 群集的所有部署都将共享同一 IP,但每个 AKS 群集都有不同的 IP 地址。

也可以使用 Azure 机器学习 SDK 在虚拟网络中添加 Azure Kubernetes 服务。 如果虚拟网络中已有一个 AKS 群集,请根据如何部署到 AKS 中所述,将此群集附加到工作区。 以下代码在名为 mynetwork 的虚拟网络的 default 子网中创建新的 AKS 实例:

适用于:Python SDK azureml v1

from azureml.core.compute import ComputeTarget, AksCompute

# Create the compute configuration and set virtual network information
config = AksCompute.provisioning_configuration(location="chinaeast2")
config.vnet_resourcegroup_name = "mygroup"
config.vnet_name = "mynetwork"
config.subnet_name = "default"
config.service_cidr = "10.0.0.0/16"
config.dns_service_ip = "10.0.0.10"
config.docker_bridge_cidr = "172.17.0.1/16"

# Create the compute target
aks_target = ComputeTarget.create(workspace=ws,
                                  name="myaks",
                                  provisioning_configuration=config)

创建过程完成后,可在虚拟网络后面的 AKS 群集上运行推理或模型评分。 有关详细信息,请参阅如何部署 AKS

若要详细了解如何结合使用 Kubernetes 和基于角色的访问控制,请参阅使用 Azure RBAC 进行 Kubernetes 授权

网络参与者角色

重要

如果通过提供之前创建的虚拟网络来创建或附加 AKS 群集,则必须向 AKS 群集的服务主体 (SP) 或托管标识授予对包含虚拟网络的资源组的网络参与者角色。

若要将标识添加为网络参与者,请执行以下步骤:

  1. 若要查找 AKS 的服务主体或托管标识 ID,请使用以下 Azure CLI 命令。 将 <aks-cluster-name> 替换为群集的名称。 将 <resource-group-name> 替换为包含 AKS 群集的资源组的名称:

    az aks show -n <aks-cluster-name> --resource-group <resource-group-name> --query servicePrincipalProfile.clientId
    

    如果此命令返回的值为 msi,请使用以下命令来识别托管标识的主体 ID:

    az aks show -n <aks-cluster-name> --resource-group <resource-group-name> --query identity.principalId
    
  2. 若要查找包含虚拟网络的资源组的 ID,请使用以下命令。 将 <resource-group-name> 替换为包含虚拟网络的资源组的名称:

    az group show -n <resource-group-name> --query id
    
  3. 若要将服务主体或托管标识添加为网络参与者,请使用以下命令。 使用为服务主体或托管标识返回的 ID 替换 <SP-or-managed-identity>。 使用为包含虚拟网络的资源组返回的 ID 替换 <resource-group-id>

    az role assignment create --assignee <SP-or-managed-identity> --role 'Network Contributor' --scope <resource-group-id>
    

若要详细了解如何结合使用内部负载均衡器与 AKS,请参阅结合使用内部负载均衡器与 Azure Kubernetes 服务

保护 VNet 流量

有两种方法可以将往返于 AKS 群集的流量隔离到虚拟网络:

  • 专用 AKS 群集:此方法使用 Azure 专用链接来保护与群集的通信,以便进行部署/管理操作。
  • 内部 AKS 负载均衡器:此方法将终结点(用于将项目部署到 AKS)配置为在虚拟网络中使用专用 IP。

专用 AKS 群集

默认情况下,AKS 群集具有一个带有公共 IP 地址的控制平面(或 API 服务器)。 可以通过创建专用 AKS 群集,将 AKS 配置为使用专用控制平面。 有关详细信息,请参阅创建专用 Azure Kubernetes 服务群集

创建专用 AKS 群集之后,将群集连接到虚拟网络以便用于 Azure 机器学习。

内部 AKS 负载均衡器

默认情况下,AKS 部署使用公共负载均衡器。 在本部分中,你会了解如何将 AKS 配置为使用内部负载均衡器。 内部(或专用)负载平衡器用于仅在前端允许专用 IP 的情况。 内部负载均衡器用于对虚拟网络内部的流量进行负载均衡

可以通过将 AKS 配置为使用内部负载均衡器来启用专用负载均衡器。

启用专用负载均衡器

重要

在 Azure 机器学习工作室中创建 Azure Kubernetes 服务群集时,无法启用专用 IP。 使用 Python SDK 或 Azure CLI 扩展进行机器学习时,可以创建一个具有内部负载均衡器的 AKS 群集。

以下示例演示如何使用 SDK 和 CLI 创建具有专用 IP/内部负载均衡器的新 AKS 群集

适用于:Python SDK azureml v1

import azureml.core
from azureml.core.compute import AksCompute, ComputeTarget

# Verify that cluster does not exist already
try:
    aks_target = AksCompute(workspace=ws, name=aks_cluster_name)
    print("Found existing aks cluster")

except:
    print("Creating new aks cluster")

    # Subnet to use for AKS
    subnet_name = "default"
    # Create AKS configuration
    prov_config=AksCompute.provisioning_configuration(load_balancer_type="InternalLoadBalancer")
    # Set info for existing virtual network to create the cluster in
    prov_config.vnet_resourcegroup_name = "myvnetresourcegroup"
    prov_config.vnet_name = "myvnetname"
    prov_config.service_cidr = "10.0.0.0/16"
    prov_config.dns_service_ip = "10.0.0.10"
    prov_config.subnet_name = subnet_name
    prov_config.load_balancer_subnet = subnet_name
    prov_config.docker_bridge_cidr = "172.17.0.1/16"

    # Create compute target
    aks_target = ComputeTarget.create(workspace = ws, name = "myaks", provisioning_configuration = prov_config)
    # Wait for the operation to complete
    aks_target.wait_for_completion(show_output = True)

将现有集群附加到工作区时,请使用 AksCompute.attach_configuration()load_balancer_typeload_balancer_subnet 参数来配置负载平衡器。

有关附加群集的信息,请参阅附加现有的 AKS 群集

限制来自虚拟网络的出站连接

如果你不想要使用默认的出站规则,同时想要限制虚拟网络的出站访问,则必须允许访问 Azure 容器注册表。 例如,确保网络安全组 (NSG) 包含允许访问“AzureContainerRegistry.RegionName”服务标记的规则,其中的 {RegionName} 是 Azure 区域的名称。

后续步骤

本文是介绍如何保护 Azure 机器学习工作流系列文章的一部分。 请参阅本系列中的其他文章: