共用方式為

Azure 虚拟机规模集网络配置

通过门户部署 Azure 虚拟机规模集时,某些网络属性(例如带入站 NAT 规则的 Azure 负载均衡器)是默认设置的。 本文介绍如何使用一些可在规模集上设置的高级网络功能。

可以使用 Azure Resource Manager 模板配置本文介绍的所有功能。 此外,还为选定功能提供了 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 配置创建规模集,请将 --dns-servers 参数添加到 vmss create 命令中,后接空格分隔的服务器 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 部分直接设置实例 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 REST API 2017-03-30 或更高版本来显示分配到规模集虚拟机的公共 IP 地址。

若要查询 Azure REST API,请执行以下操作:

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

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.chinacloudapi.cn/subscriptions/.../resourceGroups/vmssnic/providers/Microsoft.Compute/virtualMachineScaleSets/vmssnic/virtualMachines/1/?api-version=2019-07-01

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

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

    GET https://management.chinacloudapi.cn/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.chinacloudapi.cn/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 虚拟网络概述