Spis treści
Coraz więcej systemów informatycznych jest tworzonych z użyciem kontenerów. Konteneryzacja polega na umieszczaniu komponentów aplikacji (jej procesów, zależności, bibliotek, plików konfiguracyjnych czy lokalnych baz danych) w kilku lub więcej “zbiorach” nazywanych kontenerami. Łączy w sobie zalety wirtualizacji oraz utrzymywania systemu na fizycznym serwerze. Czyli zapewnia skalowalność, szybką i lekką przenośność oprogramowania i separację instancji przy zachowaniu dużej wydajności.
O ile kilkoma kontenerami można sterować ręcznie, o tyle w przypadku setek czy tysięcy rozproszonych i dynamicznie zarządzanych kontenerów robi się to bardzo kłopotliwe. Odpowiedzią jest orkiestracja, czyli wprowadzenie automatyzacji, grupowe zarządzanie i monitorowanie kontenerów. Najpopularniejszym narzędziem do orkiestracji jest Kubernetes.
Co to jest Kubernetes?
Kubernetes to platforma open source, która służy do zarządzania kontenerami na dużą skalę.
Nazwa pochodzi z języka greckiego – “κυβερνήτης” oznacza sternika, co doskonale przekazuje cel platformy. Kubernetes jest też nazywany K8s – to skrót, w którym osiem liter “ubernete” zostało zastąpionych cyfrą “8”.
Narzędzie zostało stworzone przez Google blisko 20 lat temu na potrzeby obsługi obciążenia produkcyjnego firmy. W 2014 roku projekt przekazano organizacji Cloud Native Computing Foundation i upubliczniono – od tego czasu platforma jest wciąż rozwijana przez organizację oraz firmy i specjalistów korzystających z Kubernetes (w projektach open source mogą uczestniczyć też ich użytkownicy).
Zobacz: Kubernetes vs. Docker Swarm – porównanie platform do orkiestracji
K8s wspiera automatyzację wdrożeń, skalowanie aplikacji, zarządzanie kontenerami, monitoruje procesy i zmiany. Właściciele aplikacji oraz zespoły developerskie korzystające z platformy mogą skupić się mocniej na rozwoju swojego produktu niż na działaniach DevOps (zarządzaniu infrastrukturą i dopasowywaniu produktu do jej wymagań). Kubernetes pozwala zarządzać klastrami (grupami współpracujących ze sobą serwerów), tak by z perspektywy użytkownika wyglądały one – w uproszczeniu – jak jedna maszyna. K8s zdejmuje z developera obowiązek dostosowywania aplikacji do wymagań infrastruktury – specjalista zleca uruchomienie aplikacji, a Kubernetes może sam rozdzielić usługi między klastry, serwery i skierować się do odpowiednich kontenerów. Kubernetes posiada własną formę load-balancingu, czyli techniki rozpraszania (równoważenia) obciążenia między wiele maszyn.
K8s jest wspierany przez większość chmur publicznych, w tym Google Cloud Platform.
Czytaj też:
- Co to jest Google Cloud Platform i w jaki sposób wspiera biznes?
- Jak utworzyć i skonfigurować konto w Google Cloud Platform?
- 20 powodów, by wybrać infrastrukturę chmurową GCP
Centralizacja
Platforma Kubernetes pozwala zarządzać wszystkimi klastrami, serwerami i kontenerami z jednego miejsca, niezależnie od tego, gdzie znajdują się maszyny lub komponenty aplikacji. Wspomaga grupowe planowanie, wdrożenia, skalowanie i zarządzanie cyklami życia elementów.
Skalowalność
U podstaw K8s leży skalowalność – narzędzie zostało stworzone przez Google w celu uruchamiania miliardów kontenerów tygodniowo. Niezależnie od ilości wykonywanych akcji, wykorzystywanych maszyn czy posiadanych kontenerów, nie ma potrzeby poszerzania lub zmniejszania zespołu DevOps. Możliwe jest też skalowanie poziome i zmniejszanie zapotrzebowania na zasoby za pomocą komend lub przez interfejs użytkownika bądź automatycznie, w oparciu o obciążenie procesora.
Różne rozwiązania infrastrukturalne
Kubernetes działa razem z infrastrukturą na serwerach fizycznych, z rozwiązaniami chmurowymi oraz hybrydowymi (połączeniem lokalnego centrum z chmurą). Jest wspierany przez różnych dostawców chmur publicznych, m.in. Google Cloud Platform, Amazon Web Services czy Microsoft Azure.
Zobacz: On-premise, chmura prywatna, publiczna, hybrydowa i multi-cloud – zalety i wady rozwiązań
Spójność między środowiskami
Po uruchomieniu aplikacji na platformie staje się ona aplikacją przenośną. Aplikację można przenosić między środowiskami (np. developerskim, testowym, produkcyjnym) oraz między rozwiązaniami infrastrukturalnymi z zachowaniem spójności aplikacji.
Zapobieganie awariom i samoczynne naprawianie
K8s wprowadza zmiany stopniowo, jednocześnie monitorując stan każdej instancji. Jeśli coś pójdzie nie tak, Kubernetes automatycznie wycofuje zmiany. W przypadku gdy jeden kontener ulega awarii, narzędzie zastępuje go innym, jednocześnie pracując nad przywróceniem działania lub usuwając zbędne elementy.
Ciągły rozwój platformy
Kubernetes jest projektem otwartoźródłowym. W jego rozwój zaangażowani są nie tylko właściciele, ale też osoby korzystające z platformy na co dzień: developerzy, specjaliści DevOps, firmy programistyczne. Tworzą nowe elementy lub proponują wprowadzenie ulepszeń istniejących procesów i narzędzi.
Przykłady użycia Kubernetes
Platforma jest chętnie wykorzystywana przez firmy posiadające zaawansowane serwisy, zarządzające dużymi ilościami danych, nastawione na płynny i szybki rozwój.
- CERN (The European Organization for Nuclear Research) przechowuje obecnie ok. 300 petabajtów danych, a ich liczba wciąż się powiększa (szacuje się, że w ciągu kilku lat danych w CERN będzie 10 razy więcej). Ponadto organizacja posiada sezonowe wzrosty obciążenia i musi mieć duże możliwości skalowania. CERN korzysta z infrastruktury hybrydowej – na co dzień dane przechowuje i przetwarza na lokalnych serwerach, a w razie potrzeby skaluje rozwiązanie do chmury. Prowadzenie orkiestracji kontenerów za pomocą Kubernetes pozwoliło organizacji w pełni zautomatyzować obsługę aplikacji, uprościć proces wdrożeń i przyspieszyć rozwój technologiczny między innymi poprzez skrócenie czasu dodania klastra z ponad 3 godzin do 15 minut, a nowego węzła (maszyny w klastrze) z ponad 30 minut do 2 minut.
- Nokia tworzy produkty i rozwiązania związane z siecią telekomunikacyjną i dostarcza rozwiązania wielu operatorom. Firmy partnerskie Nokii posiadają różne rozwiązania infrastrukturalne: jedni korzystają z lokalnych centrów danych (fizycznych serwerów), inni z maszyn wirtualnych lub chmur, inne firmy z rozwiązań hybrydowych. Celem Nokii jest dostarczenie partnerom w pełni efektywnie działającego rozwiązania bez potrzeby dostosowywania produktu za każdym razem pod inną infrastrukturę. Korzystając z Kubernetes są w stanie tworzyć produkty, które można uruchomić w każdym środowisku. K8s wspiera też dodawanie nowych funkcjonalności i prowadzenie testów bez podziału na docelowe środowisko, co pozwala zaoszczędzić kilkaset godzin przy każdym wdrożeniu.
- Adidas rozwija swój serwis e-commerce z wykorzystaniem możliwości, jakie daje Kubernetes. Zanim firma zaczęła korzystać z K8s, wprowadzanie zmian szło mozolnie, a wdrożenia utykały często na etapie DevOps – przykładowo developerzy, by uzyskać dostęp do wirtualnej maszyny, musieli czekać od 30 minut do nawet tygodnia. Po przeprowadzeniu konteneryzacji serwisu i uruchomieniu Kubernetes, developerzy mogą skupić się na tworzeniu nowych funkcjonalności zamiast na szczegółowym dopasowywaniu systemu do wymagań infrastruktury czy czekaniu na wsparcie ze strony DevOps. Wcześniej nowe wydania były robione co 4-6 tygodni, teraz są prowadzone kilka razy dziennie.
Z możliwości Kubernetes korzystają również Booking.com, BlaBlaCar, Grupa ING czy Zalando.
Podstawy Kubernetes na Google Cloud Platform – tutorial
Pierwszym krokiem jest wejście na konsolę Google Cloud: https://console.cloud.google.com/.
Tworzymy nowy projekt (robimy to przez kliknięcie w nazwę projektu obok napisu “Google Cloud Platform” w lewym górnym rogu).
Uzupełniamy nazwę projektu i klikamy Create.
Wchodząc ponownie w listę projektów (przycisk koło napisu “Google Cloud Platform”) uzyskamy ID projektu. Będzie nam ono potrzebne na dalszych etapach.
Otwieramy Cloudshell (prawy górny róg).
Za pomocą poniższej komendy ustawiamy projekt, na którym będziemy pracować:
gcloud config set project k8s-demo-281313
Zwróć uwagę, żeby w komendzie wpisać ID swojego projektu – może się różnić od podanego przykładu.
Następnie ustawiamy region, w którym chcemy wdrożyć aplikację:
gcloud config set compute/zone europe-west3-c
Lista regionów znajduje się tutaj: https://cloud.google.com/about/locations#europe
Tworzymy klaster przy użyciu komendy:
gcloud container clusters create my-cluster--num-nodes=1
Flaga –num-nodes pozwala ustalić liczbę node’ów (maszyn fizycznych lub wirtualnych) w klastrze. Więcej informacji o fladze znajduje się pod linkiem: https://cloud.google.com/sdk/gcloud/reference/container/clusters/create#–num-nodes
Ta operacja może zająć kilka minut.
Po zakończonej operacji otrzymujemy tabelę w Cloudshell, która przedstawia parametry klastra.
Teraz używamy komendy:
gcloud container clusters get-credentials my-cluster
Komenda aktualizuje plik kubeconfig o odpowiednie referencje i informacje w celu dalszej pracy z klastrem.
By wdrożyć aplikację do klastra, używamy komendy:
kubectl create deployment hello-server --image=gcr.io/google-samples/hello-app:1.0
Flaga –image wskazuje link do skonteneryzowanej aplikacji w usłudze Container Registry (GCR). Usługa Container Registry pozwala przechowywać skonteneryzowane obrazy aplikacji. Więcej informacji o funkcji GCR znajduje się pod linkiem: https://cloud.google.com/container-registry
Tutaj znajduje się kod źródłowy aplikacji hello-app, którą wdrażamy: https://github.com/GoogleCloudPlatform/kubernetes-engine-samples/blob/master/hello-app/main.go
Możemy wdrożyć naszą aplikację wskazując skonteneryzowany obraz z Container Registry.
Teraz należy ujawnić aplikację (expose). W tym celu używamy komendy:
kubectl expose deployment hello-server --type LoadBalancer \ --port 80 --target-port 8080
Więcej informacji o komendzie
kubectl
znajduje się pod linkiem: https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#expose
Flaga
--type
odpowiada za wskazanie typu wdrożenia (ClusterIP, NodePort, LoadBalancer lub ExternalName). W tym przypadku tworzymy [inline_code]LoadBalancer[/inline_code], który sprawi, że aplikacja będzie dostępna przez internet.
Flaga
--port
wskazuje port, na którym aplikacja ma być serwowana.
Flaga
--target-port
wskazuje port w kontenerze, do którego usługa powinna kierować ruch.
Następnie wpisujemy komendę:
kubectl get service hello-server
Dzięki temu otrzymujemy publiczne IP klastra, na którym wdrożyliśmy aplikację:
Oto efekt:
Aby usunąć klaster i cofnąć wdrożenie należy użyć komend:
kubectl delete service hello-server gcloud container clusters delete my-cluster
I to tyle z podstaw Kubernetes!