云原生场景下的 VPC 网络规划:从能用到可扩展、可治理、可演进¶
写在前面¶
很多团队第一次上云做 Kubernetes、微服务、数据库和中间件平台时,最容易低估的一件事,就是 VPC 网络规划。
一开始大家通常会觉得这件事很简单:
- 先建一个 VPC
- 划几个交换机或子网
- 把 Kubernetes 集群和数据库放进去
- 能通信就算完成
但真正跑起来几个月后,问题就会集中爆发:
- 新业务上不去,因为网段不够了
- 多环境互联复杂,路由开始打架
- Pod 网段和 VPC 网段冲突
- 安全域不清晰,谁都能访问谁
- NAT、LB、VPN、专线、云企业网越堆越乱
- 后面想做多集群、多地域、混合云时,发现最早的网段规划已经卡死
从云原生专家的视角看,VPC 规划 从来不是“画几个网段”这么简单,它本质上是在回答:
未来 2 到 3 年,这个平台的网络边界、扩展方式、安全分区、环境隔离和互联模型到底怎么设计。
这篇文章的重点不是教你点控制台,而是从架构设计视角回答下面几个问题:
- 云原生场景下,VPC 规划到底要规划什么
- 为什么很多团队的网络设计一开始就埋雷
- Kubernetes、数据库、中间件、办公接入、跨地域互联应该怎么拆
- 怎么做一套能扩展、能治理、能持续演进的 VPC 规划
本文默认讨论的是公有云 VPC + Kubernetes/ACK 这类云原生平台场景。不同云厂商、不同 CNI、不同实例规格对可用 IP、弹性网卡、Pod 密度和路由能力的限制不同,落地时要以云厂商文档和当前集群网络模式为准。
一、先说结论:VPC 规划的核心不是“能通”,而是“有边界”¶
很多早期网络设计的最大问题,不是技术实现错了,而是设计目标太低,只盯着:
- 服务能不能访问数据库
- ECS 能不能访问公网
- Kubernetes 能不能拉镜像
如果目标只有“先通”,最后往往会得到一张看似能跑,但很难治理的网络。
在云原生场景下,一套合理的 VPC 网络规划,至少要同时满足这几个目标:
- 可扩展 含义:新业务、新环境、新集群、新网段能继续加
- 可隔离 含义:生产、测试、办公、外联、平台组件边界清晰
- 可互联 含义:多 VPC、多地域、混合云、IDC 上云时可持续演进
- 可治理 含义:访问控制、流量路径、出口策略、审计边界明确
- 可运维 含义:排障时能够快速判断问题是在路由、ACL、安全组、NAT 还是代理层
所以更准确地说:
云原生里的 VPC 规划,本质上是在做“平台网络分层设计”。
二、云原生场景里,VPC 规划到底要规划哪些东西¶
1. 地址空间规划¶
这是最底层也是最容易做错的一层。
你至少要先回答:
- 整体 VPC 用多大网段
- 各环境如何分段
- 各子网/交换机如何分段
- Kubernetes Pod 网段是否独立
- Service 网段如何选
- 是否预留未来扩容空间
如果你一开始随手用了一个小网段,例如:
那么你后面很快就会遇到这些问题:
- 子网数量不够拆
- 节点数量扩不起来
- Pod 地址规划被迫挤在同一个段里
- 和 IDC、办公网、其他云网段冲突
在云原生平台里,地址空间规划最好遵循两个原则:
- 一开始就按“未来规模”留足空间
- 网段切分要体现环境边界和系统角色,而不是只按“今天有几台机器”来切
2. 环境隔离规划¶
云原生平台最少会有这些环境:
- 生产
- 预发
- 测试
- 开发
- 平台公共组件
一个常见错误是把所有环境都堆进同一个 VPC,只靠命名区分。
短期看省资源,长期看会带来:
- 路由和安全策略难管理
- 测试环境误访问生产
- 灰度流量、压测流量影响生产
- 网络问题定位边界模糊
更合理的思路通常是:
- 高隔离要求环境拆 VPC
- 同一环境内部再拆子网/交换机
例如:
这样做的好处是:
- 路由边界清晰
- 安全控制更自然
- 后续接云企业网/专线/VPN 更清楚
- 故障域更可控
3. 业务分层规划¶
在云原生场景里,网络不应该只按“机器类型”拆,更应该按“访问边界”拆。
一个典型业务分层可以这样看:
- 接入层 含义:SLB、Ingress、反向代理、API Gateway
- 计算层 含义:Kubernetes Node、ECS、工作负载
- 数据层 含义:MySQL、Redis、Kafka、Elasticsearch
- 管理层 含义:堡垒机、运维平台、监控、CI/CD、镜像仓库
- 出口层 含义:NAT Gateway、EIP、边界防火墙
这些层并不一定都必须物理隔离到不同 VPC,但至少应该有逻辑边界。
一个常见的反例¶
如果你把下面这些东西全放在一个可互通子网里:
- Kubernetes Node
- MySQL
- 堡垒机
- Jenkins
- Kafka
- Nginx
那么后续会出现:
- 安全策略全靠人记
- 很难定义最小访问权限
- 某个节点被打穿后横向移动成本很低
三、为什么 Kubernetes 会放大 VPC 规划问题¶
在传统单体应用时代,很多人对网络规划的感知没有那么强。
因为以前通常是:
- 几台 ECS
- 一套数据库
- 一层 Nginx
而 Kubernetes 会把网络问题放大,原因在于它天然引入了更多层次:
- Node 网络
- Pod 网络
- Service 网络
- Ingress 入口
- 集群间互联
- CNI 插件行为
1. Pod 网段规划不能拍脑袋¶
很多团队第一次上 K8s 时,只知道“Pod 需要网段”,但不知道这件事会影响多大。
如果 Pod 网段设计得不好,后续可能会出现:
- 与 VPC 内已有网段冲突
- 与 IDC 网段冲突
- 与另一套集群冲突
- 跨集群互联困难
所以在做 VPC 规划时,必须一起规划:
- VPC 网段
- Node 所在子网
- Pod CIDR
- Service CIDR
经验建议¶
- Pod CIDR 尽量使用独立网段
- Service CIDR 不要与任何真实网络重叠
- 多集群场景下,不同集群 Pod CIDR 不要重复
2. 不要把 Kubernetes 当成“只是多几台虚拟机”¶
Kubernetes 集群不是简单的主机池,它是平台入口。
你需要提前考虑:
- 未来是否多集群
- 是否跨可用区
- 是否需要独立集群承载不同环境
- 是否要接入服务网格
- 是否要做多地域容灾
如果你一开始把网络做得太紧,后面这些能力几乎都得重构。
3. 一个更贴近生产的案例:阿里云 ACK + Terway 网络插件¶
如果你的 Kubernetes 跑在阿里云 ACK 上,而且使用的是 Terway 网络插件,那么 VPC 规划就不能再按“节点够不够用”这么简单来做了。
原因在于:
在 Terway 的 ENI/ENIIP 等 VPC 网络模式下,Pod 地址来自 VPC 网络或与节点同属 VPC 地址规划体系。
这意味着:
- Pod IP 不再只是集群内部自娱自乐的地址
- Pod 会真实消耗 VPC/Pod 虚拟交换机里的可用地址
- 子网规模不仅决定节点上限,也会直接影响 Pod 容量
- Node vSwitch、Pod vSwitch、ENI 数量和实例规格会共同影响最终可调度规模
这和很多基于 Overlay 网络的集群差异很大。
落地前建议先核对阿里云官方的 ACK 网络规划 和 Terway 插件文档,重点确认 Pod 交换机、Service 网段、单节点 Pod 限额、ENI/IP 配额和 vSwitch 扩容限制。
先理解这个案例的核心矛盾¶
假设你有这样一个生产场景:
- 地域:华东 1
- 环境:生产
- 云平台:阿里云
- 集群:1 套 ACK 生产集群
- 网络插件:
Terway - 部署形态:多可用区高可用
- 工作负载:Java 微服务 + Ingress + Redis Operator + 日志采集 + 监控组件
如果你还是按传统思路,只给 ACK 节点子网随手划一个很小的网段,例如:
那你很可能在业务增长后迅速遇到下面这些问题:
- 节点数量还没到瓶颈,但 Pod 地址已经快耗尽
- 新副本调度失败,表现为 Pod Pending
- Cluster Autoscaler 想扩容,但目标交换机可用 IP 不足
- 某个可用区子网过小,导致单 AZ 先打满
- 业务扩容、滚动发布、临时双倍副本时更容易触发 IP 紧张
也就是说,在 ACK + Terway 场景里,网络规划必须把 Pod 容量 当成一等公民来考虑。
这个案例里应该怎么规划¶
更贴近生产的思路通常是:
1. 生产 VPC 独立¶
例如:
不要把生产 ACK 和测试、预发混在一个 VPC 里。
原因很现实:
- Terway Pod 会直接占 VPC 地址
- 集群扩容和业务扩容会长期消耗地址池
- 混环境后很容易互相抢地址空间
2. ACK 节点/Pod 子网按可用区拆分,并留足富余量¶
例如:
这里不要只看“当前 10 台节点够不够”,而要看:
- 峰值副本数
- 滚动发布时的额外 Pod
- HPA 扩容空间
- DaemonSet 常驻开销
- 集群组件和系统 Pod 开销
生产里一个常见错误是:
- 业务当前只需要几百个 Pod
- 就按几百个 Pod 去卡死网段
但真正上线后,你还要考虑:
- 扩容时的瞬时双倍副本
- 故障迁移带来的单 AZ 压力上升
- 节点替换时 Pod 重建
- 灰度发布时新旧版本并存
所以在 Terway 模式下,给节点子网预留比“当前估算值”更大的地址富余,是非常必要的。
一个更可落地的估算方式是按可用区单独算,而不是只看整个集群:
单 AZ Pod IP 需求 =
稳态业务 Pod 数
+ 系统组件 / DaemonSet Pod 数
+ 滚动发布额外 Pod 数
+ HPA / 大促峰值 Pod 数
+ 故障迁移冗余 Pod 数
+ 20%~30% 缓冲
然后再结合:
- 每个节点的最大 Pod 数
- ECS 实例规格支持的 ENI/IP 数量
- 该可用区 vSwitch 可用 IP 数
- 云厂商保留地址和集群组件开销
去反推每个 AZ 至少要给多大的子网。这样算出来的结果通常会比“当前副本数”大一截,但这部分空间就是发布、扩容和故障迁移时的弹性。
3. 数据库、中间件、运维管理面不要和 ACK 节点/Pod 混在同一子网¶
更推荐这样拆:
10.32.8.0/22 ACK AZ-A
10.32.12.0/22 ACK AZ-B
10.32.16.0/22 ACK AZ-C
10.32.30.0/24 数据库
10.32.31.0/24 中间件
10.32.32.0/24 运维管理面
10.32.40.0/24 Ingress / SLB 相关资源
原因是:
- Terway 模式下,ACK 子网的地址消耗会持续变化
- 数据层和管理层更适合稳定、边界清晰的网段
- 混在一起会让 IP 规划、权限边界和排障都变复杂
4. 提前规划好集群后续扩容和第二套集群的位置¶
生产里常见演进路线不是“一套集群永远跑到底”,而是:
- 业务增长后要扩第二套集群
- 核心业务和普通业务拆集群
- 有状态组件和无状态组件拆集群
- 新版本集群替换旧版本集群
所以更稳的做法不是把整个生产 VPC 地址一次性用满,而是提前预留例如:
10.32.8.0/22 ACK 生产集群 1
10.32.12.0/22 ACK 生产集群 1
10.32.16.0/22 ACK 生产集群 1
10.32.48.0/22 预留给未来 ACK 集群 2
10.32.52.0/22 预留给未来 ACK 集群 2
10.32.56.0/22 预留给未来 ACK 集群 2
这样当你后续做:
- 集群迁移
- 蓝绿集群切换
- 新旧版本并行
- 按业务域拆集群
时,不会被地址规划反向卡死。
这个案例里最容易忽略的生产细节¶
1. 不是“节点够了”就行,而是“子网 IP 够不够 Pod 用”¶
在 Terway 模式下,Pod 地址是 VPC 真实地址,所以容量规划一定要盯:
- 节点数
- 每节点可承载 Pod 数
- 子网总可用 IP
- 三者之间的关系
2. 滚动发布会放大 IP 压力¶
很多业务平时副本数看着不高,但一到:
- 灰度
- 金丝雀
- 滚动发布
- 大促扩容
新旧 Pod 并存,IP 消耗会突然抬升。
如果地址只按“稳态运行值”估,就很容易在发布窗口出问题。
3. 单可用区打满比整集群打满更常见¶
因为 Pod 调度、节点分布、AZ 容量并不总是完全均匀。
你在生产里更应该防的是:
- AZ-A 子网先耗尽
- 导致该可用区无法继续扩节点或扩 Pod
- 最终影响高可用和调度均衡
所以生产规划里,通常每个 AZ 都应单独预留足够空间,而不是只看整个 VPC 总量。
从这个案例能得到的结论¶
如果你在阿里云 ACK 中使用 Terway,那 VPC 规划必须从“主机网络规划”升级为“节点 + Pod 一体化网络规划”。
更直白地说:
在
ACK + Terway生产场景里,VPC 子网大小直接影响集群容量上限、发布弹性、扩容能力和高可用设计。
这类场景下最容易踩的坑不是“网络不通”,而是:
- 地址规划太小
- 环境混用
- 子网边界混乱
- 没有预留第二套集群空间
所以如果你的云原生平台明确会使用 Terway,那么在 VPC 规划阶段就必须把它当成一级约束条件,而不是后面再补。
四、从云原生专家视角,推荐怎么规划¶
下面给一个更偏平台建设的推荐思路。
1. 先按“区域级总地址池”来规划¶
不要先从某个业务开始切网段,而是先做一个区域级规划。
例如:
华东区域总池:10.32.0.0/12
生产 VPC:10.32.0.0/16
预发 VPC:10.33.0.0/16
测试 VPC:10.34.0.0/16
共享服务 VPC:10.35.0.0/16
这样做的好处:
- 一眼能看出环境归属
- 后续扩展有连续空间
- 和其他地域不容易打架
2. 同一 VPC 内按角色拆子网¶
例如生产 VPC 可以再拆:
10.32.1.0/24 ingress 子网
10.32.2.0/24 k8s node 子网-a
10.32.3.0/24 k8s node 子网-b
10.32.4.0/24 数据库子网
10.32.5.0/24 中间件子网
10.32.6.0/24 运维管理子网
10.32.7.0/24 NAT / 出口相关子网
这时你得到的不是一堆随机地址,而是一套有角色语义的网络。
3. 生产与非生产尽量不要混 VPC¶
这是很重要的原则。
因为一旦混在一起,后面几乎所有事情都会变难:
- 授权边界
- 访问审计
- 路由治理
- 故障隔离
- 成本分账
如果资源预算允许,生产和非生产至少要拆成不同 VPC。
4. 出口策略单独设计,不要默认全放通¶
很多团队的公网访问策略一开始就做错:
- 所有节点都能直接上公网
- 所有业务都能随意访问外部
- 没有统一出口审计
在云原生平台里,更合理的做法通常是:
- 统一走 NAT Gateway 或统一出口
- 按环境控制出网权限
- 对高敏感环境设置更严格的出口限制
这样做的意义不仅仅是安全,也包括:
- 排障更容易
- 出口流量更好统计
- 风险暴露面更小
5. 管理面流量和业务面流量尽量分开¶
例如:
- 堡垒机访问
- kubectl/API Server 管理流量
- 监控采集流量
- 业务服务调用流量
如果这些都混在同一条路径里,后果通常是:
- 管理口暴露面过大
- 排障时很难分辨哪类流量异常
- 安全策略容易一刀切
从平台治理角度看,至少要在安全策略和访问入口上做区分。
五、一个更适合云原生平台的参考模型¶
下面给一个参考拓扑,不是唯一答案,但思路比较稳。
flowchart TB
Internet[互联网]
Office[办公网络 / VPN]
CEN[云企业网 / VPC互联]
subgraph Shared[共享服务 VPC]
Bastion[堡垒机]
DevOps[CI/CD / 镜像仓库 / 运维平台]
Monitor[监控与日志平台]
end
subgraph Prod[生产 VPC]
Ingress[SLB / Ingress]
K8sProd[Kubernetes 生产集群]
DBProd[MySQL / Redis / Kafka]
NATProd[NAT Gateway]
end
subgraph Test[测试 VPC]
K8sTest[Kubernetes 测试集群]
DBTest[测试数据库]
NATTest[NAT Gateway]
end
Internet --> Ingress
NATProd --> Internet
NATTest --> Internet
Office --> Bastion
Bastion --> K8sProd
Bastion --> K8sTest
DevOps --> K8sProd
DevOps --> K8sTest
Monitor --> K8sProd
Monitor --> K8sTest
CEN --> Shared
CEN --> Prod
CEN --> Test 这个模型背后的设计思想是:
- 公共能力独立
- 生产与测试隔离
- 出口统一
- 管理入口收敛
- 多 VPC 通过统一互联打通
六、常见错误做法¶
1. 一开始图省事,只建一个 VPC¶
短期确实快,但后面往往会变成:
- 所有环境混跑
- 安全策略越来越复杂
- 任何变更都容易影响全局
2. Kubernetes Pod 网段和现有内网撞了¶
这是非常常见的问题。
很多人建集群时默认用了一个网段,后面接专线、接 IDC、接第二个集群时才发现冲突。
这类问题一旦落地后再改,代价会很大。
3. 安全组和路由全靠人工零散维护¶
一开始量小还行,后面就会进入:
- 谁也说不清哪条规则为什么存在
- 某条规则删了怕业务炸
- 某个访问不通时排障成本极高
网络规划不只是“有规则”,还要有清晰分层和可解释性。
4. 没给未来留扩展空间¶
最典型的后果是:
- 多集群上不去
- 新环境拆不出来
- 新地域复制困难
网络规划最怕的不是现在浪费一点地址,而是未来完全没法扩。
七、落地时的实操建议¶
如果你是云原生平台负责人,我建议按下面顺序推进。
第一步:先画“目标态网络图”¶
不要直接建资源,先回答:
- 有几个环境
- 有几个 VPC
- 管理入口在哪里
- 业务入口在哪里
- 出口在哪里
- 数据库和中间件怎么分层
- Kubernetes 有几个集群
第二步:统一地址规划台账¶
至少维护一份清晰台账,记录:
- VPC 网段
- 子网用途
- Pod CIDR
- Service CIDR
- 预留空间
- 互联关系
这份台账在后续扩容和排障里非常重要。
可以先用下面这种轻量模板管理起来:
| 区域 | 环境 | VPC | VPC CIDR | 可用区 | 子网/交换机 | 子网 CIDR | 用途 | Pod CIDR / Pod vSwitch | Service CIDR | 互联对象 | 预留说明 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 华东 1 | 生产 | prod-vpc | 10.32.0.0/16 | A | prod-ack-a | 10.32.8.0/22 | ACK Node/Pod | Terway Pod vSwitch | 172.20.0.0/16 | shared-vpc、CEN | 预留 30% 发布和扩容空间 |
| 华东 1 | 生产 | prod-vpc | 10.32.0.0/16 | A/B/C | prod-db | 10.32.30.0/24 | 数据库 | 不适用 | 不适用 | ACK、堡垒机 | 不与 ACK Pod 地址池混用 |
| 华东 1 | 共享 | shared-vpc | 10.35.0.0/16 | A | shared-ops | 10.35.10.0/24 | 堡垒机/运维平台 | 不适用 | 不适用 | prod-vpc、test-vpc | 管理入口统一收敛 |
第三步:把网络边界和安全边界一起设计¶
不要先规划网段,后面再补安全。
更合理的顺序是同时考虑:
- 哪些系统应该互通
- 哪些系统不该互通
- 谁可以访问管理面
- 谁可以访问数据层
第四步:优先考虑未来互联¶
如果你的平台未来有这些可能:
- 多云
- 混合云
- 多地域
- IDC 上云
那么一开始的网段规划就必须把这些考虑进去。
八、最后总结¶
从云原生专家视角看,VPC 网络规划从来不是“给几台主机分配地址”,而是平台架构设计的一部分。
如果要把这篇文章压缩成几个最重要的结论,我会总结成下面 5 条:
VPC 规划的目标不是先通,而是长期可扩展、可隔离、可治理生产、测试、共享服务最好按环境或角色拆分 VPC 与子网Kubernetes 的 Node、Pod、Service 网段必须和 VPC 规划一起设计出口、管理面、业务面、数据面应该有明确边界一开始多花一点时间做规划,远比后面网络重构便宜
真正成熟的云原生平台,网络从来不是最后补的,而是一开始就要设计清楚的底座。