3. 子网与 IP 地址管理

在 Google Cloud 的 VPC 网络中,子网不是“一段随便划出来的地址”,而是由若干地址范围(range)共同构成的资源容器。理解这些范围的分工,是后续做路由、防火墙、NAT、Private Service Connect 以及混合云互联的基础。一个子网可以同时拥有主 IP 范围、次级范围、别名 IP 范围,并配合私有 Google 访问(Private Google Access)决定实例能否在不具备外部 IP 的情况下访问 Google API。下面按“范围类型 → 分配策略 → 实际配置”的顺序展开。

一、主 IP 范围:子网的“身份地址段”

每个子网必须且只能有一个主 IP 范围(primary IP range),它决定了该子网内虚拟机主网卡(nic0)默认获取的地址来源。主范围在创建子网时指定,例如 10.10.0.0/24,则可用地址为 10.10.0.1 到 10.10.0.254。Google Cloud 会保留每个子网的第一个地址(网络地址)和第二个地址(默认网关),因此 /24 实际可分配给实例的地址是 252 个。

主范围一旦创建,不能直接修改或缩小,只能通过扩展(expand)操作增大 CIDR 前缀长度更小的范围,例如把 10.10.0.0/24 扩展为 10.10.0.0/23。扩展时新范围必须包含原范围,且不能与同 VPC 内其他子网重叠。这是规划阶段必须留出余量的原因:生产环境建议主范围至少 /24,并按未来 2~3 年实例增长预留。

二、次级范围:给容器和专用负载的第二地址池

次级范围(secondary IP range)是子网的附加地址段,最典型的用途是 GKE 的 Pod 和 Service 地址。GKE 集群在创建时会要求指定两个次级范围:一个给 Pod,一个给 Service。例如:

子网 subnet-a(主范围 10.10.0.0/24)
  ├─ 次级范围 pods:     10.20.0.0/16   (Pod IP)
  └─ 次级范围 services: 10.30.0.0/20   (ClusterIP)

次级范围与主范围的关键区别在于:次级范围可以独立增删和扩展,且不直接参与实例主网卡的地址分配,而是通过别名 IP 机制绑定到实例的网卡上。一个子网可以有多个次级范围,命名后便于在 GKE、Cloud Run 或内部负载均衡中引用。

三、别名 IP:把次级范围“挂”到实例网卡

别名 IP(alias IP)是让一个实例网卡同时拥有多个 IP 地址的机制。它把主范围或次级范围中的地址,以 CIDR 形式绑定到 nic0 上。GKE 节点正是通过别名 IP 把 Pod 地址段挂到节点上,再由节点内的 CNI 插件把具体 Pod IP 分配给容器。

别名 IP 的分配有两种粒度:

  • 单个地址:如 10.20.0.5/32,适合给某个实例附加一个固定内部地址。
  • 子范围:如 10.20.0.0/24,适合节点批量承载 Pod。

需要注意:别名 IP 范围必须来自该实例所在子网的主范围或次级范围,不能跨子网引用。若实例有多张网卡,每张网卡可独立配置别名 IP。

四、私有 Google 访问:无外部 IP 也能访问 Google API

默认情况下,只有具备外部 IP 的实例才能访问 *.googleapis.com 等 Google API。私有 Google 访问(Private Google Access, PGA)打开后,没有外部 IP 的实例也能通过内部路径访问 Google API 和服务的公共 IP。它作用于子网级别,开启后该子网内所有实例自动生效。

PGA 的流量路径是:实例 → 子网默认网关 → Google 内部网络 → API 端点。它不会让实例获得公网出口,也不会改变实例的源地址。若需要访问第三方公网,仍需 Cloud NAT。PGA 与 Cloud NAT 常配合使用:PGA 负责 Google API,NAT 负责其他公网目标。

五、内部与外部 IP 的分配策略

实例的 IP 分配由“内部 IP 必选、外部 IP 可选”这一原则决定。内部 IP 来自子网主范围,可自动分配或指定;外部 IP 则有两种形态:

  • 临时外部 IP(ephemeral):实例停止后释放,适合临时调试。
  • 静态外部 IP(static):预留后长期绑定,适合对外提供服务的负载均衡或跳板机。

生产环境推荐策略是:默认不给实例外部 IP,统一通过 Cloud NAT 出公网,通过 PGA 访问 Google API,通过内部负载均衡或外部负载均衡暴露服务。这样既减少攻击面,也便于审计和地址规划。

子网地址范围与 IP 分配关系 VPC: prod-vpc 子网 subnet-a(us-central1) 主 IP 范围(primary) 10.10.0.0/24 → 实例 nic0 主地址,可扩展不可缩小 次级范围 pods 10.20.0.0/16 → GKE Pod 地址池 次级范围 services 10.30.0.0/20 → ClusterIP 地址池 别名 IP(alias IP) 把主/次级范围地址以 CIDR 绑定到 nic0 例:10.20.0.0/24 → 节点承载 Pod VM 实例 vm-app-01 nic0 主内部 IP 10.10.0.5(来自主范围) 别名 IP 范围 10.20.0.0/24(来自 pods 次级范围) 外部 IP(可选) 临时 ephemeral:停机释放 静态 static:预留长期绑定 私有 Google 访问(PGA) 子网级开关:无外部 IP 也可访问 Google API 主范围决定实例主地址;次级范围经别名 IP 承载 Pod/Service;PGA 与外部 IP 决定出站路径

六、规划与配置要点

实际落地时,建议按以下顺序推进:

  1. 先定 VPC 与区域,再按区域划分子网。同一 VPC 内不同区域的子网范围不能重叠。
  2. 主范围按实例规模预留。若预计 500 台实例,/23 可提供约 508 个可用地址,留出扩展空间。
  3. 次级范围单独规划。GKE 的 Pod 范围通常需要 /16 以上,Service 范围 /20 左右,避免与主范围或其他子网冲突。
  4. 别名 IP 按节点粒度分配。节点别名范围大小决定单节点可承载的 Pod 数,需与 GKE 的 --max-pods-per-node 匹配。
  5. 默认关闭外部 IP,用 Cloud NAT + PGA 替代,减少暴露面。
判断一个实例能否访问 Google API,先看它所在子网是否开启 PGA;若未开启且实例无外部 IP,则访问 *.googleapis.com 会失败。此时要么开启 PGA,要么给实例加外部 IP,要么通过 Cloud NAT 出公网。
主范围扩展后不可回退,且扩展操作要求新范围不与同 VPC 其他子网重叠。生产环境建议在创建子网时就按上限规划,避免后期因地址不足被迫重建子网。

总结来看,主 IP 范围是子网的“根”,次级范围是“扩展池”,别名 IP 是“绑定机制”,PGA 是“无公网访问 Google API 的通道”,而内部/外部 IP 的取舍决定了实例的暴露面。把这五者放在同一张地址规划表里统一管理,才能避免后续路由、防火墙和混合云互联阶段的地址冲突与返工。