使用虛擬網路來保護 Azure Machine Learning 推斷環境 (v1)

適用於:Python SDK azureml v1

適用於:Azure CLI ml 延伸模組 v1

在本文中,您將了解如何在 Azure Machine Learning 中使用虛擬網路來保護推斷環境。 本文專屬於將模型部署為 Web 服務的 SDK/CLI v1 部署工作流程。

提示

本文是關於保護 Azure Machine Learning 工作流程系列文章的一部分。 請參閱本系列的其他文章:

如需關於建立安全工作區的教學課程,請參閱教學課程:建立安全工作區教學課程:使用範本建立安全工作區

在本文中,您將了解如何在虛擬網路中保護下列推斷資源:

  • 預設 Azure Kubernetes Service (AKS) 叢集
  • 私人 AKS 叢集
  • 具有私人連結的 AKS 叢集

必要條件

  • 請參閱網路安全性概觀,以了解常見的虛擬網路情節和整體虛擬網路架構。

  • 用於計算資源的現有虛擬網路和子網路。

  • 若要將資源部署到虛擬網路或子網路,在 Azure 角色型存取控制 (Azure RBAC) 中,您的使用者帳戶必須具有下列動作的權限:

    • 虛擬網路資源上的 "Microsoft.Network/virtualNetworks/join/action"。
    • 子網路資源上的 "Microsoft.Network/virtualNetworks/subnet/join/action"。

    如需 Azure RBAC 搭配網路的詳細資訊,請參閱網路內建角色

重要

本文中的 Azure CLI 命令使用 azure-cli-ml 或 v1 (Azure Machine Learning 的擴充功能)。 v1 擴充功能的支援將於 2025 年 9 月 30 日終止。 您將能安裝並使用 v1 擴充功能,直到該日期為止。

建議您在 2025 年 9 月 30 日之前轉換至 ml 或 v2 擴充功能。 如需有關 v2 擴充功能的詳細資訊,請參閱 Azure ML CLI 擴充功能和 Python SDK v2

限制

Azure Container Instances

當您的 Azure Machine Learning 工作區設為私人端點時,不支援部署至 VNet 中的 Azure 容器執行個體。 請考慮改用具有網路隔離的受控線上端點

Azure Kubernetes Service

  • 如果您的 AKS 叢集位於 VNET 後方,則您的工作區及其相關聯的資源 (儲存體、金鑰保存庫、Azure Container Registry) 必須在與 AKS 叢集的 VNET 相同的 VNET 中具有私人端點或服務端點。 請閱讀教學課程建立安全的工作區,將這些私人端點或服務端點新增至您的 VNET。
  • 如果工作區有私人端點,則 Azure Kubernetes Service 叢集與工作區必須位於相同的 Azure 區域。
  • Azure Machine learning 不支援使用公用完整網域名稱 (FQDN) 搭配私人 AKS 叢集

Azure Kubernetes Service

重要

若要在虛擬網路中使用 AKS 叢集,首先請遵循在 Azure Kubernetes Service (AKS) 中設定進階網路中的必要條件。

若要將虛擬網路中的 AKS 新增工作區,請使用下列步驟:

  1. 登入 Azure Machine Learning Studio,然後選取您的訂用帳戶和工作區。

  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 服務。 其必須位於 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 Machine Learning 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="eastus2")
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 的服務主體或受控識別識別碼,請使用下列 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,請使用下列命令來識別受控識別的主體識別碼:

    az aks show -n <aks-cluster-name> --resource-group <resource-group-name> --query identity.principalId
    
  2. 若要尋找包含虛擬網路的資源群組識別碼,請使用下列命令。 將 <resource-group-name> 換成「包含虛擬網路」的資源群組名稱:

    az group show -n <resource-group-name> --query id
    
  3. 若要將服務主體或受控識別新增為網路參與者,請使用下列命令。 將 <SP-or-managed-identity> 換成針對服務主體或受控識別而傳回的識別碼。 將 <resource-group-id> 換成針對包含虛擬網路的資源群組而傳回的識別碼:

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

如需使用內部負載平衡器搭配 AKS 的詳細資訊,請參閱 使用內部負載平衡器搭配 Azure Kubernetes Service

保護 VNet 流量

有兩種方式可以隔離 AKS 叢集與虛擬網路之間往返的流量:

  • 私人 AKS 叢集:此方法使用 Azure Private Link 來保護與叢集的通訊,以進行部署/管理作業。
  • 內部 AKS 負載平衡器:此方法將用於部署至 AKS 的端點設定為使用虛擬網路內的私人 IP。

私人 AKS 叢集

AKS 叢集的控制平面 (或 API 伺服器) 預設有公用 IP 位址。 您可以建立私人 AKS 叢集,將 AKS 設定為使用私人控制平面。 如需詳細資訊,請參閱建立私人 Azure Kubernetes Service 叢集

建立私人 AKS 叢集之後,請將叢集附加至虛擬網路,以搭配 Azure Machine Learning 使用。

內部 AKS 負載平衡器

AKS 部署預設使用公用負載平衡器。 在本節中,您將了解如何將 AKS 設定為使用內部負載平衡器。 僅允許私人 IP 之處使用內部 (或私人) 負載平衡器作為前端。 內部負載平衡器用來平衡虛擬網路內的流量負載

將 AKS 設定為使用「內部負載平衡器」,即可啟用私人負載平衡器。

啟用私人負載平衡器

重要

在 Azure Machine Learning 工作室中建立 Azure Kubernetes Service 叢集時,無法啟用私人 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 Container Registry。 例如,請確定網路安全性群組 (NSG) 包含規則來允許存取 AzureContainerRegistry.RegionName 服務標籤,其中 {RegionName} 是 Azure 區域的名稱。

後續步驟

本文是關於保護 Azure Machine Learning 工作流程系列文章的一部分。 請參閱本系列的其他文章: