Co to jest Kubernetes? Przewodnik po konteneryzacji i wdrażaniu

Opublikowany: 2022-03-11

Jakiś czas temu korzystaliśmy z monolitowej aplikacji internetowej: ogromnych baz kodu, które rozrastały się o nowe funkcje i funkcje, aż stały się ogromnymi, powolnymi, trudnymi w zarządzaniu gigantami. Teraz coraz więcej programistów, architektów i ekspertów DevOps dochodzi do opinii, że lepiej korzystać z mikroserwisów niż gigantycznego monolitu. Zazwyczaj użycie architektury opartej na mikrousługach oznacza podzielenie monolitu na co najmniej dwie aplikacje: aplikację frontonu i aplikację zaplecza (interfejs API). Po podjęciu decyzji o zastosowaniu mikroserwisów pojawia się pytanie: W jakim środowisku lepiej uruchamiać mikroserwisy? Co powinienem wybrać, aby moja usługa była stabilna, a także łatwa w zarządzaniu i wdrażaniu? Krótka odpowiedź brzmi: Użyj Dockera!

W tym artykule przedstawię kontenery, wyjaśnię Kubernetes i nauczę, jak konteneryzować i wdrażać aplikację w klastrze Kubernetes za pomocą CircleCI.

Doker? Co to jest Docker?

Docker to narzędzie zaprojektowane, aby ułatwić DevOps (i Twoje życie). Dzięki Dockerowi programista może tworzyć, wdrażać i uruchamiać aplikacje w kontenerach . Kontenery umożliwiają programiście spakowanie aplikacji ze wszystkimi potrzebnymi jej częściami, takimi jak biblioteki i inne zależności, i wysłanie ich w jednym pakiecie.

Porównanie aplikacji wdrożonych na hoście z aplikacją spakowaną w kontenerze

Porównanie aplikacji wdrożonych na hoście z aplikacją spakowaną w kontenerze

Korzystając z kontenerów, programiści mogą łatwo (ponownie) wdrożyć obraz w dowolnym systemie operacyjnym. Po prostu zainstaluj Dockera, wykonaj polecenie, a Twoja aplikacja jest gotowa do pracy. Aha, i nie martw się o żadne niespójności z nową wersją bibliotek w systemie operacyjnym hosta. Dodatkowo możesz uruchomić więcej kontenerów na tym samym hoście — będzie to ta sama aplikacja czy inna? To nie ma znaczenia.

Wygląda na to, że Docker to niesamowite narzędzie. Ale jak i gdzie mam uruchamiać kontenery?

Istnieje wiele opcji dotyczących tego, jak i gdzie uruchamiać kontenery: AWS Elastic Container Service (AWS Fargate lub zarezerwowana instancja z automatycznym skalowaniem poziomym i pionowym); instancja w chmurze z predefiniowanym obrazem Docker w Azure lub Google Cloud (z szablonami, grupami instancji i autoskalowaniem); na własnym serwerze z Dockerem; lub oczywiście Kubernetes! Kubernetes został stworzony specjalnie na potrzeby wirtualizacji i kontenerów przez inżynierów Google w 2014 roku.

Kubernetes? Co to jest?

Kubernetes to system typu open source, który umożliwia uruchamianie kontenerów, zarządzanie nimi, automatyzację wdrożeń, skalowanie wdrożeń, tworzenie i konfigurowanie danych przychodzących, wdrażanie aplikacji bezstanowych lub stanowych oraz wiele innych. Zasadniczo możesz uruchomić jedną lub więcej instancji i zainstalować Kubernetes, aby obsługiwać je jako klaster Kubernetes. Następnie pobierz punkt końcowy API klastra Kubernetes, skonfiguruj kubectl (narzędzie do zarządzania klastrami Kubernetes) i Kubernetes jest gotowy do obsługi.

Dlaczego więc miałbym go używać?

Dzięki Kubernetes możesz maksymalnie wykorzystać zasoby obliczeniowe. Dzięki Kubernetes będziesz kapitanem swojego statku (infrastruktury), a Kubernetes wypełni Twoje żagle. Dzięki Kubernetes Twoją usługą będzie HA. A co najważniejsze, dzięki Kubernetes zaoszczędzisz sporo pieniędzy.

Wygląda obiecująco! Zwłaszcza jeśli pozwoli to zaoszczędzić pieniądze! Porozmawiajmy o tym więcej!

Kubernetes zyskuje popularność z dnia na dzień. Wejdźmy głębiej i zbadajmy, co kryje się pod maską.

Pod maską: co to jest Kubernetes?

Co to jest Kubernetes? Komponenty tworzące Kubernetes pod maską

Komponenty tworzące Kubernetes

Kubernetes to nazwa całego systemu, ale podobnie jak Twój samochód, istnieje wiele małych elementów, które współpracują ze sobą w idealnej harmonii, aby Kubernetes działał. Dowiedzmy się, jakie one są.

Węzeł główny — panel sterowania dla całego klastra Kubernetes. Komponenty mastera można uruchomić na dowolnym węźle w klastrze. Kluczowymi elementami są:

  • Serwer API: Punkt wejścia dla wszystkich poleceń REST, jedyny składnik węzła głównego, który jest dostępny dla użytkownika.
  • Datastore: mocna, spójna i wysoce dostępna pamięć masowa klucz-wartość używana przez klaster Kubernetes.
  • Harmonogram: obserwuje nowo utworzone pody i przypisuje je do węzłów. Wdrażanie podów i usług w węzłach odbywa się z powodu harmonogramu.
  • Menedżer kontrolera: uruchamia wszystkie kontrolery obsługujące rutynowe zadania w klastrze.
  • Węzły robocze: agent węzła podstawowego, zwany także węzłami pomocniczymi. Strąki są prowadzone tutaj. Węzły robocze zawierają wszystkie usługi niezbędne do zarządzania siecią między kontenerami, komunikowania się z węzłem głównym i przypisywania zasobów do zaplanowanych kontenerów.
  • Docker: działa na każdym węźle procesu roboczego i pobiera obrazy oraz kontenery startowe.
  • Kubelet: monitoruje stan poda i zapewnia, że ​​kontenery są uruchomione i działają. Komunikuje się również z magazynem danych, pozyskując informacje o usługach i zapisując szczegóły o nowo utworzonych.
  • Kube-proxy: sieciowy serwer proxy i system równoważenia obciążenia dla usługi w jednym węźle roboczym. Odpowiada za kierowanie ruchu.
  • Kubectl: narzędzie CLI umożliwiające użytkownikom komunikację z serwerem Kubernetes API.

Czym są strąki i usługi?

Strąki to najmniejsza jednostka klastra Kubernetes, jest jak jedna cegła w ścianie ogromnego budynku. Pod to zestaw kontenerów, które muszą działać razem i mogą udostępniać zasoby (przestrzenie nazw Linux, cgroups, adresy IP). Strąki nie mają żyć długo.

Usługi są abstrakcją na wielu kapsułach, zwykle wymagając serwera proxy na górze, aby inne usługi komunikowały się z nim za pośrednictwem wirtualnego adresu IP.

Przykład prostego wdrożenia

Jak różni interesariusze wchodzą w interakcję z aplikacją opartą na Kubernetes

Jak różni interesariusze wchodzą w interakcję z aplikacją opartą na Kubernetes

Użyję prostej aplikacji Ruby on Rails i GKE jako platformy do uruchomienia Kubernetes. W rzeczywistości możesz używać Kubernetes w AWS lub Azure, a nawet utworzyć klaster na własnym sprzęcie lub uruchomić Kubernetes lokalnie za pomocą minikube — wszystkie opcje, które znajdziesz na tej stronie.

Pliki źródłowe tej aplikacji można znaleźć w tym repozytorium GitHub.

Aby stworzyć nową aplikację Railsową, wykonaj:

 rails new blog

Aby skonfigurować połączenie MySQL do produkcji w config/database.yml file :

 production: adapter: mysql2 encoding: utf8 pool: 5 port: 3306 database: <%= ENV['DATABASE_NAME'] %> host: 127.0.0.1 username: <%= ENV['DATABASE_USERNAME'] %> password: <%= ENV['DATABASE_PASSWORD'] %>

Aby utworzyć model artykułu, kontroler, widoki i migrację, wykonaj:

 rails g scaffold Article title:string description:text

Aby dodać klejnoty do pliku Gemfile:

 gem 'mysql2', '< 0.6.0', '>= 0.4.4' gem 'health_check'

Aby utworzyć obraz Dockera, pobierz mój plik Docker i wykonaj:

 docker build -t REPO_NAME/IMAGE_NAME:TAG . && docker push REPO_NAME/IMAGE_NAME:TAG

Czas stworzyć klaster Kubernetes. Otwórz stronę GKE i utwórz klaster Kubernetes. Po utworzeniu klastra kliknij przycisk „Połącz” i skopiuj polecenie — upewnij się, że masz zainstalowane i skonfigurowane narzędzie gCloud CLI (jak to zrobić) oraz kubectl. Wykonaj skopiowane polecenie na swoim komputerze i sprawdź połączenie z klastrem Kubernetes; wykonaj kubectl cluster-info .

Aplikacja jest gotowa do wdrożenia w klastrze k8s. Stwórzmy bazę danych MySQL. Otwórz stronę SQL w konsoli gCloud i utwórz instancję bazy danych MySQL dla aplikacji. Gdy instancja jest gotowa, utwórz użytkownika i bazę danych oraz skopiuj nazwę połączenia instancji .

Ponadto musimy utworzyć klucz konta usługi na stronie API i usługi , aby uzyskać dostęp do bazy danych MySQL z kontenera bocznego. Więcej informacji na temat tego procesu znajdziesz tutaj. Zmień nazwę pobranego pliku na service-account.json . Wrócimy później do tego pliku.

Jesteśmy gotowi do wdrożenia naszej aplikacji na Kubernetes, ale najpierw powinniśmy stworzyć sekrety dla naszej aplikacji — tajny obiekt w Kubernetes stworzony do przechowywania wrażliwych danych. Prześlij wcześniej pobrany plik service-account.json :

 kubectl create secret generic mysql-instance-credentials \ --from-file=credentials.json=service-account.json

Utwórz sekrety dla aplikacji:

 kubectl create secret generic simple-app-secrets \ --from-literal=username=$MYSQL_PASSWORD \ --from-literal=password=$MYSQL_PASSWORD \ --from-literal=database-name=$MYSQL_DB_NAME \ --from-literal=secretkey=$SECRET_RAILS_KEY

Nie zapomnij zastąpić wartości lub ustawić zmiennych środowiskowych swoimi wartościami.

Przed utworzeniem wdrożenia przyjrzyjmy się plikowi wdrożenia. Połączyłem trzy pliki w jeden; pierwsza część to usługa, która ujawni port 80 i przekieruje wszystkie połączenia przychodzące na port 80 do portu 3000. Usługa ma selektor, za pomocą którego usługa wie, do jakich podów powinna przekazywać połączenia.

Kolejną częścią pliku jest wdrożenie, które opisuje strategię wdrażania — kontenery, które zostaną uruchomione w zasobniku, zmienne środowiskowe, zasoby, sondy, mocowania dla każdego kontenera i inne informacje.

Ostatnia część to Horizontal Pod Autoscaler. HPA ma dość prostą konfigurację. Pamiętaj, że jeśli nie ustawisz zasobów dla kontenera w sekcji wdrożenia, HPA nie będzie działać.

Możesz skonfigurować automatyczne skalowanie pionowe dla swojego klastra Kubernetes na stronie edycji GKE. Ma też dość prostą konfigurację.

Czas wysłać go do klastra GKE! Przede wszystkim powinniśmy uruchamiać migracje poprzez zadanie. Wykonać:

kubectl apply -f rake-tasks-job.yaml — To zadanie będzie przydatne w procesie CI/CD.

kubectl apply -f deployment.yaml – do tworzenia usługi, wdrożenia i HPA.

A następnie sprawdź swój pod, wykonując polecenie: kubectl get pods -w

 NAME READY STATUS RESTARTS AGE sample-799bf9fd9c-86cqf 2/2 Running 0 1m sample-799bf9fd9c-887vv 2/2 Running 0 1m sample-799bf9fd9c-pkscp 2/2 Running 0 1m

Teraz utwórzmy wejście dla aplikacji:

  1. Utwórz statyczny adres IP: gcloud compute addresses create sample-ip --global
  2. Utwórz wejście (plik): kubectl apply -f ingress.yaml
  3. Sprawdź, czy ingress został utworzony i pobierz adres IP: kubectl get ingress -w
  4. Utwórz domenę/subdomenę dla swojej aplikacji.

CI/CD

Utwórzmy potok CI/CD przy użyciu CircleCI. Właściwie łatwo jest stworzyć potok CI/CD za pomocą CircleCI, ale pamiętaj, że szybki i brudny, w pełni zautomatyzowany proces wdrażania bez takich testów zadziała w przypadku małych projektów, ale nie rób tego w przypadku niczego poważnego, ponieważ , jeśli jakikolwiek nowy kod ma problemy w środowisku produkcyjnym, stracisz pieniądze. Dlatego powinieneś pomyśleć o zaprojektowaniu solidnego procesu wdrażania, uruchamianiu zadań Canary przed pełnym wdrożeniem, sprawdzaniu błędów w logach po uruchomieniu Canary i tak dalej.

Obecnie mamy mały, prosty projekt, więc stwórzmy w pełni zautomatyzowany, beztestowy proces wdrażania CI/CD. Najpierw powinieneś zintegrować CircleCI ze swoim repozytorium — wszystkie instrukcje znajdziesz tutaj. Następnie powinniśmy stworzyć plik konfiguracyjny z instrukcjami dla systemu CircleCI. Konfiguracja wygląda dość prosto. Najważniejsze jest to, że w repozytorium GitHub istnieją dwie gałęzie: master i production .

  1. Gałąź główna jest przeznaczona do programowania, dla świeżego kodu. Gdy ktoś wypchnie nowy kod do gałęzi master, CircleCI uruchamia przepływ pracy dla gałęzi master — kompilację i testowanie kodu.
  2. Gałąź produkcyjna służy do wdrażania nowej wersji do środowiska produkcyjnego. Przepływ pracy dla gałęzi produkcyjnej wygląda następująco: wypchnij nowy kod (lub jeszcze lepiej, otwórz PR z gałęzi master do produkcji), aby uruchomić nowy proces kompilacji i wdrażania; podczas kompilacji CircleCI tworzy nowe obrazy Dockera, przesyła je do GCR i tworzy nowe wdrożenie dla wdrożenia; jeśli wdrożenie się nie powiedzie, CircleCI wyzwala proces wycofywania.

Przed uruchomieniem jakiejkolwiek kompilacji należy skonfigurować projekt w CircleCI. Utwórz nowe konto usługi w interfejsie API i stronie Usługi w GCloud z następującymi rolami: pełny dostęp do GCR i GKE, otwórz pobrany plik JSON i skopiuj zawartość, a następnie utwórz nową zmienną środowiskową w ustawieniach projektu w CircleCI o nazwie GCLOUD_SERVICE_KEY i wklej zawartość pliku konta usługi jako wartość. Musisz też utworzyć kolejne zmienne środowiskowe: GOOGLE_PROJECT_ID (znajdziesz je na stronie głównej konsoli GCloud), GOOGLE_COMPUTE_ZONE (strefa dla Twojego klastra GKE) i GOOGLE_CLUSTER_NAME (nazwa klastra GKE).

Ostatni krok (wdrożenie) w CircleCI będzie wyglądał następująco:

 kubectl patch deployment sample -p '{"spec":{"template":{"spec":{"containers":[{"name":"sample","image":"gcr.io/test-d6bf8/simple:'"$CIRCLE_SHA1"'"}]}}}}' if ! kubectl rollout status deploy/sample; then echo "DEPLOY FAILED, ROLLING BACK TO PREVIOUS" kubectl rollout undo deploy/sample # Deploy failed -> notify slack else echo "Deploy succeeded, current version: ${CIRCLE_SHA1}" # Deploy succeeded -> notify slack fi deployment.extensions/sample patched Waiting for deployment "sample" rollout to finish: 2 out of 3 new replicas have been updated... Waiting for deployment "sample" rollout to finish: 2 out of 3 new replicas have been updated... Waiting for deployment "sample" rollout to finish: 2 out of 3 new replicas have been updated... Waiting for deployment "sample" rollout to finish: 1 old replicas are pending termination... Waiting for deployment "sample" rollout to finish: 1 old replicas are pending termination... Waiting for deployment "sample" rollout to finish: 1 old replicas are pending termination... Waiting for deployment "sample" rollout to finish: 2 of 3 updated replicas are available... Waiting for deployment "sample" rollout to finish: 2 of 3 updated replicas are available... deployment "sample" successfully rolled out Deploy succeeded, current version: 512eabb11c463c5431a1af4ed0b9ebd23597edd9

Wniosek

Wygląda na to, że proces tworzenia nowego klastra Kubernetes nie jest taki trudny! A proces CI/CD jest naprawdę niesamowity!

TAk! Kubernetes jest niesamowity! Dzięki Kubernetes Twój system będzie bardziej stabilny, łatwiejszy w zarządzaniu i sprawi, że staniesz się jego kapitanem. Nie wspominając o tym, że Kubernetes nieco grywa system i da +100 punktów za Twój marketing!

Teraz, gdy masz już podstawy, możesz pójść dalej i przekształcić to w bardziej zaawansowaną konfigurację. Planuję omówić więcej w przyszłym artykule, ale w międzyczasie mam wyzwanie: Utwórz solidny klaster Kubernetes dla swojej aplikacji ze stanową bazą danych znajdującą się wewnątrz klastra (w tym sidecar Pod do tworzenia kopii zapasowych), zainstaluj Jenkins wewnątrz klastra ten sam klaster Kubernetes dla potoku CI/CD i pozwól Jenkinsowi używać zasobników jako urządzeń podrzędnych dla kompilacji. Użyj certmanager, aby dodać/uzyskać certyfikat SSL dla swojego ruchu przychodzącego. Utwórz system monitorowania i alertów dla swojej aplikacji za pomocą Stackdriver.

Kubernetes jest świetny, ponieważ łatwo się skaluje, nie ma uzależnienia od dostawcy, a ponieważ płacisz za instancje, oszczędzasz pieniądze. Jednak nie każdy jest ekspertem od Kubernetes lub ma czas na skonfigurowanie nowego klastra — dla alternatywnego poglądu, inny Toptaler, Amin Shah Gilani, argumentuje, że używa Heroku, GitLab CI i dużej ilości automatyzacji, którą już wymyślił w celu pisania większej ilości kodu i wykonywania mniejszej liczby zadań operacyjnych w artykule Jak zbudować skuteczny potok wstępnego wdrażania .

Związane z:
  • Wykonaj matematykę: automatyczne skalowanie aplikacji mikroserwisów za pomocą orkiestratorów
  • K8s/Kubernetes: AWS vs. GCP vs. Azure
  • Porównanie sieci usług Kubernetes