Azure 虚拟机规模集的网络
通过门户部署 Azure 虚拟机规模集时,某些网络属性(例如带入站 NAT 规则的 Azure 负载均衡器)是默认设置的。 本文介绍如何使用部分较高级的可以对规模集配置的网络功能。
可以使用 Azure Resource Manager 模板配置本文介绍的所有功能。 此外,还为选定功能提供了 Azure CLI 和 PowerShell 示例。
备注
无法将虚拟机规模集从一个 VNET 移到另一个 VNET。 必须在目标 VNET 中重新创建规模集。
Azure 加速网络可以实现对虚拟机的单根 I/O 虚拟化 (SR-IOV),从而提升网络性能。 若要详细了解如何使用加速网络,请查看适用于 Windows 或 Linux 虚拟机的加速网络。 若要对规模集使用加速网络,请在规模集的 networkInterfaceConfigurations 设置中将 enableAcceleratedNetworking 设置为 true。 例如:
"networkProfile": {
"networkInterfaceConfigurations": [
{
"name": "niconfig1",
"properties": {
"primary": true,
"enableAcceleratedNetworking" : true,
"ipConfigurations": [
...
]
}
}
]
}
请参阅 Azure 负载平衡器和虚拟机规模集,详细了解如何根据你的场景使用虚拟机规模集配置标准负载平衡器。
若要将规模集添加到应用程序网关的后端池,请在规模集的网络配置文件中引用应用程序网关后端池。 在创建规模集时(参阅下方的 ARM 模板)或在现有规模集上可以完成此操作。
将统一虚拟机规模集添加到应用程序网关的后端池时,新规模集或现有规模集的过程会有所不同:
- 对于新规模集,请在一个或多个网络接口 IP 配置下的规模集模型的网络配置文件中,引用应用程序网关的后端池 ID。 部署后,添加到规模集的实例将放置在应用程序网关的后端池中。
- 对于现有规模集,请先在规模集模型的网络配置文件中添加应用程序网关的后端池 ID,然后通过升级对现有实例应用模型。 如果规模集的升级策略为
Automatic
或Rolling
,则将为你更新实例。 如果是Manual
,则需要手动升级实例。
- 在规模集所在的同一区域中创建应用程序网关和后端池(如果还没有)
- 在门户中导航到虚拟机规模集
- 在“设置”下,打开“网络”窗格
- 在“网络”窗格中,选择“负载均衡”选项卡,然后单击“添加负载均衡”
- 从“负载均衡选项”下拉列表中选择“应用程序网关”,然后选择现有应用程序网关
- 选择目标后端池,然后单击“保存”
- 如果规模集升级策略为“手动”,请导航到“设置”>“实例”窗格以选择和升级每个实例
将灵活规模集添加到应用程序网关时,该过程与将独立 VM 添加到应用程序网关的后端池相同,即将虚拟机的网络接口 IP 配置更新为后端池的一部分。 通过应用程序网关的配置或通过配置虚拟机的网络接口配置可以完成此操作。
备注
请注意,应用程序网关必须与规模集在同一虚拟网络中,但必须与规模集在不同子网中。
默认情况下,规模集采用其创建时所在的 VNET 和子网的特定 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>
通常,Azure 规模集虚拟机不需要自己的公共 IP 地址。 大多数情况下,将公共 IP 地址关联到负载均衡器或单个虚拟机(又称 jumpbox)更经济,也更安全,后者随后会根据需要通过特定方式(例如,通过入站 NAT 规则)将传入连接路由到规模集虚拟机。
但某些情况下,确实需要规模集虚拟机拥有自己的公共 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 前缀的示例模板:vmms-with-public-ip-prefix
若要通过 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"
}
}
}
在规模集中,附加到 VM 的每个 NIC 可以有一个或多个关联的 IP 配置。 每个配置分配有一个专用 IP 地址。 每个配置还可以有一个关联的公共 IP 地址资源。 若要了解可以为一个 NIC 分配多少个 IP 地址,以及可以在一个 Azure 订阅中使用多少个公共 IP 地址,请参阅 Azure 限制。
每个虚拟机最多可以有 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')]"
}
]
}
}
]
}
}
]
}
可以使用网络安全组通过安全规则来筛选 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 配置。
利用
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" } } ] } } ] }, ... } }
针对该实例执行
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 激活问题。
- 访问存储帐户或 Key Vault。 你还可以通过专用链接与 Azure 服务建立连接。
有关定义安全出站连接的更多详细信息,请参阅 Azure 中的默认出站访问。
有关 Azure 虚拟网络的详细信息,请参阅 Azure 虚拟网络概述。