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

默认情况下,虚拟私有云 (VPC) 网络中的每个虚拟机 (VM) 实例都有一个网络接口。但是,您可以配置具有多个网络接口的实例。从实例使用多个网络接口时,每个接口都必须连接到位于不同 VPC 网络中的子网。您不能将多个网络接口连接到同一个子网或同一 VPC 网络中的子网。

如果您不需要多个网络接口,请按照创建和启动实例的过程创建具有默认网络配置的实例。

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

准备工作

IAM 角色

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

在不使用共享 VPC 环境的项目中创建和删除具有多个接口的实例和实例模板:如果用户具有项目级层的 Owner、Editor 或 Compute Instance Admin (v1) 角色,则可以创建具有多个接口的实例,这些接口与属于同一项目的 VPC 网络和子网关联。

在共享 VPC 环境中创建和删除具有多个接口的实例和实例模板:如果用户具有项目级的 Owner、Editor 或 Compute Instance Admin (v1) 角色,则可以创建具有多个接口的实例。如果其中任何接口连接到共享 VPC 宿主项目内的子网,则还必须具有共享 VPC 宿主项目级层或共享 VPC 子网级层的 Compute Network User 角色 (roles/compute.networkUser)。

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

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

如需了解有关创建实例的一般说明,请参阅创建和启动虚拟机实例

第一个接口始终创建为 nic0,并且始终是默认接口。这对于 Google Cloud网络的其他方面十分重要。例如, Google Cloud 负载均衡器(直通式网络负载均衡器除外)仅会将流量分配到 nic0

  1. 在 Google Cloud 控制台中,转到创建实例页面。

    打开“创建实例”

  2. 名称字段中,输入实例的名称。

  3. 区域字段中,选择一个区域。

  4. 可用区字段中,选择一个可用区。

  5. 高级选项部分,展开网络,然后执行以下操作:

    1. 网络接口部分中,点击网络接口以进行修改。

    2. 对于网络子网,选择要使用的网络和子网。

      如果您要在该接口上配置 IPv6 地址,请选择已配置 IPv6 地址范围的子网。子网的 IPv6 访问权限类型决定了虚拟机是接收内部 IPv6 地址还是外部 IPv6 地址。

    3. 为接口的 IP 栈类型选择以下选项之一:

      • IPv4(单栈)
      • IPv4 和 IPv6(双栈)
      • IPv6(单栈)预览版
    4. 对于具有 IPv4 地址的接口,请执行以下操作:

      1. 主要内部 IPv4 地址字段中,选择以下选项之一:

        • 临时,可分配新的临时 IPv4 地址
        • 列表中的预留静态内部 IPv4 地址
        • 预留静态内部 IPv4 地址,可预留并分配新的静态内部 IPv4 地址
      2. 对于外部 IPv4 地址,选择以下选项之一:

        • 临时,可分配新的临时 IPv4 地址
        • ,不分配外部 IPv4 地址
        • 列表中的预留静态 IPv4 地址
        • 预留静态外部 IP 地址,可预留并分配新的静态外部 IPv4 地址
    5. 对于具有 IPv6 地址的接口,请根据所连接子网的访问类型执行以下操作:

      1. 主要内部 IPv6 地址字段中,选择以下选项之一:
        • 自动分配,可自动分配新的临时内部 IPv6 地址
        • 列表中的预留静态内部 IPv6 地址
        • 预留静态内部 IPv6 地址,可预留并分配新的静态内部 IPv6 地址
      2. 对于外部 IPv6 地址,选择以下选项之一:
        • 自动分配,可自动分配新的临时外部 IPv6 地址
        • 列表中的预留静态外部 IPv6 地址
        • 预留静态外部 IPv6 地址,可预留并分配新的静态外部 IPv6 地址
    6. 如需完成网络接口的修改,请点击完成

  6. 如需添加其他接口,请点击添加网络接口

  7. 继续虚拟机创建过程。

  8. 点击创建

如需在新实例上创建网络接口,请使用 instances create 命令

为每个接口添加 --network-interface 标志,后接任意合适的网络键,例如 networksubnetprivate-network-ipaddressexternal-ipv6-address。如需查看有关如何创建具有多个接口的虚拟机的示例,请参阅示例配置

此代码段仅展示了 --network-interface 标志,这是您在创建实例时可以指定的诸多可能参数之一。

如需查看哪些机器类型支持您需要的网络接口数量,请参阅网络接口数上限表。

gcloud compute instances create INSTANCE_NAME \
    --zone ZONE \
    --network-interface \
        network=NETWORK,subnet=SUBNET, \
        stack-type=STACK_TYPE, \
        private-network-ip=INTERNAL_IPV4_ADDRESS \
        address=EXTERNAL_IPV4_ADDRESS | no-address, \
        internal-ipv6-address=INTERNAL_IPV6_ADDRESS \
    ...
    --network-interface \
        network=NETWORK,subnet=SUBNET, \
        stack-type=STACK_TYPE, \
        external-ipv6-address=EXTERNAL_IPV6_ADDRESS, \
        external-ipv6-prefix-length=96 \
        ipv6-network-tier=PREMIUM \
    ...

请替换以下内容:

  • INSTANCE_NAME:要创建的虚拟机实例的名称。
  • ZONE:实例创建所在的区域。
  • NETWORK:接口所连接的网络。
  • SUBNET:接口所连接的子网。
  • STACK_TYPE:接口的堆栈类型。

    默认值为 IPV4_ONLY。指定 IPV4_IPV6 可配置双栈接口,指定 IPV6_ONLY 可配置仅 IPv6 接口(预览版)。

  • 具有 IPv4 地址的接口的值:

    • INTERNAL_IPV4_ADDRESS:您希望接口在目标子网中具有的内部 IPv4 地址。如果只希望具有分配的有效地址,请忽略。
    • EXTERNAL_IPV4_ADDRESS:接口的外部 IPv4 地址。

      您之前必须已预留外部 IPv4 地址。如果您不希望接口具有外部 IP 地址,请指定“no-address”,而不是 address=EXTERNAL_IPV4_ADDRESS。如果您希望接口接收临时外部 IP 地址,请指定 address=''

  • 具有 IPv6 地址的接口的值:

    • INTERNAL_IPV6_ADDRESS:您希望接口在目标子网中具有的内部 IPv4 地址。您之前必须已预留内部 IPv6 地址。如果未指定,Google Cloud 会自动从子网中分配内部 IPv6 地址。
    • EXTERNAL_IPV6_ADDRESS:您希望接口在目标子网中具有的外部 IPv6 地址。您之前必须已预留外部 IPv6 地址。如果未指定,Google Cloud 会自动从子网中分配外部 IPv6 地址。

使用 instances.insert 方法创建具有多个网络接口的虚拟机实例。

  • 如需创建仅具有内部 IPv4 地址的虚拟机实例,请执行以下操作:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
    {
    ....
    
    "networkInterfaces": [
      {
        "networkIP": "IPV4_ADDRESS",
        "subnetwork": "regions/REGION/subnetworks/SUBNET"
      },
        for each interface, specify a network...
    ],
    other instance settings...
    }
    

    替换以下内容:

    • PROJECT_ID:包含实例的项目的 ID。
    • ZONE:包含实例的可用区。
    • IPV4_ADDRESS:要分配给网络接口的内部 IPv4 地址。
    • REGION:包含实例的区域。
    • SUBNET:网络接口所在的子网。
  • 如需创建同时具有内部 IPv4 地址和内部 IPv6 地址的虚拟机实例,请执行以下操作:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
    {
    ....
    
    "networkInterfaces": [
      {
        "subnetwork": "regions/REGION/subnetworks/SUBNET"
        "ipv6Address": "IPV6_ADDRESS",
        "internalIpv6PrefixLength": 96,
        "stackType": IPV4_IPV6,
        "ipv6AccessType": INTERNAL
      },
        for each interface, specify a network...
    ],
    other instance settings...
    }
    

    替换以下内容:

    • PROJECT_ID:包含实例的项目的 ID。
    • ZONE:包含实例的可用区。
    • REGION:包含实例的区域。
    • SUBNET:网络接口所在的子网。
    • IPV6_ADDRESS:您希望接口在目标子网中具有的内部 IPv6 地址。您之前必须已预留内部 IPv6 地址。如果未指定,Google Cloud 会自动从子网中分配内部 IPv6 地址。
  • 如需创建仅具有内部 IPv6 地址的虚拟机实例(预览版),请执行以下操作:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
    {
    ....
    
    "networkInterfaces": [
      {
        "subnetwork": "regions/REGION/subnetworks/SUBNET"
        "ipv6Address": "IPV6_ADDRESS",
        "internalIpv6PrefixLength": 96,
        "stackType": IPV6_ONLY,
        "ipv6AccessType": INTERNAL
      },
        for each interface, specify a network...
    ],
    other instance settings...
    }
    

    替换以下内容:

    • PROJECT_ID:包含实例的项目的 ID。
    • ZONE:包含实例的可用区。
    • REGION:包含实例的区域。
    • SUBNET:网络接口所在的子网。
    • IPV6_ADDRESS:您希望接口在目标子网中具有的内部 IPv6 地址。您之前必须已预留内部 IPv6 地址。如果未指定,Google Cloud 会自动从子网中分配内部 IPv6 地址。

您可以使用 Terraform 资源来创建具有多个网络接口的虚拟机实例。

Terraform 参数具有可以更改的示例值。

resource "google_compute_instance" "default" {
  project      = var.project_id # Replace with your project ID in quotes
  zone         = "us-central1-b"
  name         = "backend-instance"
  machine_type = "e2-medium"
  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-9"
    }
  }
  network_interface {
    subnetwork = var.subnet_1 # Replace with self link to a subnetwork in quotes
    network_ip = "10.0.0.14"
  }
  network_interface {
    subnetwork = var.subnet_2 # Replace with self link to a subnetwork in quotes
    network_ip = "10.10.20.14"
  }
}

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

配置示例

以下部分介绍了如何创建具有多个接口的虚拟机。

配置多个仅具有 IPv4 地址的网络接口

以下示例命令会创建一个具有三个网络接口的实例。

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

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

  • nic0 是使用默认设置创建的。该接口挂接到默认 VPC 网络中的子网,具有自动分配的内部 IP 地址和临时外部 IP 地址。

  • nic1 连接到网络 net1 中的子网 subnet-a,具有内部 IPv4 地址 10.10.10.2 和静态外部 IPv4 地址 EXTERNAL_IPV4_ADDRESS

  • nic2 连接到网络 net2 中的子网 subnet-b,具有内部 IPv4 地址 10.10.20.2 且没有外部 IP 地址。

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

您可以使用您添加的网络接口中的 IP 地址来设置 DNS 转发。如需详细了解如何配置 Cloud DNS 转发地区,请参阅转发地区

配置多个同时具有 IPv4 和 IPv6 地址的网络接口

以下示例命令会创建一个具有两个网络接口的双栈实例。

gcloud compute instances create vm1 \
    --network-interface network=dual-int,subnet=int-subnet,stack-type=IPV4_IPV6 \
    --network-interface network=dual-ext,subnet=ext-subnet,stack-type=IPV4_IPV6,ipv6-network-tier=PREMIUM \
    --machine-type=n1-standard-4 --zone=ZONE_A

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

  • nic0 连接到网络 dual-int 中的子网 int-subnet,具有临时内部 IPv4 地址和临时内部 IPv6 地址。

  • nic1 连接到网络 dual-ext 中的子网 ext-subnet,具有临时内部 IPv4 地址和临时外部 IPv6 地址。

配置多个仅具有 IPv6 地址的网络接口

以下示例命令会创建一个具有两个网络接口的仅 IPv6 实例(预览版)。

gcloud compute instances create vm1 \
    --network-interface network=ipv6-only-int,subnet=int-subnet,stack-type=IPV6_ONLY \
    --network-interface network=ipv6-only-ext,subnet=ext-subnet,stack-type=IPV6_ONLY,ipv6-network-tier=PREMIUM \
    --machine-type=n1-standard-4 --zone=us-west2-a

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

  • nic0 连接到网络 ipv6-only-int 中的子网 int-subnet,具有临时内部 IPv6 地址。

  • nic1 连接到网络 ipv6-only-ext 中的子网 ext-subnet,具有临时外部 IPv6 地址。

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

您可以在非代管式实例组和代管式实例组中使用具有多个网络接口的实例。

对于非代管式实例组,请分别创建每个实例,并确保每个虚拟机的 nic0 网络接口连接到同一子网。然后,将虚拟机实例添加到非代管式实例组。

如需为代管式实例组配置多个网络接口,您必须为每个实例指定网络配置,即在实例模板中为每个实例设置一次 --network-interface 标志。以下示例将创建一个具有三个网络接口的实例模板:

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 REGION_A

由于一个项目中每个区域的子网名称都必须唯一,因此按名称指定子网会将每个接口与 VPC 网络隐式关联。每个接口都必须使用唯一 VPC 网络中的子网:

  • nic0 使用 net0-subnet-a 子网
  • nic1 使用 net1-subnet-b 子网
  • nic2 使用 net2-subnet-c 子网

--network-interface 标志中的 no-address 选项表示接口在没有外部 IPv4 地址的情况下进行了配置。内部 IP 地址来自接口所使用的子网。如需了解标志和语法的完整信息,请参阅 instance-templates create 命令的 --network-interface 标志