Co to jest Kubernetes?

Kubernetes to platforma do tak zwanej orkiestracji czyli zarządzenia zadaniami i aplikacjami w kontenerach. Ułatwia automatyzację, skalowanie i pracę z konfiguracją w postaci kodu.
Pozwala na działanie w środowiskach zbudowanych z wielu serwerach. Nazwa pochodzi z greki i oznacza sternika lub pilota.
Platformę tą dostajemy dzięki firmie Google. Często nazwa Kubernestes zapisywana jest jako K8S.

Jakie są główne korzyści z używania Kubernetesa?

  • Skalowalność – kubenetes potrafi uruchamiać automatycznie kolejne zasoby, by obsłużyć większy ruch. Co więcej, potrafi też zmniejszyć ilość zasobów automatycznie, gdy ruch się zmniejszył.
  • Wysoka dostępność – kubernetes daje możliwość nieprzerwanej dostępności aplikacji (bez downtime’u) dzięki wielu replikom tej samej aplikacji, często rozmieszczonej na wielu serwerach.
  • Odporność na awarie – kubernetes potrafi sam namierzyć niedziałające/nieodpowiadające aplikacje i przywrócić ich działającą wersję.
  • Ułatwia wdrażanie – potrafi balansować ruch na nowa wersje, a jeśli wystąpi problem, to wróci z ruchem na poprzednią działającą wersje aplikacji.

Kubernetes używa kontenerów Dockera do przechowywania aplikacji. Choć potrafi też pracować z innymi mniej popularnymi rozwiązaniami do konteneryzacji.

Jak zbudowany jest Kubernetes?

W Kubernetesie można wyróżnić dwie warstwy: warstwa zarządzająca (master node) i warstwa robocza (worker node).

Obie warstwy bazują na pracujących w nich kontenerach. Przy czym warstwa zaradzająca zawiera kontenery z narzędziami niezbędnymi do funkcjonowania i sterowania całym Kubernetesem, natomiast warstwa robocza zawiera kontenery już z aplikacjami użytkownika.

W warstwie zarządzającej występują takie elementy jak:

  • API server (kube-apiserver) – umożliwia komunikacje użytkownika z Kubernetesem po przez graficzny dashboard, API lub linie poleceń (CLI). Jest to generalnie frontend Kubernetsa.
  • Controler Mangager (kube-controller-manager) odpowiada na uruchamianie kontrolerów i pilnuje ich stanu (zdrowia).
  • Scheduler (kube-scheduler) – odpowiada za śledzenie tworzenia nowych podów i przypisuje im nody, na których powinny zostać odpalone.
  • etcd – magazyn (klucz-wartość) do przechowywania stanu klastra oraz jego konfiguracji.

Natomiast warstwa workerów zawiera:

  • Pody – pod jest to podstawowa jednostką. To taki pojemnik na aplikacje. Zawiera jeden kontener bądź więcej – w zależności od tego z ilu kontenerów składa sie dana aplikacja, a dokładniej jedna instancja aplikacji).
    Każdy pod ma swój własny adres IP. A komunikacja wewnątrz poda odbywa sie po adresach localhostowych 127.0.0.1. Co ważne, w konfiguracji nie odnosimy się do kontenerów tylko do podów. Skalowanie Kubernetesa polega na dokładaniu lub odejmowaniu całych podów.
    Definicja poda zawiera się w pliku w formacie yaml. Nowy pod z poliku tworzymy poleceniem kubectl apply -f pod.yml
  • Agenta kublet, który odpowiada za komunikacje i uruchamianie kontenerów w podzie. Jest na każdym nodzie.

Nody w Kubernetesie to takie Workery w Docker Swarm.
Oczywiście należy mieć kilka nodów by redundacja miała sens. Grupa nodów to klaster.
Choć mamy też wersje Kubernetsa do nauki składające się z jednego noda –

Konfiguracja w Kubernetes jest deklaratywna to  znaczy że opisujemy stan jaki chcemy aby zaistniał. Obiekty w kubernetsie opisane są w YAMLu.
Skalowanie polega na zwiększeniu replik kontenerów z aplikacją tak aby rozłożyć ruch na ich większa ilość (loadbalancing) tym samym zwiększając wydajność i dostępność.

Namespace – przestrzeń nazw, służy do grupowa i wyizolowania zasobów. Na przykład ze względu na projekt. Domysly namespace to default.

Co to jest minikube?
Minikube jest to narzędzie do tworzenia lokalnego klastra na maszynie (zawiera mastera i workera). Idealny do testów i nauki K8s. Do pobrania stąd https://github.com/kubernetes/minikube/releases

Podstawowe polecenia w Kubernetes

kubectl get pods – zwraca liste podów w domyślnym namespace

kubectl describe pod <NazwaPoda> – wyświetla wszystkie informacje na temat poda

kubectl get nodes – wyświetla listę nodów

kubectl version – zwraca wersje Kubernetesa

kubectl run nginx --image=nginx tworzy pod z kontenerem nginx na podstawie obrazu nginx z dockerhub