Jak mogę zapewnić spójność między nowymi mikrousługami?

10

Moja organizacja przeżywa eksplozję mikrousług. Obecnie nie mamy sformalizowanego sposobu ładowania nowych projektów. Odkrywam, że zespół przyjdzie do mnie z błędem w procesie wdrażania lub kompilacji i spędzę na tym czas tylko po to, aby zdać sobie sprawę, że już go rozwiązałem w innym projekcie. Istnieje również duża niespójność między projektami, które chciałbym, aby były znormalizowane.

Zmiany często dotyczą jednego pliku (np. Serverless.yml lub Makefile), więc rozwiązanie obejmujące wspólne biblioteki, np. Podmoduły git, nie wydaje się wykonalne. Każdy projekt będzie miał własny zestaw konfiguracji, który musi być utrzymany, np. Dockerfiles lub serverless.yml, więc scentralizowane rozwiązania do zarządzania konfiguracją dla maszyn wirtualnych nie mają tak naprawdę zastosowania.

Jak mogę się upewnić, że nowe mikrousługi są zgodne ze standardami organizacji i zawierają poprawki / funkcje istniejących projektów w sposób łatwy i intuicyjny dla programistów, którzy chcą rozpocząć nowe projekty? Jakie są najlepsze praktyki dotyczące rozwiązywania tych problemów?

Obecny przepływ pracy polega na zapytaniu osoby znajdującej się obok Ciebie „z którego projektu mam sklonować, aby użyć go jako szablonu?” a następnie usuń wszystkie rzeczy, które nie są konieczne dla tego projektu.

użytkownik2640621
źródło

Odpowiedzi:

5

Dodam odpowiedź na temat mojego dotychczasowego rozwiązania, ale nadal bardzo interesuje mnie, jak inne organizacje rozwiązują ten problem i jakie są najlepsze praktyki.

Aby rozwiązać problem braku spójnej bazy do tworzenia projektów, moim pomysłem jest utworzenie repozytorium (repozytoriów?) Z szablonów / szablonów i użycie narzędzia Cookieutter jako narzędzia do tworzenia nowych mikrousług. W ten sposób każdy projekt jest tworzony ze standardowej bazy, z uwzględnieniem wszystkich lekcji, których nauczyliśmy się jako organizacja. Wszelkie wprowadzane przez nas zmiany można zintegrować z repozytorium płyty kotłowej. Wyobrażam sobie, że będziemy mieć szablony obrazów Dockera Nodejs, SPA bez serwera, lambda Python itp.

Aby rozwiązać problem zmian wprowadzanych w szablonach propagowanych poniżej każdego projektu, moim rozwiązaniem jest wdrożenie procesu, w którym właściciele mikrousług są świadomi zmian w szablonie, a następnie są odpowiedzialni za propagowanie tych zmian do swojej mikrousługi.

użytkownik2640621
źródło
To właśnie robimy w połączeniu z prostą aplikacją witaj świat, która ilustruje najlepsze praktyki jako konkretny przykład.
Bojkot SE dla Moniki Cellio
4

Użyj systemu zarządzania konfiguracją / automatycznego wdrażania. Do tego zostały zaprojektowane. Rzeczy takie jak Kubernetes, Puppet, Chef, Ansible i Salt Stack są zaprojektowane tylko do tego celu i mogą być używane z szablonami Golden Master, skryptami kickstart, Amazon AMI lub tylko pojemnikiem Docker. Pozwala to na użycie domyślnych szablonów podstawowych, a następnie nałożenie dodatkowych ról. Zapewni to pełne udokumentowanie kompilacji (jako kodu) oraz szybkie i łatwe wdrożenie w środowisku produkcyjnym, a także wdrożenie dokładnie identyczne z tym, co zostało zaprojektowane lub wdrożenie dodatkowych instancji, gdy pojawi się potrzeba skalowalności lub redundancji lub coś się zepsuje. Zmiany / aktualizacje można również zintegrować w ten sposób. Podobnie jak w przypadku aktualizacji oprogramowania, możesz wydać aktualizacje swojej konfiguracji, a kod konfiguracji może być zarządzany tak, jak zarządzany jest kod oprogramowania - w tych samych repozytoriach i przy tych samych przepływach pracy. A kiedy nadejdzie czas aktualizacji, nie ma tajemnicy, jak to jest zbudowane, spójrz na skrypt.

Jednym ze sposobów, w jaki systemy zarządzania konfiguracją to robią, jest intensywne stosowanie szablonów dla plików konfiguracyjnych. Na przykład, ogólnie istnieje wiele linii, które będą takie same lub podobne w twoim środowisku. SaltStack wykorzystuje szablony jinja, a marionetka korzysta z szablonów Embedded Ruby . Na przykładzie AWS może być konieczne ustawienie klucza, interfejsu API, roli IAM, regionu (lub losowego wyboru regionu z listy regionów), VPC itp., Które są takie same we wszystkich instancjach. Ale musisz mieć swoje funkcje i wyjścia unikalne. Lub jeszcze lepiej, możesz napisać moduł kukiełkowy lub formułę soli, która definiuje „kontrakty” i używać tych kontraktów (definicji interfejsu API) zarówno do wejść, jak i wyjść, co pozwala uniknąć konieczności konfigurowania mikrousług w dwóch lub trzech miejscach.

Na przykład SaltStack niedawno spotkał się w celu omówienia tego konkretnego scenariusza . Ponadto SaltStack jest również w stanie zarządzać i wdrażać kontenery dokerów natywnie . (Puppet ma również moduł dla Dockera) Podobnie Ansible ma podręczniki i dokumenty do pracy z wdrożeniami bez serwerów i kontenerami Docker .

Ponadto, jeśli chcesz kontynuować z motywem / paradygmatem bez serwerów , Puppet , Ansible i Saltstack są bez mistrzowskie lub obsługują tryb bez mistrza, jeśli chcesz kontynuować ten motyw.

James Shewey
źródło
Dodałem kilka przykładów i wyjaśnień do mojego pytania. Zarządzanie konfiguracją tak naprawdę nie pomaga, ponieważ każdy projekt jest samowystarczalny w swojej konfiguracji. Nie ma problemów z migracją do konfiguracji jako kodu, chodzi o utrzymanie konfiguracji jako kodu i rozrost konfiguracji, z którym można by skończyć, gdybyś miał 100 mikrousług o różnej konfiguracji. Obecnie używamy CI / CD ze spójnymi kompilacjami, więc to też nie stanowi problemu.
user2640621,
1
@ user2640621 - czy kiedykolwiek korzystałeś z systemu zarządzania konfiguracją? Centralizacja „rozproszenia konfiguracji” pomaga zarządzać nim łatwiej i z jednego miejsca (zamiast 100 różnych miejsc). Chociaż każdy projekt może być samodzielny, najwyraźniej niektóre pytania nakładają się na siebie, gdy pytasz o wdrożenie szablonów. Być może warto wypróbować parę w sanbox, aby przekonać się, jak działają przed ich odpisaniem ... To nie tylko automatyzuje zarządzanie plikami konfiguracyjnymi - robi o wiele więcej.
James Shewey,
1
Korzystałem z SaltStack, Chef i Puppet, ale tylko do zarządzania maszynami wirtualnymi. Dzięki za odpowiedź, zdecydowanie widzę, jak można teraz zarządzać konfiguracją poza zarządzaniem maszynami wirtualnymi.
user2640621,
2
@ user2640621: Jeśli wszystkie są różne: „Kodujesz, uruchamiasz”. Pozwól zespołom zarządzać operacjami ich usług. Niech poczują twój ból.
Przywróć Monikę - M. Schröder
3

To pytanie jest szerokie, więc jeśli moja odpowiedź jest trochę nie na temat, dodaj kontekst i konkretne przykłady, aby lepiej zrozumieć.

Użycie obrazu maszyny, takiego jak AWS AMI, pozwoliłoby ci stworzyć obraz bazowy lub złoty, który możesz następnie utrzymywać, dystrybuować lub wdrażać w ciągłej dostawie. Korzystając z tej architektury masz pewność, że każda mikrousługa jest wdrażana na spójnym sprzęcie o identycznej konfiguracji, więc wszelkie napotkane problemy są związane z konfiguracją mikrousługi / aplikacji.

Możesz zwiększyć tę niezmienność, dodając narzędzia konfiguracyjne, takie jak Ansible i Packer. Korzystając z zarządzania konfiguracją, możesz zaopatrzyć obraz maszyny we wszystko, co chcesz na nim (w tym w aplikację). Packer pozwoli ci wtedy zrobić migawkę obrazu tego komputera, a każde wdrożenie będzie identyczne.

Korzystając z tego przykładu, możesz „upiec” podstawowy AMI z zainstalowanymi poprawnymi pakietami, aktualizacjami i konfiguracją za pomocą Ansible i Packera. Dodatkowo możesz spojrzeć na „Ansible-Pull”, aby dokończyć wdrożenie, pobierając kod aplikacji, wprowadzając wszelkie zmiany i wdrażając mikrousługę na tym obrazie podstawowym.

Jednak najważniejszą radą, jaką mogę udzielić, jest po prostu znalezienie rozwiązania, które cała organizacja może wspierać i utrzymywać. Warto spróbować ustanowić SDLC, który rozwiązuje konkretny zestaw problemów, pasuje do kultury i postawy przywódczej oraz obejmuje nowoczesne praktyki architektoniczne.

Byłem w trzech organizacjach i zastosowaliśmy trzy bardzo różne podejścia.

Powodzenia!

Czad
źródło
Nie korzystamy z żadnych rozwiązań opartych na maszynach wirtualnych (głównie bez serwera i trochę Dockera), ale spróbuję zastosować mój problem na twoim przykładzie. Kiedy ktoś chce stworzyć nowy obraz pakera, od czego by się zaczął? Jeśli każdy projekt jest samodzielny i nie ma centralnego repozytorium do konfiguracji pakera, co wykorzystują jako podstawę do tworzenia obrazów? Być może jedną z różnic jest to, że projekty, z którymi pracuję, starają się być tak samodzielne, jak to możliwe, bez żadnych zależności od scentralizowanych usług, takich jak Ansible, w których można aktualizować konfigurację dla wszystkich projektów jednocześnie.
user2640621,
Dzięki architekturze bez serwera i Docker nadal możesz zastosować te podstawy. Jedną strategią może być utrzymanie podstawowego pliku dokera. Możesz zbudować plik dokera oparty na centOS, który zawiera niektóre konfiguracje, których oczekujesz w każdej mikrousługi, a następnie każdy zespół może pobrać ten plik dokera i zbudować własny plik dokera specyficzny dla mikrousług. Aby pomóc w zarządzaniu kontenerami i ciągłym wdrażaniu, możesz użyć narzędzia takiego jak Kubernetes.
Czad,