我看到的问题是,当 nova-network 在实例终止时调用 dhcprelease 时(由于forcedhcp_release=True)地址并不总是被释放(系统日志未显示 DHCPRELEASE 请求)。然后,如果 nova 为新实例分配了与之前相同的 IP 地址不是释放的 DHCP 请求将被忽略,并且系统日志中的错误将显示 dnsmasq 看到该请求并拒绝,因为该 ip 地址已被租用给不同的 MAC 地址(属于旧的、已终止的 VM 的 MAC 地址)。
关于我的设置的一些细节:
- Juno 发布
- 传统(nova-)网络
- Ubuntu 14.04
- DHCP 由 DNSMASQ 处理。
当主机能够从 DHCP 服务器获取其 IP 地址时,一切似乎都运行正常。似乎只有在无法释放 IP 并阻止后续 VM 使用该 IP 时才会出现错误。
我检查了我的 nova-* 日志中是否有任何错误,但没有发现任何错误。唯一的错误出现在我的系统日志中,当时 dnsmasq 由于 MAC 地址冲突而拒绝租用 IP 地址。
任何信息或建议都将非常感谢。
答案1
我仍然无法找到该问题的完美解决方案,但我已经找到问题区域并找到一些解决方法。
1.问题区域:问题出在 dnsmasq 上,而不是 OpenStack 上。我发现 OpenStack 每次在终止实例后都会执行“dhcprelease”函数,但 dnsmasq 只响应少数 dhcprelease 请求。
2.解决方法:任何 IP 的默认租约时间为 24 小时(86400 秒),这意味着每个实例必须每 24 小时续订一次租约。如果实例不续订其 IP 租约,则 dnsmasq 将认为该租约无效并释放通过该租约获得的 IP。
我已将该租约缩短至 3 分钟(180 秒)。因此,在终止实例后,任何租约都无法持有 IP 超过 3 分钟。
将租赁时间缩短至 3 分钟的步骤:
在所有计算节点上逐一执行以下步骤。
- 打开文件 /etc/nova/nova.conf
修改 /etc/nova/nova.conf
- 在 [DEFAULT] 部分配置 dhcp_lease_time。
以秒为单位。
[默认]
...
dhcp_lease_time = 180
保存并退出文件。
终止服务器上每个网桥的 dnsmasq 进程。(或者,如果 dnsmasq 没有用于任何其他目的,您也可以执行 killall)
kill (或者 killall dnsmasq)
- 重新启动服务。
重新启动 nova-api-metadata
重新启动 nova-compute
重新启动 nova-network