Использование частных физических сетей в режиме роя Docker

11

Я работаю над производственной установкой с Docker в режиме роя (используя Docker 17.03.1-ce). Будет задействовано 2 центра обработки данных. В обоих центрах обработки данных все машины имеют как общедоступный IP-адрес, так и частный (локальный для ЦОД) IP-адрес в частной сети, поэтому будет две частные сети.

Ссылка на упрощенную настройку визуализации диаграммы

Сетевой трафик через частные сетевые интерфейсы является бесплатным, в то время как трафик через открытый интерфейс не превышает определенного предела (и он медленнее), поэтому, где это возможно, я бы предпочел, чтобы сетевой трафик проходил через частные интерфейсы.

Теперь, насколько я понимаю (я думаю), весь трафик между узлами Docker в режиме роя будет проходить через тот же сетевой интерфейс, который используется для связи с хозяевами роя, который в моем случае должен быть общедоступным для создания сетей с несколькими DC возможный. Однако наиболее ожидаемый трафик будет проходить между узлами в одних и тех же DC, и было бы очень хорошо, если бы Docker мог каким-то образом маршрутизировать трафик через мои частные сети, если бы исходный и целевой узлы находились в одной частной сети.

Боюсь, что это невозможно из коробки, потому что мастера роя не знают об этих частных сетях и IP-адресах, которые имеют узлы на них.

Одно из решений, которое я мог бы придумать, - это настроить VPN и развернуть роу поверх этого, но это добавляет дополнительную сложность, и я бы предпочел чистое решение Docker Swarm.


Обновление : как предлагается в комментарии, основой решения может быть использование iptables для маршрутизации исходящего трафика на частные IP-адреса, а не на общедоступные. Однако, если я захочу это сделать, моей следующей проблемой будет то, как управлять всеми этими правилами. С 10 серверами в DC мне понадобилось бы 10 * 9 = 90 из них для маршрутизации всего возможного локального трафика через частную сеть. Я могу представить, может быть, существует какой-то инструмент, который мог бы помочь с такой задачей, или я мог бы ее создать, но, возможно, есть гораздо более простой способ сделать это.

Эде
источник
1
Вы можете использовать iptables, чтобы переписать целевой ip братьев и сестер в том же центре данных в их частные сетевые ips. Кроме того, это должно быть на сервере, а не на SO;)
n00b32
Да, еще некоторые раскопки привели меня к тому же выводу. Это будет хлопотно, но мне действительно нужен инструмент, который сделает это для меня автоматически (перепишите все IP-адреса между всеми узлами в кластере / DC). В конце концов, для N узлов мне понадобятся (N-1) ^ 2 правила iptables.

Ответы:

1

(Возможно, это должен быть комментарий, но пока не могу комментировать)

Поскольку вы не можете использовать имена хостов и / или DNS для начальной загрузки кластера, я не вижу способа заставить данные кластерного обмена обменяться данными в правильной неизмеренной сети, но я вижу, что вы можете использовать имя интерфейса. Любопытно, что это не указано в Swarm Docs, но проблема показывает, что сообщение об ошибке ожидает IP или интерфейс.

Интересно, можно ли настроить членов кластера для рекламы, используя имя частного интерфейса, чтобы вы получали больше трафика так, как вам хочется.

Не могу проверить себя прямо сейчас, но буду на следующей неделе, так как я могу столкнуться с подобной проблемой для будущего проекта.

Pablo
источник
Спасибо, пожалуйста, дайте мне знать, если вы узнаете что-нибудь на следующей неделе. Проблема, с которой вы связались, связана со «старой» функциональностью роя Docker, тогда как я использую (и советую вам использовать) новый встроенный режим роя Docker, который не требует внешнего хранилища ключей / значений.
Ede