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

Azure 虚拟机规模集的网络配置

通过门户部署Azure虚拟机规模集时,会默认使用某些网络属性,例如具有入站 NAT 规则的Azure 负载均衡器。 本文介绍如何使用部分较高级的可以对规模集配置的网络功能。

可以使用Azure 资源管理器模板配置本文中介绍的所有功能。 Azure CLI和 PowerShell 示例也包含在所选功能中。

注意

无法将虚拟机规模集从一个虚拟网络移到另一个虚拟网络。 必须在目标虚拟网络中重新创建规模集。

加速网络

Azure加速网络通过将单个根 I/O 虚拟化(SR-IOV)启用到虚拟机来提高网络性能。 若要了解有关使用加速网络的详细信息,请参阅适用于 WindowsLinux 虚拟机的加速网络。 若要对规模集使用加速网络,请在规模集的 networkInterfaceConfigurations 设置中将 enableAcceleratedNetworking 设置为 true。 例如:

"networkProfile": {
    "networkInterfaceConfigurations": [
    {
      "name": "niconfig1",
      "properties": {
        "primary": true,
        "enableAcceleratedNetworking" : true,
        "ipConfigurations": [
          ...
        ]
      }
    }
   ]
}

Azure虚拟机规模集与Azure负载均衡器

请参阅 Azure 负载均衡器 和 虚拟机规模集,详细了解如何根据方案使用虚拟机规模集配置标准负载均衡器。

将虚拟机规模集添加到应用程序网关

若要将规模集添加到应用程序网关的后端池,请在规模集的网络配置文件中引用应用程序网关后端池。 在创建规模集时(参阅下方的 ARM 模板)或在现有规模集上可以完成此操作。

将统一编排的虚拟机规模集添加到应用程序网关

在将统一虚拟机规模集添加到应用网关的后端池时,对于新的规模集或现有的规模集,过程有所不同:

  • 对于新规模集,请在一个或多个网络接口 IP 配置下的规模集模型的网络配置文件中,引用应用程序网关的后端池 ID。 部署后,添加到规模集的实例将放置在应用程序网关的后端池中。
  • 对于现有规模集,请先在规模集模型的网络配置文件中添加应用程序网关的后端池 ID,然后通过升级对现有实例应用模型。 如果规模集的升级策略为 AutomaticRolling,则将为你更新实例。 Manual如果是,则需要手动升级实例。

注意

应用程序网关必须与规模集在同一虚拟网络中,但必须与规模集在不同子网中。

  1. 如果还没有应用程序网关和后端池,请在规模集所在的同一区域中创建一个应用程序网关和后端池
  2. 在门户中导航到虚拟机规模集
  3. 在“设置”下,打开“网络”窗格
  4. 在“网络”窗格中,选择“ 负载均衡 ”选项卡,然后选择“ 添加负载均衡”
  5. 从“负载均衡选项”下拉列表中选择“应用程序网关”,然后选择现有应用程序网关
  6. 选择目标后端池,然后选择“ 保存”
  7. 如果您的规模集升级策略为“手动”,请导航到设置>实例窗格以选择和升级每个实例。

将灵活编排的虚拟机规模集添加到应用程序网关

将灵活规模集添加到应用程序网关时,该过程与将独立 VM 添加到应用程序网关的后端池相同,即将虚拟机的网络接口 IP 配置更新为后端池的一部分。 通过应用程序网关的配置或通过配置虚拟机的网络接口配置可以完成此操作。

注意

请注意,应用程序网关必须与规模集在同一虚拟网络中,但必须与规模集在不同子网中。

可配置的 DNS 设置

默认情况下,规模集采用在其中创建的虚拟网络和子网的特定 DNS 设置。 但是,你可以直接为规模集配置 DNS 设置。

通过可配置的 DNS 服务器创建规模集

若要通过 Azure CLI 使用自定义 DNS 配置创建规模集,请在 vmss create 命令中添加 --dns-servers 参数,并后接空格分隔的服务器 IP 地址。 例如:

--dns-servers 10.0.0.6 10.0.0.5

若要在 Azure 模板中配置自定义 DNS 服务器,请将 dnsSettings 属性添加到虚拟机规模集的 networkInterfaceConfigurations 部分。 例如:

"dnsSettings":{
    "dnsServers":["10.0.0.6", "10.0.0.5"]
}

使用可配置的虚拟机域名创建规模集

若要通过 CLI 使用自定义 DNS 名称为虚拟机创建规模集,请将 --vm-domain-name 参数添加到 Virtual Machine Scale Set create 命令中,后接表示域名的字符串。

若要在Azure模板中设置域名,请将 dnsSettings 属性添加到规模集 networkInterfaceConfigurations 节。 例如:

"networkProfile": {
  "networkInterfaceConfigurations": [
    {
    "name": "nic1",
    "properties": {
      "primary": true,
      "ipConfigurations": [
      {
        "name": "ip1",
        "properties": {
          "subnet": {
            "id": "[concat('/subscriptions/', subscription().subscriptionId,'/resourceGroups/', resourceGroup().name, '/providers/Microsoft.Network/virtualNetworks/', variables('vnetName'), '/subnets/subnet1')]"
          },
          "publicIPAddressconfiguration": {
            "name": "publicip",
            "properties": {
            "idleTimeoutInMinutes": 10,
              "dnsSettings": {
                "domainNameLabel": "[parameters('vmssDnsName')]"
              }
            }
          }
        }
      }
    ]
    }
}

单个虚拟机 DNS 名称的输出采用以下形式:

<vm><vmindex>.<specifiedVmssDomainNameLabel>

每个虚拟机的公共 IPv4

通常,Azure规模集虚拟机不需要自己的公共 IP 地址。 大多数情况下,将公共 IP 地址关联到负载均衡器或单个虚拟机(又称 jumpbox)更经济,也更安全,后者随后会根据需要通过特定方式(例如,通过入站 NAT 规则)将传入连接路由到规模集虚拟机。

但某些情况下,确实需要规模集虚拟机拥有自己的公共 IP 地址。 例如,玩游戏时,主机需直接连接到云虚拟机进行游戏的物理处理。 再举例来说,虚拟机有时需在分布式数据库中跨区域进行外部互连。

重要

由于规模考虑,不建议将 500 多个公共 IP 地址与单个虚拟机规模集实例相关联。

使用公共 IP 为每个虚拟机创建规模集

若要通过 CLI 创建向每个虚拟机分配公共 IP 地址的规模集,请将 --public-ip-per-vm 参数添加到 vmss create 命令中 。

若要使用Azure模板创建规模集, 确保 Microsoft.Compute/virtualMachineScaleSets 资源的 API 版本至少为 2017-03-30,并将 publicIpAddressConfiguration JSON 属性添加到规模集 ipConfigurations 部分。 例如:

"publicIpAddressConfiguration": {
    "name": "pub1",
    "sku": {
      "name": "Standard"
    },
    "properties": {
      "idleTimeoutInMinutes": 15
    }
}

请注意,当创建前端配有负载均衡器且每个实例都具有公共 IP 的虚拟机规模集时,实例 IP 的 SKU 由负载均衡器的 SKU 决定(即“基本”或“标准”)。 如果在没有负载均衡器的情况下创建虚拟机规模集,则可以使用模板的 SKU 部分直接设置实例 IP 的 SKU,如上所示。

使用基本负载均衡器的示例模板:vmss-public-ip-linux

或者,可使用公共 IP 前缀(标准 SKU 公共 IP 的连续块)在虚拟机规模集中生成实例级 IP。 前缀的可用性区域属性将传递给实例 IP,尽管它们不会显示在输出中。

使用公共 IP 前缀的示例模板:vmss-with-public-ip-prefix

在规模集中查询虚拟机的公共 IP 地址

若要通过 CLI 列出分配到规模集虚拟机的公共 IP 地址,请使用 az vmss list-instance-public-ips 命令。

若要使用 PowerShell 列出规模集的公共 IP 地址,请使用Get-AzPublicIpAddress 命令。 例如:

Get-AzPublicIpAddress -ResourceGroupName myrg -VirtualMachineScaleSetName myvmss

也可以通过直接引用公共 IP 地址配置的资源 ID 来查询公共 IP 地址。 例如:

Get-AzPublicIpAddress -ResourceGroupName myrg -Name myvmsspip

还可以通过查询 Azure 资源管理器 或具有版本 2017-03-30 或更高版本的 Azure REST API 来显示分配给规模集的虚拟机的公共 IP 地址。

若要查询 Azure 资源资源管理器

  1. 在 Web 浏览器中打开 Azure 资源资源管理器
  2. 展开左侧的订阅,方法是单击其旁边的 +。 如果在“订阅”下只有一个项,则“订阅”可能已展开。
  3. 展开订阅。
  4. 展开资源组。
  5. 展开提供程序。
  6. 展开 Microsoft.Compute
  7. 展开 virtualMachineScaleSets
  8. 展开规模集。
  9. 选择 publicipaddresses

查询Azure REST API:

GET https://management.azure.com/subscriptions/{your sub ID}/resourceGroups/{RG name}/providers/Microsoft.Compute/virtualMachineScaleSets/{scale set name}/publicipaddresses?api-version=2017-03-30

Azure 资源资源管理器和Azure REST API 的示例输出:

{
  "value": [
    {
      "name": "pub1",
      "id": "/subscriptions/your-subscription-id/resourceGroups/your-rg/providers/Microsoft.Compute/virtualMachineScaleSets/pipvmss/virtualMachines/0/networkInterfaces/pipvmssnic/ipConfigurations/yourvmssipconfig/publicIPAddresses/pub1",
      "etag": "W/\"a64060d5-4dea-4379-a11d-b23cd49a3c8d\"",
      "properties": {
        "provisioningState": "Succeeded",
        "resourceGuid": "ee8cb20f-af8e-4cd6-892f-441ae2bf701f",
        "ipAddress": "13.84.190.11",
        "publicIPAddressVersion": "IPv4",
        "publicIPAllocationMethod": "Dynamic",
        "idleTimeoutInMinutes": 15,
        "ipConfiguration": {
          "id": "/subscriptions/your-subscription-id/resourceGroups/your-rg/providers/Microsoft.Compute/virtualMachineScaleSets/yourvmss/virtualMachines/0/networkInterfaces/yourvmssnic/ipConfigurations/yourvmssipconfig"
        }
      }
    },
    {
      "name": "pub1",
      "id": "/subscriptions/your-subscription-id/resourceGroups/your-rg/providers/Microsoft.Compute/virtualMachineScaleSets/yourvmss/virtualMachines/3/networkInterfaces/yourvmssnic/ipConfigurations/yourvmssipconfig/publicIPAddresses/pub1",
      "etag": "W/\"5f6ff30c-a24c-4818-883c-61ebd5f9eee8\"",
      "properties": {
        "provisioningState": "Succeeded",
        "resourceGuid": "036ce266-403f-41bd-8578-d446d7397c2f",
        "ipAddress": "13.84.159.176",
        "publicIPAddressVersion": "IPv4",
        "publicIPAllocationMethod": "Dynamic",
        "idleTimeoutInMinutes": 15,
        "ipConfiguration": {
          "id": "/subscriptions/your-subscription-id/resourceGroups/your-rg/providers/Microsoft.Compute/virtualMachineScaleSets/yourvmss/virtualMachines/3/networkInterfaces/yourvmssnic/ipConfigurations/yourvmssipconfig"
        }
      }
    }

每个 NIC 多个 IP 地址

在规模集中,附加到 VM 的每个 NIC 可以有一个或多个关联的 IP 配置。 每个配置分配有一个专用 IP 地址。 每个配置还可以有一个关联的公共 IP 地址资源。 若要了解可以分配给 NIC 的 IP 地址数,以及可在 Azure 订阅中使用的公共 IP 地址数,请参阅 Azure 限制

每个虚拟机多个 NIC

每个虚拟机最多可以有 8 个 NIC,具体取决于虚拟机大小。 若要了解每个虚拟机的最大 NIC 数,请参阅 VM 大小一文。 连接到 VM 实例的所有 NIC 都必须连接到同一虚拟网络。 NIC 可以连接到不同子网,但所有子网都必须属于同一虚拟网络。

以下示例为规模集网络配置文件,显示每个虚拟机有多个 NIC 条目和多个公共 IP:

"networkProfile": {
    "networkInterfaceConfigurations": [
        {
        "name": "nic1",
        "properties": {
            "primary": true,
            "ipConfigurations": [
            {
                "name": "ip1",
                "properties": {
                "subnet": {
                    "id": "[concat('/subscriptions/', subscription().subscriptionId,'/resourceGroups/', resourceGroup().name, '/providers/Microsoft.Network/virtualNetworks/', variables('vnetName'), '/subnets/subnet1')]"
                },
                "publicipaddressconfiguration": {
                    "name": "pub1",
                    "properties": {
                    "idleTimeoutInMinutes": 15
                    }
                },
                "loadBalancerInboundNatPools": [
                    {
                    "id": "[concat('/subscriptions/', subscription().subscriptionId,'/resourceGroups/', resourceGroup().name, '/providers/Microsoft.Network/loadBalancers/', variables('lbName'), '/inboundNatPools/natPool1')]"
                    }
                ],
                "loadBalancerBackendAddressPools": [
                    {
                    "id": "[concat('/subscriptions/', subscription().subscriptionId,'/resourceGroups/', resourceGroup().name, '/providers/Microsoft.Network/loadBalancers/', variables('lbName'), '/backendAddressPools/addressPool1')]"
                    }
                ]
                }
            }
            ]
        }
        },
        {
        "name": "nic2",
        "properties": {
            "primary": false,
            "ipConfigurations": [
            {
                "name": "ip1",
                "properties": {
                "subnet": {
                    "id": "[concat('/subscriptions/', subscription().subscriptionId,'/resourceGroups/', resourceGroup().name, '/providers/Microsoft.Network/virtualNetworks/', variables('vnetName'), '/subnets/subnet1')]"
                },
                "publicipaddressconfiguration": {
                    "name": "pub1",
                    "properties": {
                    "idleTimeoutInMinutes": 15
                    }
                },
                "loadBalancerInboundNatPools": [
                    {
                    "id": "[concat('/subscriptions/', subscription().subscriptionId,'/resourceGroups/', resourceGroup().name, '/providers/Microsoft.Network/loadBalancers/', variables('lbName'), '/inboundNatPools/natPool1')]"
                    }
                ],
                "loadBalancerBackendAddressPools": [
                    {
                    "id": "[concat('/subscriptions/', subscription().subscriptionId,'/resourceGroups/', resourceGroup().name, '/providers/Microsoft.Network/loadBalancers/', variables('lbName'), '/backendAddressPools/addressPool1')]"
                    }
                ]
                }
            }
            ]
        }
        }
    ]
}

每个规模集的 NSG 和 ASG

网络安全组允许您使用安全规则筛选Azure虚拟网络中Azure资源的流入和流出流量。 应用安全组使你能够处理Azure资源的网络安全,并将其分组为应用程序的结构的扩展。

可以直接向规模集应用网络安全组,只需将引用添加到规模集虚拟机属性的网络接口配置节即可。

也可以直接为规模集指定应用程序安全组,只需将引用添加到规模集虚拟机属性的网络接口 IP 配置节即可。

例如:

"networkProfile": {
    "networkInterfaceConfigurations": [
        {
            "name": "nic1",
            "properties": {
                "primary": true,
                "ipConfigurations": [
                    {
                        "name": "ip1",
                        "properties": {
                            "subnet": {
                                "id": "[concat('/subscriptions/', subscription().subscriptionId,'/resourceGroups/', resourceGroup().name, '/providers/Microsoft.Network/virtualNetworks/', variables('vnetName'), '/subnets/subnet1')]"
                            },
                            "applicationSecurityGroups": [
                                {
                                    "id": "[concat('/subscriptions/', subscription().subscriptionId,'/resourceGroups/', resourceGroup().name, '/providers/Microsoft.Network/applicationSecurityGroups/', variables('asgName'))]"
                                }
                            ],
                "loadBalancerInboundNatPools": [
                                {
                                    "id": "[concat('/subscriptions/', subscription().subscriptionId,'/resourceGroups/', resourceGroup().name, '/providers/Microsoft.Network/loadBalancers/', variables('lbName'), '/inboundNatPools/natPool1')]"
                                }
                            ],
                            "loadBalancerBackendAddressPools": [
                                {
                                    "id": "[concat('/subscriptions/', subscription().subscriptionId,'/resourceGroups/', resourceGroup().name, '/providers/Microsoft.Network/loadBalancers/', variables('lbName'), '/backendAddressPools/addressPool1')]"
                                }
                            ]
                        }
                    }
                ],
                "networkSecurityGroup": {
                    "id": "[concat('/subscriptions/', subscription().subscriptionId,'/resourceGroups/', resourceGroup().name, '/providers/Microsoft.Network/networkSecurityGroups/', variables('nsgName'))]"
                }
            }
        }
    ]
}

若要验证网络安全组是否与规模集相关联,请使用 az vmss show 命令。 下面的示例使用 --query 来筛选结果,只显示输出的相关部分。

az vmss show \
    -g myResourceGroup \
    -n myScaleSet \
    --query virtualMachineProfile.networkProfile.networkInterfaceConfigurations[].networkSecurityGroup

[
  {
    "id": "/subscriptions/.../resourceGroups/myResourceGroup/providers/Microsoft.Network/networkSecurityGroups/nsgName",
    "resourceGroup": "myResourceGroup"
  }
]

若要验证应用程序安全组是否与规模集相关联,请使用 az vmss show 命令。 下面的示例使用 --query 来筛选结果,只显示输出的相关部分。

az vmss show \
    -g myResourceGroup \
    -n myScaleSet \
    --query virtualMachineProfile.networkProfile.networkInterfaceConfigurations[].ipConfigurations[].applicationSecurityGroups

[
  [
    {
      "id": "/subscriptions/.../resourceGroups/myResourceGroup/providers/Microsoft.Network/applicationSecurityGroups/asgName",
      "resourceGroup": "myResourceGroup"
    }
  ]
]

对特定实例进行网络更新

你可以对特定虚拟机规模集实例进行网络更新。

你可以针对该实例执行 PUT,以更新网络配置。 此方法可用于执行添加或删除网络接口卡 (NIC) 或从后端池删除实例等操作。

PUT https://management.azure.com/subscriptions/.../resourceGroups/vmssnic/providers/Microsoft.Compute/virtualMachineScaleSets/vmssnic/virtualMachines/1/?api-version=2019-07-01

以下示例演示如何为 NIC 添加第二个 IP 配置。

  1. 利用 GET 获取特定虚拟机规模集实例的详细信息。

    GET https://management.azure.com/subscriptions/.../resourceGroups/vmssnic/providers/Microsoft.Compute/virtualMachineScaleSets/vmssnic/virtualMachines/1/?api-version=2019-07-01
    

    以下内容已简化为只显示此示例的网络参数。

    {
      ...
      "properties": {
        ...
        "networkProfileConfiguration": {
          "networkInterfaceConfigurations": [
            {
              "name": "vmssnic-vnet-nic01",
              "properties": {
                "primary": true,
                "enableAcceleratedNetworking": false,
                "networkSecurityGroup": {
                  "id": "/subscriptions/123a1a12-a123-1ab1-12a1-12a1a1234ab1/resourceGroups/vmssnic/providers/Microsoft.Network/networkSecurityGroups/basicNsgvmssnic-vnet-nic01"
                },
                "dnsSettings": {
                  "dnsServers": []
                },
                "enableIPForwarding": false,
                "ipConfigurations": [
                  {
                    "name": "vmssnic-vnet-nic01-defaultIpConfiguration",
                    "properties": {
                      "publicIPAddressConfiguration": {
                        "name": "publicIp-vmssnic-vnet-nic01",
                        "properties": {
                          "idleTimeoutInMinutes": 15,
                          "ipTags": [],
                          "publicIPAddressVersion": "IPv4"
                        }
                      },
                      "primary": true,
                      "subnet": {
                        "id": "/subscriptions/123a1a12-a123-1ab1-12a1-12a1a1234ab1/resourceGroups/vmssnic/providers/Microsoft.Network/virtualNetworks/vmssnic-vnet/subnets/default"
                      },
                      "privateIPAddressVersion": "IPv4"
                    }
                  }
                ]
              }
            }
          ]
        },
        ...
      }
    }
    
  2. 针对该实例执行 PUT,进行更新以添加其他 IP 配置。 这类似于添加其他 networkInterfaceConfiguration

    PUT https://management.azure.com/subscriptions/.../resourceGroups/vmssnic/providers/Microsoft.Compute/virtualMachineScaleSets/vmssnic/virtualMachines/1/?api-version=2019-07-01
    

    以下内容已简化为只显示此示例的网络参数。

      {
      ...
      "properties": {
        ...
        "networkProfileConfiguration": {
          "networkInterfaceConfigurations": [
            {
              "name": "vmssnic-vnet-nic01",
              "properties": {
                "primary": true,
                "enableAcceleratedNetworking": false,
                "networkSecurityGroup": {
                  "id": "/subscriptions/123a1a12-a123-1ab1-12a1-12a1a1234ab1/resourceGroups/vmssnic/providers/Microsoft.Network/networkSecurityGroups/basicNsgvmssnic-vnet-nic01"
                },
                "dnsSettings": {
                  "dnsServers": []
                },
                "enableIPForwarding": false,
                "ipConfigurations": [
                  {
                    "name": "vmssnic-vnet-nic01-defaultIpConfiguration",
                    "properties": {
                      "publicIPAddressConfiguration": {
                        "name": "publicIp-vmssnic-vnet-nic01",
                        "properties": {
                          "idleTimeoutInMinutes": 15,
                          "ipTags": [],
                          "publicIPAddressVersion": "IPv4"
                        }
                      },
                      "primary": true,
                      "subnet": {
                        "id": "/subscriptions/123a1a12-a123-1ab1-12a1-12a1a1234ab1/resourceGroups/vmssnic/providers/Microsoft.Network/virtualNetworks/vmssnic-vnet/subnets/default"
                      },
                      "privateIPAddressVersion": "IPv4"
                    }
                  },
                  {
                    "name": "my-second-config",
                    "properties": {
                      "subnet": {
                        "id": "/subscriptions/123a1a12-a123-1ab1-12a1-12a1a1234ab1/resourceGroups/vmssnic/providers/Microsoft.Network/virtualNetworks/vmssnic-vnet/subnets/default"
                      },
                      "privateIPAddressVersion": "IPv4"
                    }
                  }
                ]
              }
            }
          ]
        },
        ...
      }
    }
    

灵活规模集的显式网络出站连接性

若要增强默认网络安全性,采用灵活编排的虚拟机规模集将要求通过自动缩放配置文件隐式创建的实例必须通过以下方法之一显式定义出站连接:

  • 对于大多数方案,我们建议使用已附加到子网的 NAT 网关
  • 对于具有较高安全要求或使用Azure 防火墙或网络虚拟设备(NVA)的方案,可以将自定义用户定义路由指定为下一跃点通过防火墙。
  • 实例位于标准 SKU Azure 负载均衡器的后端池中。
  • 将公共 IP 地址附加到实例网络接口。

使用具有统一业务流程的单实例 VM 和虚拟机规模集时,系统会自动提供出站连接。

需要显式出站连接的常见方案包括:

  • Windows VM 激活要求你已定义从 VM 实例到 Windows 激活密钥管理服务 (KMS) 的出站连接。 有关详细信息,请参阅 排除 Windows VM 激活问题
  • 访问存储帐户或密钥保管库。 还可以通过 专用链接 建立与Azure服务的连接。

有关定义安全出站连接的详细信息,请参阅 Azure 中的默认出站访问

后续步骤

有关Azure虚拟网络的详细信息,请参阅 Azure 虚拟网络概述