# 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

---
## Architektura Control Plane

---
## Architektura Node

---
# 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.
---

---
```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}]"}