Проблема, которую я вижу, заключается в том, что когда nova-network вызывает dhcprelease при завершении экземпляра (из-за forcehcp_release = Верно) адрес не всегда освобождается (syslog не показывает запрос DHCPRELEASE). Позже, если nova назначила новому экземпляру тот же IP-адрес, который был не высвобожден, запрос DHCP игнорируется, и ошибка в системном журнале покажет, что dnsmasq увидел запрос и отклонил его, потому что IP-адрес уже был арендован для другого MAC-адреса (принадлежащего старой, завершенной виртуальной машине).
Некоторые подробности о моей настройке:
Когда хосты могут получить свой IP-адрес от DHCP-сервера, все работает отлично. Кажется, что ошибка возникает только тогда, когда IP-адрес не может быть выпущен и блокирует его последующее использование для будущих виртуальных машин.
Я проверил наличие ошибок в журналах nova- * и не нашел их. Единственные ошибки в моем системном журнале, когда dnsmasq отказывается арендовать IP-адрес из-за конфликтующих MAC-адресов..
Любая информация или предложения будут очень благодарны.
Тем не менее, я не могу найти идеального решения этой проблемы, но я нашел проблемную область и нашел способ ее обойти.
1. Проблемная область: Проблема заключается в dnsmasq, а не в OpenStack. Я заметил, что OpenStack каждый раз выполняет функцию «dhcprelease» после завершения экземпляра, но dnsmasq отвечает только на несколько запросов dhcprelease.
2. Решение: Время аренды по умолчанию для любого LP составляет 24 часа (86400 секунд), что означает, что каждый экземпляр должен продлевать аренду через каждые 24 часа. Если экземпляр не продлевает аренду IP-адреса, то dnsmasq сочтет эту аренду недействительной и освободит IP-адрес, полученный в результате этой аренды.
Я сократил срок аренды до 3 минут (180 секунд). Таким образом, любая аренда не сможет удерживать IP более 3 минут после завершения экземпляра.
Шаги по сокращению срока аренды до 3 минут:
Выполните следующие шаги на всех вычислительных узлах один за другим.
vi /etc/nova/nova.conf
[ДЕФОЛТ]
...
dhcp_lease_time = 180
Сохраните и закройте файл.
Убейте процесс dnsmasq для каждого моста на сервере. (ИЛИ вы также можете выполнить killall, если dnsmasq не используется для каких-либо других целей)
kill (ИЛИ killall dnsmasq)
перезапустить nova-api-metadata
перезапустить nova-compute
перезапустить nova-network