ovn 24.03 代码分析:
-
Address_Set.addresses在 NB/SB 两份 schema 里都声明为{"type":{"key":"string","min":0,"max":"unlimited"}}(参见 ovn-nb.ovsschema 第 163 行附近、ovn-sb.ovsschema 第 75 行附近),官方文档 ovn-nb.xml 亦只说明“地址集合”是任意多地址的字符串集合,没有给定硬限制。 -
实际实现同样没有额外约束:
ovn-northd和ovn-controller读写sbrec_address_set->addresses / n_addresses时直接把n_addresses传入expr_const_sets_add_integers()(ovn-controller.c 第 2239 行起),未做截断或上限检查。 -
因此理论上容量仅受环境资源限制:
ovn-nbctl命令行一次性塞入大量地址会先受 shell/argv 长度(典型 128 KiB 左右)约束,可用--set、--add多次提交绕开。- OVSDB 事务必须把整个地址集序列化为 JSON;事务消息不能超过服务器允许的最大 JSON 大小(默认接近 256 MB),同时客户端也要有足够内存。
- 每条地址在控制平面会生成
expr_constant、Southbound Address_Set 行、乃至大量逻辑流/OpenFlow 流;集合越大,ovn-northd和各ovn-controller节点 CPU、内存、回放延迟增加,收敛时间呈线性甚至更差的增长。实践中成千上万地址仍可工作,但如果集合规模达数十万,就会遇到明显的性能和刷新瓶颈。
-
总结:Schema 没有硬性上限,Address_Set 从规格上可以存“无限”数量的 IP 地址,但实际可行数量取决于命令输入方式、OVSDB 事务大小、控制平面和数据平面可用资源。若需要极大的集合,建议评估
ovn-northd及ovn-controller的处理时间并考虑拆分策略(多个 Address_Set、逻辑分段、使用端口组自动生成等)。