multus 通过子网配置(如 networkattachmentdefinition)中 ipam.type 设为 "whereabouts" 来调用 whereabouts,而非在 multus 主配置中设置;whereabouts 二进制需部署至 /opt/cni/bin/,且其 cni 配置须显式指定 rangestart/rangeend 并对齐子网掩码,支持 ranges 数组、gc 回收及 exclude 等字段,不兼容 host-local 的 routes/dns 等字段。

multus 如何识别并调用 whereabouts 作为 IPAM 插件
multus 本身不管理 IP 分配,它只负责把 networks 字段里声明的 CNI 配置逐个执行。要让 multus 使用 whereabouts,关键不是在 multus 配置里写 whereabouts,而是在你定义的**子网配置(如 macvlan-conf)中指定 type: "whereabouts" 作为 ipam 的 type 值。
常见错误是误以为要在 multus 的主配置里加 whereabouts 相关字段——那完全无效。multus 只读取你通过 NetworkAttachmentDefinition 提交的 CNI JSON,IPAM 行为由那个 JSON 的 ipam 段决定。
- 确保
whereabouts二进制已部署到所有节点的/opt/cni/bin/目录下(和macvlan、bridge等同级) -
NetworkAttachmentDefinition中的 CNI 配置必须包含完整ipam段,且type设为"whereabouts" - whereabouts 不支持
range写法(如192.168.1.0/24),必须用rangeStart+rangeEnd或ranges数组显式切分
whereabouts 的 rangeStart/rangeEnd 必须严格对齐子网掩码
whereabouts 不做 CIDR 校验,它只按字面解析 rangeStart 和 rangeEnd。如果填了 "10.10.1.10" 到 "10.10.1.200",但底层网络实际是 /23(即跨 10.10.0.0–10.10.1.255),whereabouts 仍会照常分配,但可能导致 ARP 冲突或路由不可达。
典型现象:Pod 能拿到 IP,ping 宿主机通,但跨节点不通;ip neigh show 查不到对应 MAC,说明 L2 未学习到该 IP。
- 务必用
ipcalc或cidr-report校验rangeStart/rangeEnd是否落在同一子网内 - 避免使用
/32单地址 —— whereabouts 会把它当有效范围,但多数 CNI 主插件(如macvlan)不支持 host-local /32 场景 - 若需多段不连续地址,用
ranges数组而非拼接字符串,例如:"ranges": [[{"rangeStart": "10.10.1.10", "rangeEnd": "10.10.1.50"}], [{"rangeStart": "10.10.1.100", "rangeEnd": "10.10.1.150"}]]
multus + whereabouts 下 Pod 删除后 IP 不立即回收
whereabouts 默认启用 gc(garbage collection),但它依赖 kube-apiserver 的 watch 事件触发清理。如果网络断连、apiserver 延迟或 Pod 被强制 kill -9(绕过 CNI DEL 调用),IP 就会滞留。
表现是:重复创建 Pod 时,whereabouts 报错 "failed to allocate IP: no more available IPs",但 kubectl get ipaddress 查不到对应记录 —— 实际是孤儿 IP 条目卡在 etcd 的 ippools 或 ipaddresses CRD 里没删干净。
- 手动清理方式:
kubectl get ipaddress -A | grep <stale-ip></stale-ip>→kubectl delete ipaddress <name> -n <ns></ns></name> - 生产环境建议开启
gcInterval(单位秒),例如"gcInterval": "300",让 whereabouts 主动轮询扫描 - 不要关闭
gc:设"gc": false后,所有释放逻辑全靠 CNI DEL,故障场景下极易耗尽 IP 池
whereabouts 与 host-local IPAM 的行为差异容易引发配置混淆
host-local 支持 routes、gateway、dns 等字段,whereabouts 全都不认。它只管 IP 分配和回收,其他网络属性(比如默认路由、DNS 配置)必须由主 CNI 插件(如 macvlan)自己处理,或靠 Kubernetes 的 dnsConfig/hostNetwork 等机制补足。
一个典型坑:把 host-local 的配置原样套给 whereabouts,比如保留 "routes": [{"dst": "0.0.0.0/0"}],whereabouts 会静默忽略整段 ipam 配置,回退到内置默认行为(通常是随机选一个可用 IP),导致预期外的地址分配。
- whereabouts 的合法
ipam字段只有:type、rangeStart、rangeEnd、ranges、exclude、logFile、logLevel、gc、gcInterval - 所有非上述字段都会被丢弃,不会报错也不会警告
- 调试时用
whereabouts --version确认版本(v0.7+ 才支持exclude和gcInterval),旧版不支持这些字段
whereabouts 的 IP 管理逻辑藏在 etcd 的 CRD 里,不是文件或内存态;一旦写错配置导致 IP 泄漏,修复得查 etcd + 清 CRD,不是重启组件就能解决。










