# Docker --- # Kubernetes Kamil Breguła --- # Co to jest? Kubernetes to przenośna, rozszerzalna platforma open source do zarządzania konteneryzowanymi aplikacjami i usługami, która jest realizowana przez deklarywną konfiguraccje i daleko posuniętą automatyzaccje automatyzację. Ma duży, szybko rozwijający się ekosystem (!!!) Nazwa Kubernetes pochodzi od greckiego, co oznacza sternika lub pilota. Google otworzył projekt Kubernetes w 2014 roku. Kubernetes opiera się na półtorej dekadzie doświadczenia, które Google ma z wykorzystaniem kontenerów produkcyjnie na dużą skalę, w połączeniu z najlepszymi w swojej klasie pomysłami i praktykami społeczności. --- # Dlaczego potrzebujemy Kubernetesa? Kontenery to dobry sposób na pakowanie i uruchamianie aplikacji. W środowisku produkcyjnym musisz zarządzać kontenerami, w których działają aplikacje i upewnić się, że nie ma przestojów. Na przykład, jeśli kontener ulegnie awari, należy uruchomić inny kontener. Czy nie byłoby łatwiej, gdyby to zachowanie było obsługiwane przez system? W ten zadaniu Kubernetes przychodzi na ratunek! Kubernetes zapewnia platformę do niezawodnego uruchamiania systemów rozproszonych. Zajmuje się skalowaniem i przełączaniem awaryjnym aplikacji, zapewnia wzorce wdrażania i wiele więcej. Na przykład Kubernetes może łatwo zarządzać wdrożeniem stopniowym (ang. canary deployment) dla twojego systemu. --- # Co może robić z Kubernetesem? * Wykrywania usług i równoważenie obciążenia (ang. Service discovery and load balancing) * Organizacja dostępu do danych (ang. Storage orchestration) * Automatyczne wdrażanie i wycofywanie (ang. Automated rollouts and rollbacks) * Automatyczne rozmieszczanie kontenerów (ang. Automatic bin packing) * Samo leczenie (ang. Self-healing) * Zarządzanie sekretami i konfiguracją (ang. Secret and configuration management) --- # Czym nie jest Kubernetes? Kubernetes nie jest tradycyjnym, kompleksowym systemem PaaS (Platform as a Service), jak np. Heroku. Ponieważ Kubernetes działa na poziomie kontenera, a nie na poziomie sprzętowym, zapewnia pewne ogólnie stosowane funkcje popularne w rozwiązaniach rozwiązań PaaS, takie jak wdrażanie, skalowanie, równoważenie obciążenia, zbieranie logów i monitorowanie. Są one opcjonalne. Kubernetes nie jest monolityczny. Projekt kładzie duży nacisk na uniezależnienie każdego komponentu, aby mógł dostosować sie do każdego rodzaju projektu. --- * Nie ogranicza typów obsługiwanych aplikacji. * Nie wdraża z kodu źródłowego i nie buduje aplikacji. (CI/CD) * Nie zapewnia usług na poziomie aplikacji, ale ułatwia ich realizacje, takich jak: * nie zapewnia oprogramowanie pośrednie (np. szyny komunikatów ang. message buses) * nie zapewnia struktury przetwarzania danych (na przykład Spark) * nie zapewnia bazy danych (np. MySQL) * nie zapewnia pamięci podręczne ani systemy pamięci masowej w klastrze (np. Ceph) * Nie narzuca rozwiązań w zakresie rejestrowania dziennika, monitorowania ani ostrzegania. * Nie zapewnia konserwacji, zarządzania ani samonaprawiania się **maszyn**. --- # Architektura - Architektura ogólna - Architektura węzła głównego (ang. master/control plane) - Architektura węzła głównego (ang. node) --- ## Architektura ogólna ![](https://i.imgur.com/Hv92CgW.png) --- ## Architektura Control Plane ![](https://i.imgur.com/4zlIGa6.png) --- ## Architektura Node ![](https://i.imgur.com/47nK76k.png) --- # Podstawowe pojęcia --- ## Obiekty Kubernetes Obiekty Kubernetes są trwałymi bytami w systemie Kubernetes. Kubernetes używa tych jednostek do reprezentowania stanu twojego klastra. M.in. mogą opisać: * Jakie aplikacje w kontenerze są uruchomione * Zasoby dostępne dla tych aplikacji * Zasady dotyczące zachowania tych aplikacji Obiekt Kubernetes jest „zapisem intencji” - po utworzeniu obiektu system Kubernetes będzie stale monitorować, aby upewnić się, że obiekt istnieje. Aby pracować z obiektami Kubernetes - czy je tworzyć, modyfikować, czy usuwać - musisz użyć interfejsu API Kubernetes. Można też wykorzystać program `kubectl`, który wykorzystuje te API. --- ### Struktura W pliku ``.yaml`` dla obiektu Kubernetes, który chcesz utworzyć, musisz ustawić wartości dla następujących pól: * `apiVersion` - wymagana wersja API * `kind` - rodzaj obiektu * `metadane` - Dane, które pomagają jednoznacznie zidentyfikować obiekt, w tym ciąg nazwy, identyfikator UID i etykiety * `spec` - specyfikacja obiektu Dodatkowo obiekty mogą zawierać pole: ``status``. --- ### Pod Pod jest podstawową jednostką wykonawczą aplikacji Kubernetes - najmniejszą i najprostszą jednostką w modelu obiektowym Kubernetes, którą tworzysz lub wdrażasz. Pod reprezentuje procesy uruchomione w klastrze. Pod może zawierać wiele opcji np. obrazy, zasady rozmieszczania wezłów. --- ![](https://i.imgur.com/C8Y23vj.png) --- ```yaml apiVersion: core/v1 kind: Pod metadata: name: my-awesome-app spec: containers: - name: master image: my-awesome-app resources: requests: cpu: 100m memory: 100Mi ports: - containerPort: 6379 ``` ``` kubectl apply -f my-awesome-app.yaml ``` --- # Kontrollery W Kubernetes kontrolery są pętlami kontrolnymi, które obserwują stan klastra, a następnie wprowadzają lub żądają zmian w razie potrzeby. Każdy kontroler próbuje przenieść bieżący stan klastra bliżej pożądanego stanu. Nie jest zalecane tworzenie podów samodzielne, ale lepiej skorzystać z specjalistycznego kontrolera. --- # Typy kontrollerów **ReplicaSet**, domyślnie, jest stosunkowo prostym typem. Zapewnia, że działa określona liczba podów **Deployment** to deklaratywny sposób zarządzania podami za pośrednictwem **ReplicaSets**. Obejmuje mechanizmy wycofywania i aktualizacji (ang. rollback and rolling update mechanisms) **Daemonset** to sposób na zapewnienie, że każdy węzeł uruchomi instancję zasobnika. Służy do usług klastrowych, takich jak monitorowanie kondycji i przekazywanie dzienników (ang. monitoring and logging). **StatefulSet** jest dostosowany do zarządzania pod, które muszą utrzymywać lub utrzymywać stan. **Job** i **CronJob** uruchamiają krótkotrwałe zadania jednorazowo lub zgodnie z harmonogramem. --- ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80 ``` --- # Kubernetes jest rozszerzalny * PrometheusOperator - zapewnia lepsze mechanizmy monitoringu * GitLab CI - może wykorzystywac Kubernetes do uruchamiania zadań z CI * Knative - pozwala na automatyczne skalowanie podów na podstawie ilości ruchu HTTP/TCP, w tym od zera. * AirflowOperator - pozwala na zainstalowanie aplikacji Airflow i zarządzanie jej w sposób deklaratywny * MySqlOperator - pozwala na automatyczne zarządzanie bazą MySQL, w tym tworzy kopie zapasowe, przywraca, realizuje kopie zapasowe. * CertManager - zarządza certyfikatami, a następnie udostepnia je dla innych kontenerów * Config Connector - pozwala na zarządzanie zasobami w chmurze GCP, a takżę zapewnia do nich połączenie i autoryzacje z nimi np. Cloud SQL * Istio - zapewnia rozbudowane mechanizmy kontroli sieci i ruchu sieciowego --- # Pets vs Cattle Dawniej traktowaliśmy nasze serwery jak Zwierzęta domowe, na przykład Bob - serwer pocztowy. Jeśli Bob ulega awaria, wszystko pada. Współcześnie serwery są numerowane, jak bydło w stadzie. Na przykład od www001 do www100. Kiedy jeden serwer przestaje działać, jest usuwany z klastra, i w zamian dodawany jest nowy. Zwierzęta są niezwykle ważne, ale bydło jest wymienne. Przeniesienie infrastruktury oprogramowania produkcyjnego ze zwierząt domowych na bydło jest kluczem do stworzenia systemu o wysokiej dostępności (HA) o zmniejszonej liczbie awarii, mniejszym promieniu rażenia awari i szybszym odzyskiwaniu po awarii. --- # Jak użyć? Każdy duży dostawca chmurowy posiada możliwość utworzenie klastra Kubernetowego(GCP, AWS, Oracle. Dla studentów korzystne może być skorzystanie z Gogole Cloud Platform, ponieważ oferują 300$/rok za darmo. ``` gcloud container clusters create [CLUSTER_NAME] \ --zone [COMPUTE_ZONE] \ --release-channel stable \ --machine-type n1-standard-1 \ --num-nodes [NUM_NODES] ``` Możliwe jest tworzenie również klastra
{"metaMigratedAt":"2023-06-15T01:31:27.260Z","metaMigratedFrom":"Content","title":"Docker","breaks":true,"contributors":"[{\"id\":\"abbd3d24-cf53-47b0-ba89-f0dad3deef79\",\"add\":10537,\"del\":2079}]"}
    419 views