Słyszałeś o technologii Kubernetes, ale zastanawiasz się, czy to dobre rozwiązanie dla twojej organizacji? Przedstawiamy pięć powodów, dla których warto się zainteresować Kubernetes i dokładnie przeanalizować jak najlepiej je wykorzystać.
W poprzednim wpisie Karol Sokołowski przedstawił jak rozwijały się poszczególne aplikacje i platformy, które położyły fundamenty pod Kubernetes. Gdyby nie GitHub, LXC, Docker, wirtualizacja serwerów, hypervisor, namespace, ruch open-source i setki zakończonych niepowodzeniem eksperymentów, rozwój Kubernetes a wraz z nim cały świat IT nie byłby w obecnym miejscu.
Teraz postanowiliśmy wspólnie przyjrzeć się technologii Kubernetes i przybliżyć ją tym, którzy dotąd z niej nie korzystali, ale zastanawiają się, czy to rozwiązanie dla ich organizacji. Kubernetes jest otwartoźródłową platformą do zarządzania, automatyzacji i skalowania aplikacji kontenerowych. Jednym z powodów sukcesu Kubernetes jest właśnie licencja open-source, dzięki której nad rozwojem tej technologii pracują tysiące programistów na całym świecie, w tym również firmy. Dystrybucje Kubernetes są oferowane przez dostawców pod własnymi nazwami.
Dlaczego warto korzystać z Kubernetes? Oto pięć kluczowych powodów:
1. Kubernetes pozwala bardzo szybko skalować środowisko IT dzięki mikroserwisom
Wyobraźmy sobie, że firmie prowadzącej sklep internetowy dział marketingu informuje IT, że w związku z kampanią reklamową w internecie i telewizji uruchomioną w okresie przedświątecznym, trzeba przygotować się na zwiększony ruch w sklepie internetowym. Spodziewany jest gwałtowny wzrostu liczby odwiedzin, ale nie można precyzyjnie określić jego skali. Dział IT stwierdza, że aby zapewnić prawidłowe funkcjonowanie sklepu internetowego, uruchomi 100 instancji serwisu na 10 serwerach.
W tradycyjnym modelu IT do realizacji takiego zadania należy skopiować aplikację na wszystkie serwery, każdą niezależnie skonfigurować (np. mechanizm logowania, nasłuchiwanie na dedykowanym porcie TCP) i skonfigurować kierowanie ruchu. To jest wykonalne, ale dość czasochłonne zadanie: przy 10 instancjach może zająć kilka godzin. A co w przypadku większych organizacji, które potrzebują np. 100 instancji? To już projekt na kilka, kilkanaście dni roboczych. Alternatywą jest samodzielna automatyzacja tego procesu, ale jej przygotowanie też trwa. Kubernetes jest gotowym narzędziem do automatyzacji, które znacząco skraca czas realizacji takiego procesu.
Jak wygląda rozwiązanie problemu 100 instancji aplikacji na 10 serwerach? Po prostu ustawiamy liczbę replik na 100. Kubernetes sam uruchomi odpowiednią liczbę instancji na dostępnych w klastrze serwerach i przypisze do odpowiedniego serwisu. Dzięki temu nowe instancje będą od razu dostępne i gotowe do pracy, bez konieczności konfigurowania ich, aktualizacji konfiguracji loadbalancerów czy urządzeń sieciowych. Całość zajmie minutę, zamiast kilku dni pracy. Właśnie w takich przypadkach widać siłę Kubernetesa.
Programiści też będą mieć ułatwione zadanie - platformy można w prosty sposób zwielokrotniać na istniejących klastrach. Dzięki temu zmiany w kodzie mogą być szybko i wygodnie testowane. Doceni to np. dział marketingu, który chętnie oceni produkcyjnie dwie wersje sklepu internetowego, sprawdzając, która osiąga lepszą konwersję sprzedażową.
Jak to działa? Podstawą jest tworzenie aplikacji w architekturze mikrousługowej, czyli “rozbiciu” jej na zbiór mniejszych aplikacji (mikroserwisów), z których każda realizuje oddzielną funkcję. W przypadku sklepu internetowego oznacza to, że moduł autentykacji będzie oddzielną aplikacją, moduł wyszukiwania produktów oddzielną, itd.
Każda mikrousługa może być uruchomiona w wielu instancjach - replikach, a komunikację z daną mikrousługą zapewnia Kubernetes poprzez obiekt typu Service. Jeśli potrzeba więcej instancji - jednym poleceniem można zwiększyć liczbę replik. Kubernetes automatycznie zajmie się przydzieleniem jej adresu, dodaniem nowej instancji do serwisu oraz kierowaniem ruchu.
Oczywiście w praktyce użycie aplikacji ulega wahaniom - o trzeciej nad ranem sklep internetowy nie potrzebuje 100 instancji aplikacji, ponieważ ruch jest symboliczny. Z drugiej strony, okres przedświątecznych promocji jest w stanie zaskoczyć najlepiej przygotowany dział IT - zakładano dziesięciokrotny wzrost ruchu na stronie, ale nie przewidziano stukrotnego.
Znowu z pomocą przychodzi Kubernetes, który pozwala zmieniać przydział zasobów automatycznie, w odpowiedzi na zmianę zapotrzebowania. Służy do tego mechanizm tzw. Horizontal Pod Autoscaler, który na podstawie zadanych metryk (np. obciążenia CPU) automatycznie zwiększa lub zmniejsza liczbę instancji konkretnego mikroserwisu bez wpływu na inne. I nie wymaga to żadnej pracy ze strony administratora.
Biorąc pod uwagę, że na klastrze Kubernetes może działać wiele różnych aplikacji i każda z nich może być skalowana niezależnie, jesteśmy w stanie maksymalnie efektywnie wykorzystać dostępne zasoby sprzętowe (fizyczne lub wirtualne).
A jeżeli wyczerpią nam się zasoby sprzętowe? Jest i na to rada.
2. Kubernetes ułatwia zarządzanie flotą sprzętową
Kubernetes to nie tylko standaryzacja opisu uruchamiania aplikacji. Ta technologia wiele zmieniła również w zakresie zarządzania sprzętem IT, który jest częścią klastra. Aby otrzymać działającą platformę IT w klasycznym modelu, administrator musiał wymyślić i zaplanować sposób konfiguracji poszczególnych etapów tego procesu: instalacji systemu operacyjnego, sposobu uruchamiania aplikacji i połączenia poszczególnych elementów w całość.
Kubernetes w kwestii sprzętu ułatwia przede wszystkim większość zadań w warstwie powyżej systemu operacyjnego. W kontekście klastra każdy jego węzeł (node) jest traktowany tak samo oraz automatycznie zarządzany. Nie trzeba się martwić o to, jakie komponenty klastra gdzie zainstalować - przy dołączaniu węzła do istniejącego klastra instalują się one same.
Węzły są transparentne zarówno pod względem utrzymania ruchu jak i niezawodności. Kubernetes sam odpytuje i monitoruje węzły oraz stan aplikacji, które działają na klastrze. W przypadku awarii pojedynczego serwera klaster bardzo szybko zorientuje się i przesunie kontenery, które na nim działały automatycznie na kolejny węzeł z dostępnymi zasobami. To bardzo upraszcza zarządzanie flotą serwerów i zwiększa dostępność serwisu.
Z punktu widzenia użytkownika aplikacji możliwe jest, że nigdy nie zorientuje się, że miała miejsce jakakolwiek awaria - dobrze skonfigurowany Kubernetes zapewni ciągłość działania aplikacji.
Rozwiązanie zarządzania sprzętem oferowane przez Kubernetes sprawdza się w każdej skali. Wyobraźmy sobie flotę pięciu serwerów web, na których działa prosta aplikacja. W modelu klasycznym (wirtualizacji serwerów i pojedynczych kontenerów), aby uruchomić taką platformę, trzeba wykonać następujące czynności:
- Zainstalować system operacyjny
- Zainstalować nginx oraz kod aplikacji
- Napisać elementy uruchomieniowe w systemd
- Zdecydować jakie pliki konfiguracyjne zmienić i jak maszyny będą się ze sobą komunikować
- Dopiąć maszyny do DNS
- Skonfigurować load balancing
- Zainstalować agenta monitorującego.
Czynności do wykonania jest sporo, a ich czasochłonność będzie różnić się w przypadku różnych platform lub aplikacji. Trzeba jednak założyć, że każdy z nich trwa nie mniej niż kilka godzin. Oznacza to, że na całość procesu trzeba zarezerwować od kilku dni, nawet do kilku tygodni. Oczywiście jakakolwiek awaria sprzętu oznacza jego wydłużenie.
Natomiast wykorzystując do tego celu technologię Kubernetes musimy jedynie:
- Zainstalować system operacyjny
- Dołączyć serwery do klastra
- Napisać manifest yaml Kubernetesa, który zawiera opis systemu, metadane, liczbę replik, nazwę serwisów w DNS, load balancery
- Przekazać manifest do API Kubernetesa.
Resztę zadań wykona system. Administrator nie musi martwić się o load balancing, nazywanie i łączenie serwisów. W przypadku awarii urządzenia Kubernetes sam przesunie dotknięte awarią kontenery do nowej jednostki sprzętowej. W przypadku klasycznej koncepcji środowiska IT, działającego na maszynach wirtualnych, zarządzający serwerami musiał to robić ręcznie.
Jaka jest oszczędność czasu? To, co zajmowało od kilku dni do kilku tygodni, z pomocą Kubernetes da się zrobić w jeden dzień roboczy.
3. Kubernetes zapewnia standaryzację i ułatwia budowanie środowiska IT w modelu multicloud
Kubernetes nie jest pierwszą i jedyną istniejącą technologią związaną z automatyzacją zarządzania serwerami czy konteneryzacją aplikacji. Istnieją aplikacje, które odpowiadają za poszczególne wycinki tego obszaru, wiele rozwiązań jest rozwijanych i wdrażanych doraźnie przez administratorów, którzy na potrzeby zarządzanych przez siebie serwerów piszą dodatkowe aplikacje czy skrypty. To mogą być przemyślane i dobre rozwiązania, ale mają zasadniczą wadę - jedyną wiedzę na temat ich działania posiada ich autor. To zdecydowanie utrudnia zarządzanie nimi.
Natomiast Kubernetes jest standardem. Dzięki API oraz zunifikowanemu językowi zapisu uruchamiania kontenerów, działanie środowiska nie jest unikalną wiedzą jednego administratora, który stworzył rozwiązanie dla siebie, zgodnie ze swoimi potrzebami. W efekcie deployment aplikacji odbywa się tak samo na każdej instalacji Kubernetesa.
Kubernetes tworzy dodatkową warstwę abstrakcji, która pracuje nad działającą infrastrukturą. Dzięki temu raz przygotowany deployment aplikacji (manifest Kubernetesa zawierający całą aplikację, liczbę replik, otagowanie, monitoring, itp.) można uruchomić na Kubernetesie działającym w różnych chmurach: np. Google Cloud, Microsoft Azure, Amazon Web Services, czy też w środowisku on-premise.
Ułatwia to też tworzenie środowisk hybrydowych łączących kilka chmur oraz własne data center. Chmura Krajowa jest operatorem multicloud i szczególnie polecamy tego typu rozwiązania, pozwalające dobrać różne środowiska chmurowe, w zależności od potrzeb klienta.
Odseparowanie infrastruktury daje jeszcze jedną korzyść. Programista, który jest odpowiedzialny za aplikację, nie musi już być ekspertem w konfiguracji load-balancera na froncie aplikacji. Z punktu widzenia osoby tworzącej i utrzymującej aplikację, interfejs jest taki sam bez względu na dostawcę sprzętu. To na dostawcy urządzeń spoczywa odpowiedzialność za dostarczenie odpowiedniego kontrolera do obsługi jego sprzętu.
Podobna sytuacja ma miejsce w wypadku zasobów dyskowych. Developer nie musi mieć wiedzy o tym jaka macierz dyskowa pracuje w serwerowni. Interfejs dostępu do wolumenów danych od strony Kubernetesa jest taki sam. Potencjalne różnice w obsłudze sprzętu implementuje producent macierzy w ramach sterownika CSI.
Dzięki standaryzacji, którą zapewnia Kubernetes nie tylko zarządzanie flotą serwerów jest prostsze. Kubernetes ułatwia również tworzenie środowisk wielochmurowych lub hybrydowych, łączących różnych dostawców chmur publicznych, prywatnych i rozwiązania on-premise.
4. Dobrze skonfigurowany Kubernetes pomaga zadbać o bezpieczeństwo
W jaki sposób Kubernetes pomaga zabezpieczyć aplikacje znajdujące się na serwerach? Przede wszystkim dzięki temu, że ustawiając zabezpieczenia nie trzeba pamiętać o tym, żeby powielić je na wszystkich serwerach. Kubernetes zrobi to automatycznie. Czyli np. instalacja patcha zabezpieczy wszystkie serwery. Banalna sprawa, ale w klasycznym IT nie raz zdarzyła się sytuacja, w której administrator zabezpieczył wszystkie serwery oprócz jednego (o którym zapomniał), a który okazał się bramą, przez którą nastąpił atak.
Po drugie, dzięki wspomnianej standaryzacji Kubernetes posiada zabezpieczenia, których narzędzia rozwijane przez poszczególnych developerów mogą nie mieć, albo być niezadowalające.
Ale uwaga! Należy pamiętać o tym, że świeżo powołany klaster Kubernetes ma wszystkie zabezpieczenia w konfiguracji domyślnej. Wbudowana kontrola dostępu, jak i większość funkcji jest domyślnie wyłączona i nie jest ona skonfigurowana w zakresie egzekwowania zasad uprawnień, dając pełny dostęp do klastra użytkownikom, którzy zupełnie go nie potrzebują. Wszystkie konfiguracje powinny zostać sprawdzone przed użyciem produkcyjnym, aby ograniczyć ryzyko dostępu i ataku.
Należy również pamiętać, że Kubernetes nie ma domyślnie wbudowanej ochrony przed atakami na środowisko uruchomieniowe, ani nie może wykryć włamań po ich wystąpieniu. Dlatego w fazie projektowania, bądź wczesnego rozwoju środowiska, jednym z kluczowych problemów oprócz bezpieczeństwa jest dobór rozwiązań odpowiedzialnych za funkcjonalność systemu.
Nieprawidłowo skonfigurowane obrazy mogą również narażać na niebezpieczeństwo zapewniając atakującym łatwy punkt dostępu do sieci, a obrazy zawierające w sobie klucze uwierzytelniania mogą dodatkowo ułatwiać to zadanie. Dlatego należy pobierać obraz tylko z zaufanego źródła oraz dbać o cykliczną aktualizację takiego obrazu w swoim środowisku. Nie należy też zapominać o stosowaniu polityki bezpieczeństwa dla uruchamianych obrazów. Oczywiście najlepszym rozwiązaniem jest posiadanie własnego repozytorium obrazów, które ma funkcję wykrywania złośliwego kodu oraz skanowania w poszukiwaniu luk zabezpieczeń wewnątrz obrazów.
Kubernetes jest przede wszystkim narzędziem do orkiestracji, sam z siebie nie zapewni bezpieczeństwa aplikacji. Ale prawidłowo skonfigurowany może być bardzo pomocny. Temat bezpieczeństwa w Kubernetes jest na tyle obszerny, że doczeka się oddzielnego opisu na blogu. Technologia Kubernetes o tyle upraszcza zarządzanie sprawami bezpieczeństwa, że umożliwia wgląd w całą platformę w jednym miejscu i pozwala na automatyzację związanych z tym obszarem procesów dzięki standaryzowanym API.
5. Kubernetes to rozwojowa technologia: nie zabraknie wsparcia ani specjalistów
Pracując w dużej organizacji CIO czy główny informatyk często podejmuje strategiczne decyzje: jak będzie wyglądało środowisko przez kolejne 5, czy 10 lat. Czy dostawca technologii to stabilna firma? Jakie są alternatywne scenariusze wsparcia? Kto będzie opiekował się systemem wewnątrz organizacji? Czy na rynku jest odpowiednia liczba specjalistów? Czy to jest rozwiązanie niszowe albo właśnie schodzące z rynku? To bardzo ważne pytania, bo w dużych organizacjach, takich jak np. banki, wytwórcy energii elektrycznej czy operatorzy telekomunikacyjni błędna decyzja oznacza potrzebę wydania za kilka lat kwot liczonych w milionach złotych. Nierzadko w dziesiątkach milionów.
Kubernetes jest stosunkowo młodą technologią - pierwsza wersja została opublikowana w 2014 roku i od tego czasu zdobywa popularność (i właśnie dlatego ogłoszenia o pracy dla programistów z dwunastoletnim doświadczeniem w Kubernetes są memami…). A to oznacza, że liczba osób zdobywających wiedzę na temat Kubernetes cały czas rośnie. Projekt jest też otwartoźródłowy i intensywnie rozwijany: ponad 100 tys. programistów pracuje nad projektem na GitHubie. Można więc z dużym prawdopodobieństwem zakładać, że Kubernetes będzie przez najbliższe lata rósł, a wraz z nim liczba dostawców rozwiązań opartych na Kubernetes, a także specjalistów z doświadczeniem w tym obszarze.
O tym, jak ważna jest popularność danej technologii i… demografia administratorów czy programistów, świadczą np. problemy z językiem programowania COBOL. Został on stworzony w 1960 r. i do dziś, po 60 latach, wiele aplikacji biznesowych opiera się na tym języku. Jednocześnie nowe aplikacje są tworzone w innych językach (m.in. C++, Visual Basic, .NET, Java), przez co liczba specjalistów umiejących utrzymać lub poprawić działające w COBOL-u programy maleje. Problem jest o tyle poważny, że gdy podczas epidemii Covid-19 wzrosło bezrobocie i trzeba było zwiększyć liczbę przetwarzanych wniosków o zasiłki, gubernator New Jersey zwrócił się o pomoc do wolontariuszy, żeby pomogli w utrzymaniu systemu do ich obsługi. Aplikacja działa w COBOL-u i był problem ze znalezieniem posługujących się nim informatyków.
To bardzo wyrazisty choć niszowy przykład, ale tego typu wyzwań nie brakuje dziś w świecie IT. Postęp automatyzacji, skali oraz samej wygody pisania kodu i utrzymania platform IT przyczynił się do radykalnej zmiany mentalności zastępów przyszłych kadr. Dzisiejsi studenci, czy osoby wkraczające na rynek pracy są już przyzwyczajeni do opisanych powyżej rozwiązań - biorą je za pewnik, to tak samo, jak platformy czy aplikacje mobilne, których używają. Większość z nich unika pracy w firmach, które mają “stary stos” i niezautomatyzowane środowiska, co sprawia niejednemu CIO nie lada problem. Kubernetes jest niewątpliwie Revolutem i Netfliksem w przestrzeni oprogramowania i tworzenia platform internetowych i można zakładać, że okres jego największej popularności jest jeszcze przed nami.
Im większe środowisko IT, tym większe wyzwania stawiane przed CIO - jak przy ograniczonym budżecie zapewnić odpowiedni poziom bezpieczeństwa, elastyczności i niezawodności działania. Kubernetes dzięki automatyzacji wielu procesów związanych z zarządzaniem środowiskiem IT, w dużym stopniu na nie odpowiada.