Kubernetes - oswajanie chmury

Jeśli chcesz używać Linuksa do świadczenia usług firmie, usługi te będą musiały być bezpieczne, odporne i skalowalne. Ładne słowa, ale co przez nie rozumiemy?

„Bezpieczny” oznacza, że ​​użytkownicy mogą uzyskać dostęp do danych, których potrzebują, w trybie tylko do odczytu lub z prawem do zapisu. Jednocześnie żadne dane nie są udostępniane podmiotom, które nie są upoważnione do ich przeglądania. Bezpieczeństwo jest zwodnicze: możesz pomyśleć, że masz wszystko chronione tylko po to, by później dowiedzieć się, że są dziury. Projektowanie w zakresie bezpieczeństwa od początku projektu jest znacznie łatwiejsze niż późniejsze próby jego modernizacji.

„Odporny” oznacza, że ​​Twoje usługi tolerują awarie infrastruktury. Awarią może być kontroler dysku serwera, który nie ma już dostępu do żadnych dysków, co powoduje, że dane są nieosiągalne. Lub awaria może być spowodowana przełącznikiem sieciowym, który nie umożliwia już komunikacji dwóm lub większej liczbie systemów. W tym kontekście „pojedynczy punkt awarii” lub SPOF to awaria, która niekorzystnie wpływa na dostępność usługi. Odporna infrastruktura to taka, w której nie ma SPOF.

„Skalowalne” opisuje zdolność systemów do obsługi skoków popytu z wdziękiem. Określa również, jak łatwo można wprowadzać zmiany w systemach. Na przykład dodanie nowego użytkownika, zwiększenie pojemności pamięci masowej lub przeniesienie infrastruktury z Amazon Web Services do Google Cloud - a nawet przeniesienie jej we własnym zakresie.

Gdy tylko Twoja infrastruktura rozszerzy się poza jeden serwer, istnieje wiele opcji zwiększenia bezpieczeństwa, odporności i skalowalności. Przyjrzymy się tradycyjnym rozwiązaniom tych problemów i dostępnej nowej technologii, która zmienia oblicze obliczeń w dużych aplikacjach.

Zdobądź więcej Linuksa!

Podoba Ci się to, co czytasz? Chcesz więcej Linuksa i open source? Możemy dostarczyć, dosłownie! Zasubskrybuj Linux Format już dziś po okazyjnej cenie. Możesz uzyskać wydania drukowane, wydania cyfrowe lub dlaczego nie oba? Dostarczamy do Twoich drzwi na całym świecie za prostą roczną opłatą. Więc uczyń swoje życie lepszym i łatwiejszym, subskrybuj teraz!

Aby zrozumieć, co jest dziś możliwe, warto przyjrzeć się, jak projekty technologiczne były tradycyjnie wdrażane. W dawnych czasach - czyli ponad 10 lat temu - firmy kupowały lub wynajmowały sprzęt do obsługi wszystkich składników swoich aplikacji. Nawet stosunkowo proste aplikacje, takie jak witryna WordPress, mają wiele składników. W przypadku WordPressa potrzebna jest baza danych MySQL wraz z serwerem WWW takim jak Apache oraz sposób obsługi kodu PHP. Dlatego zbudowali serwer, skonfigurowali Apache, PHP i MySQL, zainstalują WordPress i zaczną działać.

W zasadzie to zadziałało. Działało na tyle dobrze, że nadal istnieje ogromna liczba serwerów skonfigurowanych dokładnie w ten sposób. Ale nie był doskonały, a dwa z większych problemów to odporność i skalowalność.

Brak odporności oznaczał, że każdy poważny problem na serwerze skutkowałby utratą usługi. Oczywiście katastrofalna awaria oznaczałaby brak witryny internetowej, ale nie było też miejsca na przeprowadzenie zaplanowanej konserwacji bez wpływu na witrynę. Nawet zainstalowanie i aktywacja rutynowej aktualizacji zabezpieczeń dla Apache wymagałoby kilku sekund przerwy w działaniu witryny.

Problem odporności został w dużej mierze rozwiązany poprzez zbudowanie „klastrów o wysokiej dostępności”. Zasadą było posiadanie dwóch serwerów obsługujących witrynę internetową, skonfigurowanych w taki sposób, aby awaria jednego z nich nie powodowała wyłączenia witryny. Świadczona usługa była odporna, nawet jeśli poszczególne serwery nie były.

Streszczenie chmury

Częścią mocy Kubernetes jest oferowana przez niego abstrakcja. Z punktu widzenia programisty opracowują aplikację do działania w kontenerze Docker. Docker nie dba o to, czy działa w systemie Windows, Linux czy w jakimś innym systemie operacyjnym. Ten sam kontener Docker można pobrać z MacBooka dewelopera i uruchomić na Kubernetes bez żadnych modyfikacji.

Sama instalacja Kubernetes może być pojedynczą maszyną. Oczywiście wiele zalet Kubernetes nie będzie dostępnych: nie będzie automatycznego skalowania; istnieje oczywisty pojedynczy punkt awarii i tak dalej. Jednak jako dowód słuszności koncepcji w środowisku testowym działa.

Gdy będziesz gotowy do produkcji, możesz uruchomić go u siebie lub u dostawcy chmury, takiego jak AWS lub Google Cloud. Dostawcy usług w chmurze mają wbudowane usługi, które pomagają w uruchamianiu Kubernetes, ale żadne z nich nie są twardymi wymaganiami. Jeśli chcesz poruszać się między Google, Amazon i własną infrastrukturą, konfigurujesz Kubernetes i przemieszczasz się. Żadna z Twoich aplikacji nie musi się w żaden sposób zmieniać.

A gdzie jest Linux? Kubernetes działa w systemie Linux, ale system operacyjny jest niewidoczny dla aplikacji. To znaczący krok na drodze do dojrzałości i użyteczności infrastruktury IT.

Efekt Slashdot

Problem skalowalności jest nieco trudniejszy. Załóżmy, że Twoja witryna WordPress odwiedza 1000 użytkowników miesięcznie. Pewnego dnia o Twojej firmie mówi się w Radio 4 lub telewizji śniadaniowej. Nagle w 20 minut odwiedzasz więcej niż miesiąc. Wszyscy słyszeliśmy historie o „awariach” witryn internetowych i to zazwyczaj: brak skalowalności.

Dwa serwery, które pomogły w uzyskaniu odporności, mogą poradzić sobie z większym obciążeniem niż jeden serwer sam, ale to nadal jest ograniczone. Będziesz płacić za dwa serwery w 100 procentach i przez większość czasu oba działały idealnie. Jest prawdopodobne, że jedna osoba może obsługiwać Twoją witrynę. Następnie John Humphrys wspomina o Twojej firmie w Today i potrzebujesz 10 serwerów do obsługi obciążenia - ale tylko na kilka godzin.

Lepszym rozwiązaniem zarówno problemu odporności, jak i skalowalności była chmura obliczeniowa. Skonfiguruj jedną lub dwie instancje serwera - małe serwery, na których działają Twoje aplikacje - w Amazon Web Services (AWS) lub Google Cloud, a jeśli jedna z instancji ulegnie awarii z jakiegoś powodu, zostanie automatycznie ponownie uruchomiona. Skonfiguruj poprawnie automatyczne skalowanie, a kiedy pan Humphrys spowoduje gwałtowny wzrost obciążenia instancji serwera WWW, automatycznie uruchamiane są dodatkowe instancje serwera, aby dzielić się obciążeniem. Później, gdy odsetki spadną, te dodatkowe instancje są zatrzymywane i płacisz tylko za to, z czego korzystasz. Idealnie… czy to prawda?

Chociaż rozwiązanie chmurowe jest znacznie bardziej elastyczne niż tradycyjny samodzielny serwer, nadal występują problemy. Aktualizacja wszystkich działających instancji w chmurze nie jest prosta. Tworzenie aplikacji w chmurze wiąże się również z wyzwaniami: laptop, którego używają twoi programiści, może być podobny do instancji w chmurze, ale to nie to samo. Jeśli zdecydujesz się na AWS, migracja do Google Cloud jest złożonym przedsięwzięciem. I przypuśćmy, że z jakiegoś powodu po prostu nie chcesz przekazywać swoich komputerów Amazon, Google lub Microsoft?

Kontenery pojawiły się jako sposób na opakowywanie aplikacji ze wszystkimi ich zależnościami w jeden pakiet, który można uruchomić w dowolnym miejscu. Kontenery, takie jak Docker, mogą działać na laptopach programistów w taki sam sposób, jak działają na instancjach w chmurze, ale zarządzanie flotą kontenerów staje się coraz trudniejsze wraz ze wzrostem liczby kontenerów.

Odpowiedzią jest orkiestracja kontenerów. To jest znacząca zmiana punktu widzenia. Wcześniej upewniliśmy się, że mamy wystarczającą liczbę serwerów, fizycznych lub wirtualnych, aby zapewnić obsługę obciążenia. Korzystanie z autoskalowania dostawców usług w chmurze pomogło, ale nadal mieliśmy do czynienia z instancjami. Musieliśmy skonfigurować moduły równoważenia obciążenia, zapory sieciowe, przechowywanie danych i nie tylko ręcznie. Dzięki orkiestracji kontenerów wszystko to (i wiele więcej) jest załatwione. Określamy wymagane przez nas wyniki, a nasze narzędzia do orkiestracji kontenerów spełniają nasze wymagania. Określamy, co chcemy zrobić, a nie jak chcemy to zrobić.

Ciągła integracja i ciągłe wdrażanie mogą dobrze współpracować z Kubernetes. Oto omówienie wykorzystania Jenkinsa do tworzenia i wdrażania aplikacji Java

Zostań Kubernete

Kubernetes (ku-ber-net-eez) to obecnie wiodące narzędzie do orkiestracji kontenerów, które pochodzi od Google. Jeśli ktoś wie, jak obsługiwać infrastruktury IT na dużą skalę, Google to robi. Początkiem Kubernetes jest Borg, wewnętrzny projekt Google, który nadal jest używany do uruchamiania większości aplikacji Google, w tym wyszukiwarki, Gmaila, Map Google i nie tylko. Borg był tajemnicą, dopóki Google nie opublikował artykułu na ten temat w 2015 roku, ale artykuł ten bardzo wyraźnie pokazał, że Borg był główną inspiracją dla Kubernetes.

Borg to system, który zarządza zasobami obliczeniowymi w centrach danych Google i utrzymuje aplikacje Google, zarówno produkcyjne, jak i inne, pomimo awarii sprzętu, wyczerpania zasobów lub innych problemów, które mogłyby spowodować awarię. Czyni to poprzez uważne monitorowanie tysięcy węzłów tworzących „komórkę” Borga i działających na nich kontenerów oraz uruchamianie i zatrzymywanie kontenerów zgodnie z wymaganiami w odpowiedzi na problemy lub wahania obciążenia.

Sam Kubernetes narodził się z inicjatywy Google GIFEE („Infrastruktura Google dla wszystkich innych”) i został zaprojektowany jako bardziej przyjazna wersja Borga, która może być użyteczna poza Google. Został przekazany Linux Foundation w 2015 roku poprzez utworzenie Cloud Native Computing Foundation (CNCF).

Kubernetes zapewnia system, w którym „deklarujesz” swoje aplikacje i usługi w kontenerach, a także zapewnia, że ​​aplikacje działają zgodnie z tymi deklaracjami. Jeśli Twoje programy wymagają zasobów zewnętrznych, takich jak pamięć masowa lub systemy równoważenia obciążenia, Kubernetes może je udostępniać automatycznie. Może skalować aplikacje w górę lub w dół, aby nadążyć za zmianami obciążenia, a nawet w razie potrzeby skalować cały klaster. Komponenty Twojego programu nie muszą nawet wiedzieć, gdzie są uruchomione: Kubernetes zapewnia wewnętrzne usługi nazewnictwa aplikacjom, dzięki czemu mogą łączyć się z „wp_mysql” i automatycznie łączyć się z odpowiednim zasobem ”.

Efektem końcowym jest platforma, której można używać do uruchamiania aplikacji w dowolnej infrastrukturze, od pojedynczej maszyny przez lokalną szafę systemów po oparte na chmurze floty maszyn wirtualnych działających na dowolnym głównym dostawcy chmury, przy użyciu tych samych kontenerów i konfiguracja. Kubernetes jest niezależny od dostawcy: uruchamiaj go w dowolnym miejscu.

Kubernetes to potężne narzędzie, które jest z konieczności złożone. Zanim przejdziemy do przeglądu, musimy wprowadzić kilka terminów używanych w Kubernetes. Kontenery obsługują pojedyncze aplikacje, jak omówiono powyżej, i są pogrupowane w pody. Pod to grupa blisko połączonych kontenerów, które są wdrażane razem na tym samym hoście i współużytkują niektóre zasoby. Kontenery w ramach działają jako zespół: będą wykonywać powiązane funkcje, takie jak kontener aplikacji i kontener rejestrowania z określonymi ustawieniami aplikacji.

Omówienie Kubernetes pokazujące mastera z kluczowymi komponentami i dwoma węzłami. Należy zauważyć, że w praktyce główne komponenty mogą być podzielone na wiele systemów

Cztery kluczowe komponenty Kubernetes to serwer API, harmonogram, menedżer kontrolerów i rozproszona baza danych konfiguracji o nazwie etcd. Serwer API jest sercem Kubernetes i działa jako główny punkt końcowy dla wszystkich żądań zarządzania. Mogą one być generowane przez różne źródła, w tym inne komponenty Kubernetes, takie jak harmonogram, administratorzy za pośrednictwem wiersza poleceń lub pulpitów nawigacyjnych opartych na sieci Web oraz same aplikacje kontenerowe. Sprawdza żądania i aktualizuje dane przechowywane w etcd.

Harmonogram określa, na których węzłach będą działać różne pody, biorąc pod uwagę ograniczenia, takie jak wymagania dotyczące zasobów, wszelkie ograniczenia sprzętowe lub programowe, obciążenie, terminy i inne.

Menedżer kontrolerów monitoruje stan klastra i będzie próbował uruchomić lub zatrzymać, jeśli to konieczne, za pośrednictwem serwera API, aby doprowadzić klaster do żądanego stanu. Zarządza również niektórymi połączeniami wewnętrznymi i funkcjami bezpieczeństwa.

Każdy węzeł uruchamia proces Kubelet, który komunikuje się z serwerem API i zarządza kontenerami - zwykle za pomocą Dockera - i Kube-Proxy, który obsługuje proxy sieciowe i równoważenie obciążenia w klastrze.

System rozproszonej bazy danych etcd wywodzi swoją nazwę z rozszerzenia /itp folder w systemach Linux, który jest używany do przechowywania informacji o konfiguracji systemu oraz przyrostek „d”, często używany do oznaczenia procesu demona. Celem etcd jest przechowywanie danych klucz-wartość w sposób rozproszony, spójny i odporny na błędy.

Serwer API przechowuje wszystkie swoje dane stanu w etcd i może jednocześnie uruchamiać wiele instancji. Program planujący i menedżer kontrolera mogą mieć tylko jedną aktywną instancję, ale używa systemu dzierżawy do określenia, która z uruchomionych instancji jest instancją główną. Wszystko to oznacza, że ​​Kubernetes może działać jako wysoce dostępny system bez pojedynczych punktów awarii.

Kładąc wszystko razem

Jak więc wykorzystujemy te komponenty w praktyce? Poniżej znajduje się przykład konfiguracji witryny WordPress przy użyciu Kubernetes. Jeśli chcesz to zrobić naprawdę, prawdopodobnie użyjesz predefiniowanego przepisu zwanego wykresem steru. Są dostępne dla wielu typowych aplikacji, ale tutaj przyjrzymy się niektórym krokom niezbędnym do skonfigurowania i uruchomienia witryny WordPress na Kubernetes.

Pierwszym zadaniem jest zdefiniowanie hasła do MySQL:

 kubectl utwórz tajne ogólne hasło mysql --from-literal = hasło = TWOJE_HASŁO 

kubectl porozmawia z serwerem API, który zweryfikuje polecenie, a następnie zapisze hasło w etcd. Nasze usługi są zdefiniowane w plikach YAML, a teraz potrzebujemy trwałego miejsca na bazę danych MySQL.

 apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pv-claim labels: app: wordpress spec: accessModes: - ReadWriteOnce resources: request: storage: 20Gi 

Specyfikacja powinna być w większości oczywista. Nazwy i pola etykiet służą do odwoływania się do tego magazynu z innych części Kubernetes, w tym przypadku naszego kontenera WordPress.

Po zdefiniowaniu magazynu możemy zdefiniować instancję MySQL, wskazując ją na wstępnie zdefiniowaną pamięć. Następnie definiuje się samą bazę danych. Nadajemy tej bazie danych nazwę i etykietę dla łatwego odniesienia w Kubernetes.

Teraz potrzebujemy kolejnego kontenera do uruchomienia WordPressa. Część specyfikacji wdrożenia kontenera to:

 rodzaj: metadane wdrożenia: nazwa: etykiety wordpress: aplikacja: wordpress specyfikacja: strategia: typ: Odtwórz ponownie 

Typ strategii „Odtwórz” oznacza, że ​​jeśli jakikolwiek kod wchodzący w skład aplikacji ulegnie zmianie, uruchomione instancje zostaną usunięte i odtworzone. Inne opcje obejmują możliwość cyklicznego przełączania nowych instancji i usuwania istniejących instancji, jeden po drugim, umożliwiając kontynuowanie działania usługi podczas wdrażania aktualizacji. Na koniec deklarujemy usługę dla samego WordPressa, składającą się z kodu PHP i Apache. Część pliku YAML deklarująca to:

 metadane: nazwa: wordpress etykiety: aplikacja: wordpress specyfikacja: porty: - port: 80 selektor: aplikacja: poziom wordpress: typ frontendu: LoadBalancer 

Zwróć uwagę na ostatnią linię, definiującą typ usługi jako LoadBalancer. To instruuje Kubernetes, aby udostępnił usługę poza Kubernetes. Bez tej linii byłaby to tylko wewnętrzna usługa „tylko Kubernetes”. I to wszystko. Kubernetes będzie teraz używać tych plików YAML jako deklaracji tego, co jest wymagane, i skonfiguruje pody, połączenia, pamięć masową i tak dalej, zgodnie z wymaganiami, aby ustawić klaster w „pożądanym” stanie.

Użyj widoku pulpitu nawigacyjnego, aby szybko zobaczyć podsumowanie Kubernetes w akcji

To był koniecznie tylko ogólny przegląd Kubernetes, a wiele szczegółów i funkcji systemu zostało pominiętych. Omówiliśmy automatyczne skalowanie (zarówno pody, jak i węzły tworzące klaster), zadania cron (uruchamianie kontenerów zgodnie z harmonogramem), Ingress (równoważenie obciążenia HTTP, przepisywanie i odciążanie SSL), RBAC (kontrola dostępu oparta na rolach) , zasady sieciowe (firewall) i wiele więcej. Kubernetes jest niezwykle elastyczny i niezwykle wydajny: w przypadku każdej nowej infrastruktury IT musi być poważnym rywalem.

Zasoby

Jeśli nie znasz Dockera, zacznij tutaj: https://docs.docker.com/get-started.

Tutaj znajduje się interaktywny samouczek dotyczący wdrażania i skalowania aplikacji: https://kubernetes.io/docs/tutorials/kubernetes-basics.

Zobacz też https://kubernetes.io/docs/setup/scratch, aby dowiedzieć się, jak zbudować klaster.

Możesz grać z bezpłatnym klastrem Kubernetes pod adresem https://tryk8s.com.

Na koniec możesz przejrzeć długą, techniczną pracę ze świetnym przeglądem wykorzystania Borg przez Google i tego, jak wpłynęło to na projekt Kubernetes tutaj: https://storage.googleapis.com/pub-tools-public-publication-data/ pdf / 43438.pdf.

Dowiedz się więcej o Tiger Computing.

  • Najlepsze miejsce do przechowywania w chmurze w 2022-2023 roku online: opcje bezpłatne, płatne i biznesowe
Zdobądź więcej Linuksa!

Podoba Ci się to, co czytasz? Chcesz więcej Linuksa i open source? Możemy dostarczyć, dosłownie! Zasubskrybuj Linux Format już dziś po okazyjnej cenie. Możesz uzyskać wydania drukowane, wydania cyfrowe lub dlaczego nie oba? Dostarczamy do Twoich drzwi na całym świecie za prostą roczną opłatą. Więc uczyń swoje życie lepszym i łatwiejszym, subskrybuj teraz!

Interesujące artykuły...