Dlaczego kontenery są ważne?
W tej lekcji będziesz śledzić zespół Tailspin, omawiany jest kilka bardzo potrzebnych ulepszeń procesu DevOps. W tym scenariuszu zespół używa platformy Docker do konteneryzowania aplikacji internetowej. Następnie zespół aktualizuje potok ciągłej integracji/ciągłego wdrażania, aby go obsługiwać.
Minęło kilka szorstkich tygodni
Ostatnie kilka tygodni było trudnym czasem w Tailspin. Zespoły walczą o spełnienie terminów ostatecznych z wielu powodów i pojawiły się obawy dotyczące produktywności w całej firmie. Andy wezwał kilka kluczowych uczestników projektu ze strony internetowej Space Game do zebrania opinii na temat nadchodzącej prezentacji do zarządzania.
Andy: Dziękujemy za zatrzymanie. Wiem, że ostatnie kilka tygodni były szorstkie dla wszystkich, ale mam kilka dobrych wiadomości. Kierownictwo wstrzymuje jutro poza siedzibą firmy, aby usłyszeć propozycje dotyczące zmian, które możemy wprowadzić w celu poprawy wydajności. Zaprosili mnie do przedstawienia analizy przypadku na temat naszych sukcesów DevOps i powiedzieli, że są one również otwarte na wszelkie inne pomysły, które możemy mieć. Miałem nadzieję, że uda nam się wykorzystać to spotkanie jako okazję do burzy mózgów. KtoTo chce przejść najpierw?
Wszyscy patrzą na Amitę. Ostatnio była szczególnie sfrustrowana.
Amita: Pójdę najpierw. Jak wiesz, testuję dla wielu zespołów i może to być trudne, ponieważ każdy zespół używa własnego stosu technologicznego. Nawet jeśli używają tych samych platform bazowych, takich jak .NET lub Java, często są przeznaczone dla różnych wersji. Czuję się, jakbym czasami spędzał połowę mojego dnia po prostu coraz środowiska testowe w stanie, w którym mogą uruchamiać kod, który muszę przetestować. Jeśli coś nie działa, trudno stwierdzić, czy w kodzie występuje usterka, czy przypadkowo skonfigurowano wersję 4.2.3 zamiast 4.3.2.
Andy pisze "Wyzwania związane z przechowywaniem wersji zależności dla kontroli jakości" na tablicy.
Tim: Chciałbym dodać operacje do tej frustracji. Mamy kilka zespołów z unikatowymi wymaganiami dotyczącymi wersji, dlatego musimy publikować swoje aplikacje na własnych maszynach wirtualnych tylko w celu zapewnienia, że ich wymagania dotyczące wersji i składników nie powodują konfliktu z innymi aplikacjami. Oprócz nakładu pracy związanego z utrzymywaniem dodatkowego zestawu maszyn wirtualnych kosztem jest również więcej niż gdyby te aplikacje mogły działać obok siebie.
Andy pisze "Overhead due to rozwiązywanie izolacji aplikacji z maszynami wirtualnymi" na tablicy.
Mara: Mam coś ze strony rozwoju. Kilka tygodni temu pracowałem nad systemem aktualizacji równorzędnych i wszystko działało na mojej maszynie. Ale kiedy przekazałem go do wdrożenia, nie działało w środowisku produkcyjnym. Zapomniałem, że muszę otworzyć port 315 w ramach usługi. Zajęło nam to ponad dzień rozwiązywania problemów, aby uświadomić sobie, co się dzieje. Gdy otworzyliśmy to w środowisku produkcyjnym, wszystko działało zgodnie z oczekiwaniami.
Andy pisze "Niespójności konfiguracji między etapami wdrażania" na tablicy.
Andy: Myślę, że ta rozmowa jest dobrym początkiem. Pozwólcie mi zbadać te problemy i zobaczyć, co mogę wymyślić. Oto obawy, które usłyszałem:
- Wyzwania związane z przechowywaniem wersji zależności dla kontroli jakości
- Obciążenie związane z rozwiązywaniem problemów z izolacją aplikacji za pomocą maszyn wirtualnych
- Niespójności konfiguracji między etapami wdrażania
Łączenie wszystkich elementów (w jednym kontenerze)
Następnego ranka Andy wzywa spotkanie, aby przedstawić zespołowi nowy pomysł.
Andy: Rozmawiałem z kilkoma kolegami wczoraj o wyzwaniach, przed którymi stoimy, i dokonali ciekawych sugestii. Ten, który jestem podekscytowany, aby wypróbować to Docker. Jest to technologia pakowania całych aplikacji jako kontenerów.
Amita: Co to jest kontener? Czy to jest jak plik zip ?
Andy: Nie dokładnie. Bardziej przypomina uproszczoną maszynę wirtualną przeznaczoną do uruchamiania bezpośrednio w systemie operacyjnym hosta. Podczas tworzenia projektu dane wyjściowe są kontenerem zawierającym oprogramowanie i jego zależności. Nie jest to jednak kompletny zwirtualizowany system, więc może on być uruchamiany w mniej niż jednej sekundzie.
Tim: Jak obsługuje zabezpieczenia i izolację?
Andy: Zabezpieczenia i izolacja są obsługiwane przez system operacyjny hosta. Gdy kontener jest uruchamiany w procesie hosta, kontener jest odizolowany od innych procesów na tej samej maszynie hosta. Ta izolacja umożliwia kontenerowi ładowanie dowolnych potrzebnych wersji składników, niezależnie od tego, co robią inne kontenery. Oznacza to również, że można łatwo uruchamiać wiele kontenerów na tym samym hoście jednocześnie.
Amita: To brzmi świetnie w środowisku produkcyjnym, ale czy rozwiązuje wyzwania, przed którymi stoimy wcześniej w potoku?
Andy: Absolutnie! Zamiast wysyłać kod źródłowy lub zestaw plików binarnych, cały kontener staje się artefaktem. Oznacza to, że podczas tworzenia aplikacji Mara jej sesje debugowania są uruchamiane lokalnie względem kontenera hostowanego na jej maszynie. Podczas testów Amita testuje kopię tego samego kontenera, która zawiera już wszystkie wymagane wersje jego zależności. Gdy Tim zarządza naszym środowiskiem produkcyjnym, monitory są autonomicznymi kopiami tych samych kontenerów opracowanych przez Marę i testowanych przez firmę Amita.
Mara: Jak trudno jest opracować aplikację kontenera? Czy musimy wprowadzić znaczące zmiany w istniejącym kodzie?
Andy: Kontenery są bardziej technologią tworzenia pakietów i wdrażania. Nie wpływają one na podstawowe oprogramowanie, które piszemy. Możemy po prostu poinstruować nasze narzędzia o utworzeniu kontenera platformy Docker na końcu kompilacji. Następnie podczas debugowania aplikacja kończy się z tego kontenera lokalnego zamiast lokalnego serwera internetowego. W rzeczywistości narzędzia, takie jak Visual Studio, umożliwiają nawet przełączanie się między środowiskami debugowania, takimi jak Docker i IIS Express, aby zapewnić nam elastyczność, której potrzebujemy. W rzeczywistości rozwidłem nasz projekt witryny internetowej ostatniej nocy i przekonwertowałem go na kompilację jako kontener platformy Docker, aby przetestować proces. Muszę tylko dodać podstawową konfigurację kontenera; Nie musiałem zmieniać żadnego z naszych istniejących kodów.
Mara: To wspaniale wiedzieć. Założę się, że możemy nawet zaktualizować potok wydania w usłudze Azure Pipelines z rozwidlenia, aby skompilować i wdrożyć wersję platformy Docker.
Andy: Czytasz mój umysł.
Co to jest Docker?
Docker to technologia automatyzowania pakowania i wdrażania przenośnych kontenerów samodzielnie. Kontenery platformy Docker mogą działać w dowolnym miejscu, w jakim znajduje się host platformy Docker, niezależnie od tego, czy znajduje się na komputerze deweloperskim, serwerze działu, centrum danych przedsiębiorstwa, czy w chmurze. Platforma Azure oferuje wiele sposobów uruchamiania aplikacji opartych na kontenerach, w tym usługi App Service lub w ramach klastrów zarządzanych za pomocą technologii aranżacji, takich jak Kubernetes.
Zespół Tailspin wybrał kontenery platformy Docker dla tego scenariusza, ponieważ spełnia wszystkie ich potrzeby:
Wyzwania związane z przechowywaniem wersji zależności dla kontroli jakości: aplikacje są pakowane jako kontenery, które zapewniają poprawne wersje ich zależności.
Obciążenie związane z rozwiązywaniem izolacji aplikacji z maszynami wirtualnymi: wiele izolowanych kontenerów może działać na tym samym hoście z korzyściami w porównaniu z maszynami wirtualnymi, w tym krótszy czas uruchamiania w celu zwiększenia wydajności zasobów.
Niespójności konfiguracji między etapami metodyki DevOps: kontenery są dostarczane z manifestami, które automatyzują wymagania dotyczące konfiguracji, takie jak porty, które muszą być uwidocznione.
Wdrażanie kontenerów platformy Docker może być kluczowym krokiem w kierunku architektury mikrousług. Omówimy więcej na ten temat w dalszej części.