Połączone kontenery Docker z Mezos / Marathon

Do tej pory odniosłem wielki sukces, używając Mesos, Marathon i Docker do zarządzania flotą serwerów i kontenerów, które na nich umieszczam. Jednak teraz chciałbym pójść nieco dalej i zacząć robić rzeczy, takie jak automatyczne łączenie kontenera haproxy z każdą główną usługą dokującą, która się uruchamia, lub dostarczanie innych usług opartych na demonach i kontenerach, które są połączone i dostępne tylko dla pojedynczego kontenera macierzystego.

Normalnie najpierw uruchomiłbym serwis helper z jakąś nazwą, potem, kiedy zacząłem prawdziwy serwis, podlinkowałem go do pomocnika i wszystko było w porządku. Jak ten model pasuje do maratonu i Mezos? Na razie wydaje się, że konteneryzacja zakłada jeden kontener.

Miałem jeden pomysł, aby najpierw uruchomić usługę helpera, na dowolnym Hostie, który może znaleźć, a następnie dodać ograniczenie do prawdziwej usługi, że nazwa hosta = nazwa hosta usługi helpera, ale wydaje się, że spowodowałoby to problemy z ofertami zasobów i warunkami wyścigu dla te zasoby.

Pomyślałem również o udostępnieniu funkcji "embed" lub "deep-link" dockerowi lub skryptom wykonywalnym uruchamiającym kontenery Dockera.

Zanim przejdę którąkolwiek z tych ścieżek, chciałem się dowiedzieć, czy ktoś inny rozwiązał ten problem, lub czy po prostu strasznie nad tym myślałem.

Dzięki!

Author: William Thurston, 2014-02-24

1 answers

Wędrujesz po niezbadanym terytorium! ☺

Jest tu wiele podejść; i żaden z nich nie jest doskonały, ale sytuacja poprawi się w przyszłych wersjach Dockera, dzięki hookom orkiestracyjnym.

Jednym ze sposobów jest korzystanie ze starego, dobrego serwisu discovery i registration. Tzn. po uruchomieniu usługi znajdzie swój publicznie dostępny adres i zarejestruje się w np. Zookeeper, Etcd, a nawet Redis. Ponieważ nie jest trywialne, aby serwis rozgryzł swoje publicznie dostępny adres (chyba, że przyjmiesz jakieś konwencje, np. zawsze odwzorowujesz port X: X zamiast pozwalać Docker assing random ports), możesz chcieć dokonać rejestracji z zewnątrz. Oznacza to, że warstwa orkiestracji (w tym przypadku Mezo) uruchomi kontener, a następnie określi host i port i umieści go w systemie wykrywania usług. Nie znam się zbyt dobrze na maratonie, ale powinieneś być w stanie zarejestrować haczyk do tego. Następnie inne pojemniki będą po prostu patrzeć w górę adres punktu końcowego w rejestrze wykrywania usług jest prosty i prosty.

Możesz również spojrzeć na Skydock , który automatycznie rejestruje nazwy DNS dla kontenerów za pomocą Skydns. Jednak obecnie jest to pojedynczy host, więc jeśli podoba ci się ten pomysł, będziesz musiał go jakoś rozszerzyć, aby obsługiwać wiele hostów, a może rekordy SRV.

Innym podejściem jest użycie "dobrze znanych punktów wejścia". W rzeczywistości jest to uproszczony przypadek wykrywania usług. Oznacza to, że będziesz upewnij się, że Twoje usługi będą zawsze działać na wstępnie ustawionych hostach i portach, dzięki czemu możesz używać tych adresów statycznie. Oczywiście jest to złe (ponieważ utrudni ci to życie, gdy będziesz chciał odtworzyć środowisko do celów testowych/testowych), ale jeśli w ogóle nie masz pojęcia o wykrywaniu usług, cóż, może to być początek.

Możesz również użyć Pipework do utworzenia jednej (lub wielu) sieci wirtualnej obejmującej wiele hostów i wiązania kontenerów razem. Pipework pozwoli Ci przypisać adresy IP ręcznie lub automatycznie przez DHCP. Takie podejście nie jest jednak zalecane, ale jest dobre, jeśli chcesz również podłączyć kontenery do istniejącej architektury sieci (np. sieci VLAN...).

Bez względu na to, które rozwiązanie zdecydujesz się użyć, Gorąco polecam "udawać", że używasz linków. Tj. zamiast kodowania konfiguracji aplikacji do połączenia (przykład losowy) my-postgresql-db:5432, użyj zmiennych środowiskowych DB_PORT_5432_TCP_ADDR i DB_PORT_5432_TCP_PORT (jako jeśli było to łącze), i ustawić te zmienne podczas uruchamiania kontenera. W ten sposób, jeśli "składasz" kontenery w prostszym środowisku bez wykrywania usług itp., możesz łatwo wycofać się na linki bez wysiłku.

 26
Author: jpetazzo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-26 19:40:40