Назначьте плавающий IP-адрес openstack, убедившись, что он не будет удален с другого сервера
(Я использую openstack4j для общения с OpenStack через REST API)
Я хотел бы повторно использовать некоторые из неназначенных плавающих IP-адресов, выделенных в моем клиенте (выделить для новых серверов). Тем не менее, кажется, что addFloatingIp
действие не имеет значения между назначением неиспользуемого плавающего IP-адреса и переназначением его с сервера на сервер.
Я хотел бы автоматизировать процесс, но я боюсь следующего условия гонки: один клиент проверяет определенный IP бесплатно, и прежде чем ему удается связать его с сервером A, другой клиент связывает его с сервером B. С точки зрения второго клиента, связанный плавающий IP-адрес может быть удален в любой более поздней точке после успешного ассоциирования.
Есть ли лучший способ?
2 ответа
Возможные обходные пути для этого:
- Только удаляйте и создавайте плавающие IP-адреса. Как вы говорите, это предпочтительный способ. Очистка плавающих IP-адресов, которые больше не используются, может регулярно происходить изнутри маленькой виртуальной машиной. Но очистка снаружи клиентом API должна быть предпочтительной. Таким образом, каждый клиент должен интегрировать эту функциональность, однако следует позаботиться о том, чтобы это было задумано пользователем, чтобы не потерять что-то важное. Примеры: веб-интерфейс, который вы используете для удаления виртуальных машин, может спросить, следует ли также удалить связанную плавающую виртуальную машину. Openstack Heat (оркестровка через шаблоны) делает это автоматически. Клиент CLI может предложить удалить освобожденные ресурсы после удаления виртуальной машины.
- Используйте что-то, что поддерживает синхронизацию для координации. Примеры: etcd, база данных (SQL или нет) с поддержкой транзакций, очереди, которые могут гарантировать, что доставка выполняется ровно один раз (например, OpenStack Zaqar с его функцией утверждений).
- Используйте время для синхронизации: прочитайте, измените, ожидая определенное время и, наконец, прочитайте снова, чтобы убедиться, что никто не изменил изменение. Прервать до определенного времени ожидания, если это изменение занимает слишком много времени. Повторите попытку с другим плавающим ip, если изменение было перезаписано. Это трудно сделать правильно, так как есть много угловых случаев, особенно с правильным прерыванием в ближайшее время, которые могут привести к неудаче. Например, высокая нагрузка может привести к успешному изменению спустя долгое время после его отмены, если не каждое место, через которое проходит изменение, гарантирует, что этого не произойдет.
Другие API-интерфейсы OpenStack имеют такую же проблему, например, обновление групп безопасности. В целом этого можно избежать, добавив счетчики ревизий в API, например, kubernetes (resourceVersion из ObjectMeta) и etcd ( ifiedIndex в v2, mod_revision в v3), чтобы сделать это.
Даже для API, который реализует опции для изменений без гонки, большинство пользовательских интерфейсов для людей может использовать это только для обнаружения гонки, но не для предотвращения, поскольку интерфейс, который сообщает им, что была гонка и что она перезаписала, предпочтительнее, чем тот, который требует повторных попыток. их действие каждый раз, когда происходит гонка.
Рассматриваемые проблемы касаются использования (в настоящее время не рекомендуется) расширения с плавающим IP-адреса службы Compute, которое разделяет распределение с плавающим IP на два этапа: распределение (/os-floating-ips
конечная точка) и назначение (addFloatingIp
действие сервера).
В настоящее время поддерживается способ манипулирования плавающими IP через сервис Neutron, который позволяет создавать и ассоциировать плавающие IP в одном запросе (POST
в /v2.0/floatingips
). Это, по крайней мере, теоретически, исключает возможность того, что клиент, желающий повторно использовать плавающий IP-адрес, примет один из них, связанный с другим клиентом, в то же время. При условии, что все клиенты соглашаются использовать этот режим назначения плавающего IP, несвязанный плавающий IP безопасен для повторного использования или утилизации.