排查具有多个网络接口的虚拟机的问题

本页面介绍了在创建和使用具有多个网络接口的虚拟机时可能会遇到的常见问题的问题排查步骤。

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

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

  • 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 网络中,不得与其他接口的子网重叠。例如,如果您尝试在 REGION_A 区域中创建实例,则可以使用以下命令或Google Cloud 控制台来检查子网的主要 CIDR 范围。

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

    如需检查次要子网 CIDR 范围,请使用以下命令或Google Cloud 控制台

    gcloud compute networks subnets describe overlapping-subnet --region REGION_A
    
    ...
    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 控制台中,前往 VPC 网络页面,然后查看模式列。
    • 运行 gcloud compute networks list 命令并检查 SUBNET_MODE 字段。
  • 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
    

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

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

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

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

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

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

  • 如果您尝试访问 IPv6 地址,另请参阅我无法连接到次要接口的 IPv6 地址

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

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

如果您尝试访问 IPv6 地址,另请参阅我无法连接到次要接口的 IPv6 地址

我无法连接到次要接口的 IPv6 地址

如果您尝试访问 IPv6 地址,请检查该虚拟机是否安装了 google-guest-agent 版本 20220603.00 或更高版本。如需详细了解如何管理 google-guest-agent 版本,请参阅客机环境

如果您使用的是早期版本的 google-guest-agent,则次要接口不会收到 IPv6 子网路由。我们建议您更新客机代理,以便正确配置路由。

但是,作为一种解决方法,您也可以创建启动脚本以对每个次要接口进行以下配置更改。

sudo sysctl -w net.ipv6.conf.INTERFACE_NAME.accept_ra_rt_info_max_plen=128

INTERFACE_NAME 替换为接口的名称,例如 eth1ens5

我在使用 /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 ZONE_A \
     --guest-os-features MULTI_IP_SUBNET

如需查看映像中配置的客机功能,请在客机映像上运行 gcloud compute images describe 命令。

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

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

我无法解析具有多个网络接口的虚拟机的内部主机名

使用内部主机名执行 DNS 查询时,DNS 查询会解析为实例的主要网络接口 (nic0)。

如果 nic0 连接到的 VPC 网络与发出 DNS 查询的实例的 VPC 网络不同,则 DNS 查询会失败。内部 DNS 只会在给定的 VPC 网络内进行解析。如需了解详情,请参阅 Compute Engine 内部 DNS

通过更新实例属性来删除 Dynamic NIC 时,我收到错误消息

在极少数情况下,如果您在更新实例的属性时删除 Dynamic Network Interface (NIC),更新可能会失败。在失败后,实例会还原为原始状态。在极少数情况下,Dynamic NIC 可能会保持已删除状态。

如果您遇到此问题,请执行以下操作:

  • 如需解决此问题:请使用相同的命令或请求再次更新实例属性。重新运行操作可确保实例达到您在原始请求中指定的状态。

  • 如需防止再次出现此问题:请勿通过更新实例属性来从实例中删除 Dynamic NIC。请改为按照删除 Dynamic NIC 中所述,直接删除 Dynamic NIC。

通过更新 MIG 配置来删除 Dynamic NIC 时,我收到错误消息

在极少数情况下,如果您在更新 MIG 中的实例配置时删除 Dynamic NIC,更新可能会失败。在失败后,实例会还原为原始状态。

Compute Engine 会自动解决此问题,方法是重试更新操作,直到成功为止。您可以定期检查托管式实例的状态,直到上次尝试错误得到解决。

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

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