如何在 Azure 中创建具有多个网络接口卡的 Linux 虚拟机

可以在 Azure 中创建附有多个虚拟网络接口 (NIC) 的虚拟机 (VM)。 一种常见方案是为前端和后端连接使用不同子网,或为监视或备份解决方案使用一个专用网络。 本文详细介绍如何创建具有多个 NIC 的 VM,以及如何在现有 VM 中添加或删除 NIC。 不同的 VM 大小支持不同数目的 NIC,因此请相应地调整 VM 的大小。

本文详述了如何使用 Azure CLI 2.0 创建具有多个 NIC 的 VM。

创建支持资源

安装最新的 Azure CLI 2.0 并使用 az login 登录到 Azure 帐户。

Note

在 Azure 中国区使用 Azure CLI 2.0 之前,请先运行 az cloud set -n AzureChinaCloud 来改变云环境。如果想切回国际版 Azure,请再次运行 az cloud set -n AzureCloud

在以下示例中,请将示例参数名称替换成自己的值。 示例参数名称包括 myResourceGroup、mystorageaccount 和 myVM。

首先,使用 az group create 创建资源组。 以下示例在“chinaeast”位置创建名为“myResourceGroup”的资源组:

az group create --name myResourceGroup --location chinaeast

使用 az network vnet create 创建虚拟网络。 以下示例创建一个名为 myVnet 的虚拟网络和一个名为 mySubnetFrontEnd 的子网:

az network vnet create \
    --resource-group myResourceGroup \
    --name myVnet \
    --address-prefix 192.168.0.0/16 \
    --subnet-name mySubnetFrontEnd \
    --subnet-prefix 192.168.1.0/24

使用 az network vnet subnet create 为后端通信流创建子网。 以下示例创建名为 mySubnetBackEnd 的子网:

az network vnet subnet create \
    --resource-group myResourceGroup \
    --vnet-name myVnet \
    --name mySubnetBackEnd \
    --address-prefix 192.168.2.0/24

使用 az network nsg create 创建网络安全组。 以下示例创建名为“myNetworkSecurityGroup”的网络安全组:

az network nsg create \
    --resource-group myResourceGroup \
    --name myNetworkSecurityGroup

创建和配置多个 NIC

使用 az network nic create 创建两个 NIC。 以下示例创建两个连接到网络安全组的 NIC(名为 myNic1 和 myNic2),其中一个 NIC 连接到每个子网:

az network nic create \
    --resource-group myResourceGroup \
    --name myNic1 \
    --vnet-name myVnet \
    --subnet mySubnetFrontEnd \
    --network-security-group myNetworkSecurityGroup
az network nic create \
    --resource-group myResourceGroup \
    --name myNic2 \
    --vnet-name myVnet \
    --subnet mySubnetBackEnd \
    --network-security-group myNetworkSecurityGroup

创建 VM 并附加 NIC

创建 VM 时,请使用 --nics指定所创建的 NIC。 还需要谨慎选择 VM 的大小。 可添加到 VM 的 NIC 数目有限制。 详细了解 Linux VM 大小

使用 az vm create 创建 VM。 以下示例创建一个名为 myVM 的 VM:

az vm create \
    --resource-group myResourceGroup \
    --name myVM \
    --image UbuntuLTS \
    --size Standard_DS3_v2 \
    --admin-username azureuser \
    --generate-ssh-keys \
    --nics myNic1 myNic2

通过完成为多个 NIC 配置来宾 OS 中的步骤,将路由表添加到来宾 OS。

将 NIC 添加到 VM

之前的步骤创建了具有多个 NIC 的 VM。 还可使用 Azure CLI 2.0 将 NIC 添加到现有 VM。 不同的 VM 大小支持不同数目的 NIC,因此请相应地调整 VM 的大小。 如果需要,可调整 VM 的大小

使用 az network nic create 创建另一 NIC。 以下示例创建一个名为 myNic3 的 NIC,该 NIC 连接到后端子网和之前步骤中创建的网络安全组:

az network nic create \
    --resource-group myResourceGroup \
    --name myNic3 \
    --vnet-name myVnet \
    --subnet mySubnetBackEnd \
    --network-security-group myNetworkSecurityGroup

若要将 NIC 添加到现有 VM,请先使用 az vm deallocate 解除分配 VM。 以下示例解除分配名为 myVM 的 VM:

az vm deallocate --resource-group myResourceGroup --name myVM

使用 az vm nic add 添加 NIC。 以下示例将 myNic3 添加到 myVM:

az vm nic add \
    --resource-group myResourceGroup \
    --vm-name myVM \
    --nics myNic3

使用 az vm start 启动 VM:

az vm start --resource-group myResourceGroup --name myVM

通过完成为多个 NIC 配置来宾 OS 中的步骤,将路由表添加到来宾 OS。

从 VM 中删除 NIC

若要从现有 VM 中删除 NIC,请先使用 az vm deallocate 解除分配 VM。 以下示例解除分配名为 myVM 的 VM:

az vm deallocate --resource-group myResourceGroup --name myVM

使用 az vm nic remove 删除 NIC。 以下示例从 myVM 中删除 myNic3:

az vm nic remove \
    --resource-group myResourceGroup \
    --vm-name myVM \
    --nics myNic3

使用 az vm start 启动 VM:

az vm start --resource-group myResourceGroup --name myVM

使用 Resource Manager 模板创建多个 NIC

Azure 资源管理器模板使用声明性 JSON 文件来定义环境。 可以阅读 Azure Resource Manager 概述。 Resource Manager 模板可让你在部署期间创建资源的多个实例,例如,创建多个 NIC。 使用 copy 指定要创建的实例数:

"copy": {
    "name": "multiplenics"
    "count": "[parameters('count')]"
}

阅读有关使用 copy 创建多个实例的详细信息。

也可以使用 copyIndex() 并在资源名称中追加一个数字,来创建 myNic1myNic2,等等。下面显示了追加索引值的示例:

"name": "[concat('myNic', copyIndex())]", 

可以阅读使用 Resource Manager 模板创建多个 NIC 的完整示例。

通过完成为多个 NIC 配置来宾 OS 中的步骤,将路由表添加到来宾 OS。

为多个 NIC 配置来宾 OS

将多个 NIC 添加到一个 Linux VM 时,需要创建路由规则。 这些规则允许此 VM 发送和接收属于特定 NIC 的流量。 否则,所定义的默认路由无法正确处理属于 eth1 等的流量。

若要纠正此路由问题,请首先向 /etc/iproute2/rt_tables 添加两个路由表,如下所示:

echo "200 eth0-rt" >> /etc/iproute2/rt_tables
echo "201 eth1-rt" >> /etc/iproute2/rt_tables

要使更改长久有效并在网络堆栈激活期间应用,请编辑 /etc/sysconfig/network-scripts/ifcfg-eth0 和 /etc/sysconfig/network-scripts/ifcfg-eth1。 将行“NM_CONTROLLED=yes”更改为“NM_CONTROLLED=no”。 如不执行此步骤,则不会自动应用其他规则/路由。

然后扩展路由表。 假设已进行了如下设置:

路由

default via 10.0.1.1 dev eth0 proto static metric 100
10.0.1.0/24 dev eth0 proto kernel scope link src 10.0.1.4 metric 100
10.0.1.0/24 dev eth1 proto kernel scope link src 10.0.1.5 metric 101
168.63.129.16 via 10.0.1.1 dev eth0 proto dhcp metric 100
169.254.169.254 via 10.0.1.1 dev eth0 proto dhcp metric 100

接口

lo: inet 127.0.0.1/8 scope host lo
eth0: inet 10.0.1.4/24 brd 10.0.1.255 scope global eth0    
eth1: inet 10.0.1.5/24 brd 10.0.1.255 scope global eth1

然后,创建以下文件,并对每个文件添加相应的规则和路由:

  • /etc/sysconfig/network-scripts/rule-eth0

    from 10.0.1.4/32 table eth0-rt
    to 10.0.1.4/32 table eth0-rt
    
  • /etc/sysconfig/network-scripts/route-eth0

    10.0.1.0/24 dev eth0 table eth0-rt
    default via 10.0.1.1 dev eth0 table eth0-rt
    
  • /etc/sysconfig/network-scripts/rule-eth1

    from 10.0.1.5/32 table eth1-rt
    to 10.0.1.5/32 table eth1-rt
    
  • /etc/sysconfig/network-scripts/route-eth1

    10.0.1.0/24 dev eth1 table eth1-rt
    default via 10.0.1.1 dev eth1 table eth1-rt
    

若要应用更改,请重启网络服务,如下所示:

systemctl restart network

路由规则现已准备就绪,可根据需要连接到任一接口。

后续步骤

尝试创建具有多个 NIC 的 VM 时,请查看 Lnux VM 大小。 注意每个 VM 大小支持的 NIC 数目上限。