亲手划分地址空间
目标
划分网段是最难撤销的决策之一。VPC 网段创建后无法缩小, 子网中存在资源时也无法删除。最初 30 分钟做出的决定可能会沿用数年。
这里不使用计算器,而是根据边界与长度得出答案。
材料
/opt/lab/netplan/allocations.txt 사내 대역 배정표
/opt/lab/netplan/routes.txt 어느 라우터의 표
先把文件复制到工作目录。
mkdir -p /root/netplan && cp /opt/lab/netplan/* /root/netplan/ && cd /root/netplan
需要留下的文件
01-here.txt 내 주소·프리픽스·기본 경로
02-split.txt /16 을 나눈 계획
03-overlap.txt 겹치는 짝
04-longest.txt 세 목적지가 가는 길
05-usable.txt 크기별로 실제 쓸 수 있는 수
我现在位于哪里
将这个 Pod 的 IPv4 地址、前缀和默认路由保存到 01-here.txt,并用一行说明这个前缀表示什么。
使用 ip -4 -o addr show 和 ip route。
如果前缀是 /32,就表示同一网段中一个邻居也没有。即便如此仍能访问外部,是因为另有一条 scope link 路由。
按照边界划分
将 10.20.0.0/16 划分为四个 /18,并把前三个分配给三个 AZ。将每个 AZ 的第一个 /24 设为公有子网。保留第四个 /18,并写明为什么要保留。结果保存到 02-split.txt。
python3 -c "import ipaddress as ip; print([str(n) for n in ip.ip_network('10.20.0.0/16').subnets(new_prefix=18)])"
每个 /18 的第一个 /24,就是在该 /18 的起始地址后使用 /24 前缀。
请写明保留第四个的原因。VPC 网段以后扩展起来很麻烦;如果增加一个 AZ 或一种用途时没有可衔接的空间,就必须另外引入一个网段。
找出重叠的组合
从 allocations.txt 中找出所有彼此重叠的网段组合,写入 03-overlap.txt,再用一行说明发生重叠时会妨碍什么。
使用 ipaddress.ip_network(a).overlaps(ip_network(b)) 检查所有组合。
重叠的组合有两组。不要加入不重叠的组合——如果把不重叠的网段误报为重叠,就会让人重新规划原本没有问题的网段。
决定路径的是长度,而不是顺序
查看 routes.txt,把 10.20.4.200 · 10.20.9.5 · 172.20.1.1 分别经由哪条路由发出写入 04-longest.txt。下一跳地址也要写明。
内核不看表中的顺序。如果有多条匹配的路由,就选择前缀最长的一条。
10.20.4.200 同时匹配 /24 和 /25。10.20.9.5 匹配 scope link 路由,这表示它不经过网关。
实际可用的地址数量
针对 /24 · /25 · /26 · /28,把各自的地址总数以及云平台保留五个地址后实际可用的数量以表格形式写入 05-usable.txt,再用一行说明这五个地址分别用于什么。
总数为 2^(32-프리픽스)。大多数云平台会在每个子网中保留五个地址——网络地址、网关、DNS、预留地址、广播地址。
子网越小,这种损失所占比例就越大。/28 的 16 个地址中会少掉五个。
哪些地址可以使用
将所有可供内部使用的网段写入 06-private.txt,并标出 allocations.txt 中的每个网段属于哪个私有地址范围。再用一行说明应该避开哪些地址。
RFC 1918 规定了三个网段,此外 RFC 6598 还规定了一个网段。它虽然不是私有地址,但不会在互联网上路由,因此可在企业内部使用。
也要写明应避开的地址。10.0.0.0/16 和 192.168.0.0/24 是人人都会优先选择的网段,因此最有可能与将来需要互联的对象发生重叠。
留下规则,而不是表格
在 07-decide.md 中写下规则,让后来的人无需查看文档也能自行选择网段。分别说明区域、AZ、用途这三个层级各使用多大的网段,以及为什么要留得宽裕。
‘哪个团队使用哪个网段’这样的表格很快就会过时。相反,如果留下**‘每个区域 /16、每个 AZ /20、每种用途 /24’**这样的规则,即使不看表格也不会发生冲突。
也要写明为什么要规划得大一些。IP 地址免费,地址不足的代价却很高——一旦接入每个 Pod 都占用 IP 的容器网络,/24 很快就会耗尽。