Korzystanie z prywatnych sieci fizycznych w trybie roju Docker

11

Pracuję nad konfiguracją produkcji z Dockerem w trybie roju (używając Docker 17.03.1-ce). Będą zaangażowane 2 centra danych. W obu centrach danych wszystkie maszyny mają zarówno publiczny adres IP, jak i prywatny adres IP (lokalny do centrum danych) w sieci prywatnej, więc będą 2 sieci prywatne.

Link do uproszczonej konfiguracji wizualizacji diagramów

Ruch sieciowy przez prywatne interfejsy sieciowe jest bezpłatny, podczas gdy ruch przez interfejs publiczny nie przekracza pewnego limitu (i jest wolniejszy), więc w miarę możliwości wolałbym, aby ruch sieciowy przekraczał prywatne interfejsy.

Teraz z tego, co rozumiem (myślę), cały ruch między węzłami Docker w trybie roju przejdzie przez ten sam interfejs sieciowy, który jest używany do komunikowania się z mistrzami roju, które w moim przypadku będą musiały być publiczne, aby utworzyć sieć z wieloma DC możliwy. Najbardziej oczekiwany ruch będzie jednak między węzłami w tych samych kontrolerach domeny i byłoby bardzo miło, gdyby Docker mógł w jakiś sposób kierować ruch przez moje prywatne sieci, jeśli węzły źródłowy i docelowy znajdą się w tej samej sieci prywatnej.

Obawiam się, że nie jest to możliwe od razu po wyjęciu z pudełka, ponieważ mistrzowie roju nie wiedzą o tych prywatnych sieciach i adresach IP, które mają na nich węzły.

Jednym z rozwiązań, które mogłem wymyślić, jest skonfigurowanie sieci VPN i rozmieszczenie roju nad tym, ale to dodaje dodatkowej złożoności i wolałbym czyste rozwiązanie roju Docker.


Aktualizacja : jak zasugerowano w komentarzu, podstawą rozwiązania może być użycie iptables do kierowania ruchu wychodzącego do prywatnych adresów IP zamiast publicznych. Jeśli jednak chciałbym to zrobić, moim następnym problemem byłoby zarządzanie wszystkimi tymi regułami. Mając 10 serwerów w DC, potrzebowałbym 10 * 9 = 90 z nich, aby kierować cały możliwy ruch lokalny przez sieć prywatną. Mogę sobie wyobrazić, że może istnieje jakieś narzędzie, które mogłoby pomóc w takim zadaniu lub mógłbym je stworzyć, ale może jest to o wiele prostszy sposób.

Ede
źródło
1
Możesz użyć iptables do przepisania docelowego adresu IP rodzeństwa w tym samym centrum danych na ich prywatną sieć IP. Powinno to również
dotyczyć błędu serwera, a
Tak, trochę więcej kopania doprowadziło mnie do tego samego wniosku. To będzie kłopot, naprawdę potrzebuję narzędzia, aby zrobić to dla mnie automatycznie (przepisać wszystkie adresy IP między wszystkimi węzłami w klastrze / DC). W końcu dla N węzłów potrzebowałbym (N-1) ^ 2 reguł iptables.

Odpowiedzi:

1

(Prawdopodobnie powinien to być komentarz, ale nie może jeszcze komentować)

Ponieważ nie można używać nazw hostów i / lub DNS do ładowania klastra, nie widzę sposobu, aby wymusić wymianę danych tratwy klastra w prawidłowej sieci bez pomiaru, ale widzę, że można użyć nazwy interfejsu. Co ciekawe, nie podano tego w dokumentach roju, ale problem pokazuje, że komunikat o błędzie oczekuje adresu IP lub interfejsu.

Zastanawiam się, czy możesz ustawić członków klastra do reklamowania przy użyciu prywatnej nazwy interfejsu, aby uzyskać największy ruch w pożądany sposób.

Nie mogę się teraz przetestować, ale zrobię to w przyszłym tygodniu, ponieważ mogę napotkać podobny problem w nadchodzącym projekcie.

Pablo
źródło
Dzięki, daj mi znać, jeśli dowiesz się czegoś w przyszłym tygodniu. Problem, z którym się łączysz, dotyczy „starej” funkcjonalności roju Docker, podczas gdy ja używam (i radzę ci użyć) nowego trybu roju Docker , który jest wbudowany i nie wymaga zewnętrznego magazynu kluczy / wartości.
Ede