创建具有多个网络接口的实例

本页面介绍了如何配置具有多个网络接口的虚拟机 (VM) 实例。

默认情况下,VPC 网络中的每个实例都有一个默认网络接口。您可以按照如下说明来创建额外的网络接口。由于每个接口都连接到不同的 VPC 网络,这样可让该实例能够访问 Google Cloud Platform (GCP) 中的不同 VPC 网络。您不能将多个网络接口连接到同一个 VPC 网络。

如果您不需要额外的网络接口,请按照创建和启动实例中的说明进行操作。

如需详细了解多个网络接口及其具体工作方式,请参阅多个网络接口

规范

要求

  • 您只能在创建实例时配置网络接口。
  • 在单个实例中配置的每个网络接口都必须连接到不同的 VPC 网络,并且每个接口都必须属于 IP 范围不与任何其他接口的子网重叠的子网内。
  • 在创建实例之前,必须已有将作为多个接口连接目标的额外 VPC 网络。如需了解如何创建额外的 VPC 网络,请参阅使用 VPC 网络
  • 如果不删除实例,就无法删除网络接口。
  • 每个实例必须至少有一个网络接口。每个实例最多可有 8 个网络接口,具体取决于相应实例的机器类型。
    • nic0 是必需的,必须在创建实例时配置。
    • nic1nic7 是可选的,但也必须在创建实例时配置。
    • 如需了解详情,请参阅接口数量上限
  • 每个接口都可以有一个外部 IP 地址(可选)。
  • GCP 的 DHCP 服务器仅向默认 NIC nic0 发送默认路由(RFC 3442,“无类静态路由”)。如果另一个 NIC 需要默认路由,则必须在实例中进行配置。在实例中更改默认路由时,请使用串行控制台,以防与虚拟机断开连接。
  • 您可以使用多个网络接口来连接共享 VPC 网络。一台虚拟机只能通过默认网络接口连接到不同项目中的共享网络。因此,如果虚拟机位于一个服务项目中,它只能通过默认接口连接到共享网络,而其他所有接口必须连接到同一服务项目中的本地网络。如果虚拟机位于宿主项目中,则它可以将网络接口连接到宿主项目中的任何网络。

限制

  • 您无法将网络接口添加到现有虚拟机或将其从现有虚拟机中移除。

权限、IAM 和具有多个网络接口的实例

要创建具有多个网络接口的实例,您必须具有以下角色之一:

  • 项目所有者或编辑者角色
  • compute.instanceAdmin.v1 角色

在常规项目(不使用共享 VPC 的项目)中创建和删除具有多个接口的实例和实例模板:如果用户具有项目级的所有者、编辑者或 compute.instanceAdmin.v1 角色,则可以创建具有多个接口的实例,这些接口与属于同一项目的 VPC 网络和子网关联。

共享 VPC 环境中创建和删除具有多个接口的实例和实例模板:如果用户具有项目级的所有者、编辑者或 compute.instanceAdmin.v1 角色,则可以创建具有多个接口的实例。如果其中任何接口与共享 VPC 宿主项目内的子网关联,则还必须具有共享 VPC 宿主项目级或共享 VPC 子网级的 compute.networkUser 角色。

如需详细了解权限,请参阅 Compute Engine IAM 文档

使用具有不同 VPC 网络类型的多个网络接口

  • 旧版网络不支持多个网络接口。
  • 配置多个网络接口时,请将每个接口连接到自动模式 VPC 网络或自定义模式 VPC 网络。

网络接口 IP 地址分配

  • 您必须使用分配自子网的专用主要 IP 地址来配置每个网络接口。
    • 分配给单个实例中各接口的专用主要地址不得相同。
  • 您可以选择为各虚拟接口配置其自己的公开 IP 地址,并且此类公开 IP 地址可以是临时地址,也可以是预留地址。

网络接口数量上限

  • 每个实例允许的虚拟接口数量上限是 8 个。
  • 一个实例中允许的接口数量上限取决于相应实例的机器类型和 vCPU 数量。

总体而言,以下规则适用于 n1-standard-x、n1-highmem-x、n1-highcpu-x、f1-micro、g1-small 和自定义虚拟机:

  • 对于 vCPU 数量 <= 2 的虚拟机,最多可有 2 个网络接口
  • 对于 vCPU 数量 > 2 的虚拟机,每个 vCPU 最多可有 1 个网络接口,每台虚拟机的网络接口上限是 8 个

您可以参照下表,确定可以将多少个网络接口连接到一个实例:

实例的类型 vCPU 的数量 虚拟 NIC 的数量
n1-standard-x、n1-highmem-x、n1-highcpu-x、n1-highmem-x、n1-highcpu-x 由“x”的值指定。 每个“x”值 1 个 NIC,最少需要有 2 个 NIC,最多可以有 8 个NIC
f1-micro 0.2 vCPU 2 个 NIC
g1-small 0.5 vCPU 2 个 NIC
自定义实例 可配置,从 1 个 vCPU 到 64 个 vCPU 每个 vCPU 1 个 NIC,最少需要有 2 个 NIC,最多可以有 8 个 NIC

创建具有多个网络接口的虚拟机实例

创建具有一个接口的实例的方法保持未变。如需了解如何创建实例的通用说明,请参阅创建和启动实例

您可以在创建实例时添加多个网络接口。

  • 在 Console 上,您可以在“网络”->“网络接口”部分的“创建实例”页面中添加网络接口。
  • 在 gcloud 命令行工具中,使用 instances create 命令。包含各接口的 --network-interface 标志,后接任意合适的网络密钥,例如 ([network | subnet], private-network-ip, address)

第一个接口始终创建为 nic0,并且始终是默认接口。这对于 GCP 网络的其他方面十分重要。例如,负载平衡仅支持 nic0

Console


  1. 转到 Google Cloud Platform Console 中的“创建实例”页面。
    转到“创建实例”页面
  2. 填写实例名称、地区、机器类型和实例的其他基本信息。
  3. 填写管理磁盘标签中的字段。
  4. 网络标签上,点击添加网络接口
  5. 选择网络。
  6. 如果 VPC 网络中有多个子网,请选择一个子网。
  7. 要为该接口分配自定义内部 IP 地址,请在内部 IP 下拉菜单中选择自定义,然后输入 IP 地址。
  8. 要指明您不需要外部 IP 地址,请在外部 IP 下拉菜单中选择
  9. 要分配静态外部 IP 地址,请在外部 IP 下拉菜单中选择新建静态 IP (New static IP),输入名称说明,然后点击预留
  10. 要启用 IP 转发,请在 IP 转发下拉菜单中选择开启
  11. 要添加更多网络接口,请点击添加网络接口并按照上面的第 5-10 步进行操作。

gcloud

使用 instances create 命令在新实例上创建网络接口。包含各接口的 --network-interface 标志,后接任意合适的网络密钥,例如 ([network | subnet], private-network-ip, address)

此代码段仅展示了 --network-interface 标志,这是您在创建实例时可以指定的诸多参数之一。对于其他标志,请参阅 gcloud 参考中 instances create 命令的相关内容。查看网络接口数量上限表,了解哪些机器类型支持您需要的网络接口数量。

gcloud compute instances create [INSTANCE_NAME] --machine-type=[MACHINE_TYPE] \
    [--network-interface
        [network=[NETWORK_NAME]; default="default" | subnet=[SUBNET]]
        [address=[ADDRESS] | no-address]
        [private-network-ip=[PRIVATE_NETWORK_IP]]
    ...]

示例

用于创建具有三个网络接口的实例的示例命令:

 gcloud compute instances create vm1 --machine-type=n1-standard-4 \
    --network-interface '' \
    --network-interface subnet=net1-subnet-a,private-network-ip=10.128.0.2,address=35.237.93.110 \
    --network-interface subnet=net2-subnet-b,private-network-ip=10.129.0.2,no-address

这些接口的创建方式如下:

  • nic0,使用所有默认设置。与默认 VPC 网络相关联,具有自动分配的专用 IP 地址和临时公开 IP 地址
  • nic1 属于 net1-subnet-a,内部 IP 地址为 10.128.0.2,静态外部 IP 地址为 35.237.93.110。
  • nic2 属于 net2-subnet-b,内部 IP 地址为 10.129.0.2,没有公开 IP 地址

如需了解 gcloud compute instances create 命令和 --network-interface 标志的完整说明,请参阅该命令的相关文档

为实例组配置多个网络接口

托管实例组中的所有实例均限制为单个子网。用于负载平衡时,非托管实例组内的所有实例均限制为单个子网。如需了解详情,请参阅 VPC 网络负载平衡文档。

由于存在这些限制,每个实例仅有一个接口。GCP 根据与实例中唯一接口关联的子网执行验证。

在您为托管或非托管实例组中的实例配置多个接口时,GCP 会继续为默认 nic0 接口验证这些条件。

创建具有多个接口的实例模板

创建每个实例使用一个接口的实例模板的过程没有任何变化,具体步骤请参阅 gcloud 参考中有关 instance-templates create 命令的内容。

要为实例模板配置多个网络接口,请为要创建的每个网络接口设置 --network-interface 标志:


gcloud compute instance-templates create NAME [--description DESCRIPTION] \
    [--network-interface [network NETWORK; default="default" | subnet SUBNET][address ADDRESS| no-address] \
    [--network-interface [network NETWORK; default="default" | subnet SUBNET][address ADDRESS | no-address] \
    .....

您可以为每个接口分配以下网络密钥:network, subnet, address

例如,如果您运行以下命令,则每个实例有三个网络接口:

gcloud compute instance-templates create template-1 \
    --network-interface subnet=net0-subnet-a \
    --network-interface subnet=net1-subnet-b,no-address \
    --network-interface subnet=net2-subnet-c,no-address \
    --region us-central1`

具体接口如下所示:

  • nic0 属于 net0-subnet-a,具有自动分配的公开 IP 地址
  • nic1 属于 net1-subnet-b,没有公开 IP 地址
  • nic2 属于 net2-subnet-c,没有公开 IP 地址

如需了解标志和语法的完整信息,请参阅 instance-templates create 命令

配置政策路由

对于 Google 支持的映像,在您需要次要网络接口(nic0 以外的接口)与不在次要接口关联子网的主要子网范围内的 IP 地址进行通信时,您需要配置政策路由,以确保出站数据包通过正确的接口传出。在本例中,您必须使用政策路由为各网络接口配置单独的路由表。

请按照以下步骤为具有多个接口、基于 Linux 的实例配置政策路由:

  1. 连接到配置了多个网络接口的实例:

    gcloud compute ssh multinic-vm
    
  2. 使用 ifconfig 为 nic1 配置政策路由。下面的示例假定 GCP 已将内部 IP 地址 192.168.0.2 分配给 nic1,并且子网默认网关为 192.168.0.1。

    sudo ifconfig eth1 192.168.0.2 netmask 255.255.255.255 broadcast 192.168.0.2 mtu 1430
    sudo echo "1 rt1" | sudo tee -a /etc/iproute2/rt_tables # (sudo su - first if permission denied)
    sudo ip route add 192.168.0.1 src 192.168.0.2 dev eth1 table rt1
    sudo ip route add default via 192.168.0.1 dev eth1 table rt1
    sudo ip rule add from 192.168.0.2/32 table rt1
    sudo ip rule add to 192.168.0.2/32 table rt1
    
  3. 为实例上的其他接口(nic2、nic3…nic7)重复执行第 2 步中的命令。

问题排查

我无法创建具有多个接口的虚拟机

您可能会看到以下某条错误消息:

  • Invalid value for field 'resource': ''. Too many network interfaces. The maximum number of network interfaces allowed for this machine type is.

    如果您收到这条错误消息,则表示您尝试创建的接口数量超出了实例机器类型支持的接口数量上限。查看接口数量上限表。

  • Networks must be distinct for NICs attached to a VM.

    如果您收到这条消息,则表示您正尝试在同一网络中创建多个接口。每个网络接口都必须连接到不同的 VPC 网络。

  • Subnetwork CIDR ranges must be non-overlapping for NICs attached to a VM.

    如果您收到这条消息,则表示与您的虚拟机接口关联的 CIDR 范围存在重叠。这些 CIDR 范围包括与虚拟机接口关联的所有主要子网范围,以及用于别名 IP 范围的次要范围。每个接口都属于一个子网,每个子网都位于不同的 VPC 网络中,不得与其他接口的子网重叠。例如,如果您尝试在区域 us-west1 中创建实例,则可以使用以下命令或 Google Cloud Platform Console 来检查子网的主要 CIDR 范围。

    gcloud compute networks subnets list --regions us-west1
    NAME                REGION    NETWORK          RANGE
    default             us-west1  default          10.138.0.0/20
    overlapping-subnet  us-west1  test-network     10.138.8.0/24
    

    要检查次要子网 CIDR 范围,请使用以下命令或 Google Cloud Platform Console

    gcloud compute networks subnets describe overlapping-subnet --region us-west1
    
    ...
    ipCidrRange: 10.128.8.0/24
    ...
    secondaryIpRanges:
    - ipCidrRange: 10.138.8.0/24
      rangeName: conflicting-range
    
  • Multiple network interfaces are not supported on legacy networks.

    如果您收到这条消息,则表示您正尝试在旧版网络中创建实例。旧版网络不支持具有多个接口的实例。您可以使用以下命令或 Google Cloud Platform Console 检查网络是否属于旧版网络。Mode 字段指示了网络的类型。

    gcloud compute networks list
    NAME             MODE    IPV4_RANGE     GATEWAY_IPV4
    default          auto
    legacy-network   legacy  10.240.0.0/16  10.240.0.1
    test-network     custom
    

  • Required 'compute.instances.create' permission for 'projects/[PROJECT_ID]/zones/[ZONE]/instances/test-inst'

    如果您收到这条消息,则您登录的帐号没有创建实例所必需的 IAM 权限。要详细了解创建实例所需的角色,请参阅 IAM 权限。您可以检查与项目相关的 IAM 政策,确定其是否授予您以下任何角色:OWNEREDITORcompute.instanceAdmin.v1。要在共享 VPC 中创建实例,您还需要具备 compute.networkUser 角色。在以下示例中,帐号 email2@gmail.com 没有创建实例所需的足够 IAM 权限。如需了解详细说明,请参阅授予、更改和撤消对资源的访问权限 IAM 指南。

    gcloud projects get-iam-policy PROJECT_ID
    bindings:
    - members:
      - user:email1@gmail.com
        role: roles/owner
    - members:
      - serviceAccount:our-project-123@appspot.gserviceaccount.com
      - serviceAccount:123456789012-compute@developer.gserviceaccount.com
        role: roles/editor
    - members:
      - user:email2@gmail.com
        role: roles/viewer
    etag: BwUjMhXbSPU=
    version: 1
    

    您可以要求项目所有者或编辑者授予您 OWNEREDITORcompute.instanceAdmin.v1 角色。如果您将任何接口与属于共享 VPC 的子网关联,那么您还需要 compute.networkUser 角色。

    gcloud projects set-iam_policy --member user:email2@gmail.com --role roles/editor
    

我无法连接到次要接口的内部 IP

  • 检查防火墙规则,确定其是否允许连接到虚拟机次要接口。要进行检查,您可以通过以下两种方式之一,查看连接到次要接口的网络的防火墙规则:访问 Google Cloud Platform Console 并点击相应的 VPC 网络;或者使用以下 gcloud 命令。

    gcloud compute firewall-rules list --filter='network:[NETWORK_NAME]'
    
  • 检查您是否在尝试从互联网地址或次要接口网络外部连接到次要接口。您只能从一个接口所在的网络内连接到该接口的内部 IP。如果您需要从网络外部访问该接口,则可以为次要接口分配外部 IP 地址。

  • 检查您是否在尝试从次要接口所连接的子网外部连接到次要接口的内部 IP,比如说从相同网络的另一个子网连接,或者从对等互连网络连接。 每个实例多个网络接口解释了 VPC 对等互连和具有多个接口的虚拟机实例之间的相互作用。要从接口的子网外部访问次要接口,您可能需要在虚拟机上配置路由。如需详细了解 DHCP 如何配置虚拟机中的默认路由,请参阅使用多个网络接口的 DHCP 行为

我无法使用外部 IP 连接到次要接口

DHCP 服务器仅在虚拟机的主要网络接口上配置默认路由。如果您要使用外部 IP 连接到次要接口,那么有两种可选方案。如果仅需要通过次要网络接口连接到网络外部,则可以在该网络接口上设置默认路由。此外,您也可以参照配置政策路由,在虚拟机中使用基于来源的政策路由配置一个单独的路由表。

我在使用 /32 以外的网络掩码时遇到连接问题

默认情况下,实例元数据服务器仅响应默认网关的 ARP 请求。

要使用 /32 以外的网络掩码配置接口,您应该使用 --guest-os-features MULTI_IP_SUBNET 标志创建映像,并使用该映像来创建实例。例如,如果您使用的是基于 debian-9 的映像,则可以使用如下命令创建映像:

gcloud compute images create debian-9-multi-ip-subnet \
     --source-disk debian-9-disk \
     --source-disk-zone us-west1-a \
     --guest-os-features MULTI_IP_SUBNET

要查看映像中配置的来宾功能,请在来宾映像上运行 gcloud compute images describe 命令。

gcloud compute images describe debian-9-multi-ip-subnet

要详细了解如何创建自定义映像,请参阅创建、删除和弃用自定义映像

使用串行控制台进行问题排查

在虚拟机上启用串行控制台来调试配置相关问题,这通常是一种不错的做法。按照与串行控制台互动中的步骤,即可启用串行控制台,执行交互式调试。

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页