ovn address set 中的 IP 数量是否有限制

23 阅读1分钟

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、逻辑分段、使用端口组自动生成等)。