创建具有多个网络接口的虚拟机
默认情况下,虚拟私有云 (VPC) 网络中的每个虚拟机 (VM) 实例都有一个网络接口。但是,您可以配置具有多个网络接口的实例。从实例使用多个网络接口时,每个接口都必须连接到位于不同 VPC 网络中的子网。您不能将多个网络接口连接到同一个子网或同一 VPC 网络中的子网。
如果您不需要多个网络接口,请按照创建和启动实例的过程创建具有默认网络配置的实例。
如需详细了解多个网络接口及其具体工作方式,请参阅多个网络接口。
准备工作
在创建实例之前,请验证是否已创建所有必需的网络。如果您需要创建网络或子网,请参阅创建和管理 VPC 网络。
验证每个网络是否具有适当的防火墙规则,以允许流量进出具有多个接口的虚拟机。如果您需要创建防火墙规则,请参阅使用 VPC 防火墙规则。
如果您使用 IPv6 地址将虚拟机连接到多个网络,请安装
google-guest-agent
版本 20220603.00 或更高版本。如需了解详情,请参阅我无法连接到次要接口的 IPv6 地址。
IAM 角色
要创建具有多个网络接口的实例,您必须具有以下角色之一:
- Project Owner 或 Editor 角色
- Compute Instance Admin (v1) 角色 (
roles/compute.instanceAdmin.v1
)
在不使用共享 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
。
控制台
在 Google Cloud 控制台中,转到创建实例页面。
在名称字段中,输入实例的名称。
在区域字段中,选择一个区域。
在可用区字段中,选择一个可用区。
在高级选项部分,展开网络,然后执行以下操作:
在网络接口部分中,点击网络接口以进行修改。
对于网络和子网,选择要使用的网络和子网。
如果您要在该接口上配置 IPv6 地址,请选择已配置 IPv6 地址范围的子网。子网的 IPv6 访问权限类型决定了虚拟机是接收内部 IPv6 地址还是外部 IPv6 地址。
为接口的 IP 栈类型选择以下选项之一:
- IPv4(单栈)
- IPv4 和 IPv6(双栈)
- IPv6(单栈)(预览版)
对于具有 IPv4 地址的接口,请执行以下操作:
在主要内部 IPv4 地址字段中,选择以下选项之一:
- 临时,可分配新的临时 IPv4 地址
- 列表中的预留静态内部 IPv4 地址
- 预留静态内部 IPv4 地址,可预留并分配新的静态内部 IPv4 地址
对于外部 IPv4 地址,选择以下选项之一:
- 临时,可分配新的临时 IPv4 地址
- 无,不分配外部 IPv4 地址
- 列表中的预留静态 IPv4 地址
- 预留静态外部 IP 地址,可预留并分配新的静态外部 IPv4 地址
对于具有 IPv6 地址的接口,请根据所连接子网的访问类型执行以下操作:
- 在主要内部 IPv6 地址字段中,选择以下选项之一:
- 自动分配,可自动分配新的临时内部 IPv6 地址
- 列表中的预留静态内部 IPv6 地址
- 预留静态内部 IPv6 地址,可预留并分配新的静态内部 IPv6 地址
- 对于外部 IPv6 地址,选择以下选项之一:
- 自动分配,可自动分配新的临时外部 IPv6 地址
- 列表中的预留静态外部 IPv6 地址
- 预留静态外部 IPv6 地址,可预留并分配新的静态外部 IPv6 地址
- 在主要内部 IPv6 地址字段中,选择以下选项之一:
如需完成网络接口的修改,请点击完成。
如需添加其他接口,请点击添加网络接口。
继续虚拟机创建过程。
点击创建。
gcloud
如需在新实例上创建网络接口,请使用 instances create
命令。
为每个接口添加 --network-interface
标志,后接任意合适的网络键,例如 network
、subnet
、private-network-ip
、address
、external-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 地址。
API
使用 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 资源来创建具有多个网络接口的虚拟机实例。
Terraform 参数具有可以更改的示例值。
如需了解如何应用或移除 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
标志。