Kapitola 1: Základy Kubernetes
Kubernetes je moderný nástroj na správu kontajnerizovaných aplikácií. Ide o klastrový operačný systém, ktorý zabezpečuje orchestráciu kontajnerov.
Kým Docker rieši beh kontajnerov, Kubernetes riadi celý klaster – teda kde a ako aplikácie bežia na viacerých strojoch.
Účel Kubernetes
- efektívne využitie zdrojov (CPU, RAM, disk, sieť)
- automatizácia nasadenia aplikácií
- škálovanie podľa záťaže
Kľúčové vlastnosti
- vysoká dostupnosť
- odolnosť voči výpadkom
- horizontálne a vertikálne škálovanie
- elasticita
Architektúra
Kubernetes klaster obsahuje:
- riadiace uzly (API server, scheduler, etcd)
- pracovné uzly (kubelet, kube-proxy)
Tieto komponenty spolu zabezpečujú chod celého systému.
Kapitola 2: Kubernetes objekty a aplikácie
Kubernetes používa objekty na definovanie stavu aplikácie.
Kubernetes objekt
Objekt:
- reprezentuje zdroj (napr. aplikáciu)
- definuje požadovaný stav
- Kubernetes zabezpečí jeho dodržanie
YAML konfigurácia
Každý objekt sa definuje pomocou YAML:
apiVersionkindmetadataspec
Základné objekty
Pod
- najmenšia jednotka
- obsahuje kontajnery
Deployment
- riadi pody
- umožňuje škálovanie
Service
- sprístupňuje aplikáciu
Typy:
- ClusterIP
- NodePort
- LoadBalancer
Ingress
- HTTP/HTTPS prístup
- mapovanie URL na služby
StatefulSet
Používa sa pre stavové aplikácie:
- databázy
- aplikácie s trvalými dátami
Rozdiel oproti Deploymentu:
- pracuje s úložiskom (PVC)
- zachováva identitu podov
Prečo riešiť úložisko
Aplikácie potrebujú dáta:
- konfigurácie
- databázy
- cache
Dôležité je, že stav musí byť oddelený od samotného kontajnera.
Úrovne správy úložiska
- Úroveň aplikácie
- object storage (napr. MinIO)
- databázy (PostgreSQL, MariaDB)
- Úroveň klastra
- lokálne disky
- distribuované FS (Ceph, Gluster)
- sieťové FS (NFS, SMB)
Kubernetes úložisko
Kubernetes abstrahuje úložisko pomocou objektov:
VolumePersistentVolume (PV)PersistentVolumeClaim (PVC)StorageClassStatefulSet
PersistentVolume (PV)
- reprezentuje fyzické alebo virtuálne úložisko
- vytvára ho administrátor
- môže byť lokálne alebo sieťové (NFS, iSCSI, …)
PersistentVolumeClaim (PVC)
- požiadavka aplikácie na úložisko
- spája aplikáciu s konkrétnym PV
StorageClass
Dynamické vs. statické prideľovanie
Statické - * PV vytvára admin manuálne
Dynamické -
- PVC si vyžiada úložisko automaticky
- využíva sa
StorageClassa provisioner
Záver
Prečo je úložisko zložité
Manažment dát je jedna z najťažších úloh:
- migrácia dát
- zálohovanie
- uvoľňovanie kapacity
Kapitola 1: Základy Kubernetes
Čo je Kubernetes
Kubernetes je moderný nástroj určený na správu aplikácií, ktoré bežia v kontajneroch. Kontajner je balík, ktorý obsahuje aplikáciu spolu so všetkým, čo potrebuje na svoj beh, napríklad knižnice alebo konfiguráciu. Vďaka tomu je aplikácia prenositeľná a funguje rovnako na rôznych počítačoch.
Nástroj ako Docker rieši spustenie kontajnera na jednom stroji, ale Kubernetes ide ďalej. Riadi celý klaster, teda skupinu viacerých počítačov, ktoré spolupracujú ako jeden systém. Preto sa často označuje ako klastrový operačný systém.
Predstavme si jednoduchý príklad. Máme webovú aplikáciu, ktorú používa veľa ľudí. Ak beží iba na jednom serveri, môže sa pri veľkej návštevnosti spomaliť. Kubernetes dokáže vytvoriť viacero kópií tejto aplikácie a rozložiť ich na viac serverov.
ASCII diagram – rozdiel Docker vs Kubernetes
Docker (jeden server)
+-------------------+
| Server |
| +-------------+ |
| | Kontajner | |
| | Aplikácia | |
| +-------------+ |
+-------------------+
Kubernetes (klaster)
+-------------------+ +-------------------+
| Node 1 | | Node 2 |
| +-------------+ | | +-------------+ |
| | Kontajner | | | | Kontajner | |
| +-------------+ | | +-------------+ |
+-------------------+ +-------------------+
\_______________________________/
Kubernetes
Príklad konfigurácie – jednoduchý Pod
Pod je najmenšia jednotka v Kubernetes, ktorá obsahuje jeden alebo viac kontajnerov.
apiVersion: v1
kind: Pod
metadata:
name: moj-pod
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
Tento príklad spustí jednoduchý webový server nginx.
Účel Kubernetes
Hlavným cieľom Kubernetes je efektívne riadiť aplikácie v klastri a zabezpečiť ich spoľahlivý chod. Jednou z najdôležitejších vlastností je efektívne využitie zdrojov, ako sú CPU, RAM, disk a sieť. Kubernetes sleduje, ktoré servery sú vyťažené a ktoré nie, a podľa toho rozdeľuje záťaž.
Ďalším dôležitým cieľom je automatizácia nasadenia aplikácií. Namiesto manuálneho spúšťania aplikácií na serveroch stačí definovať požadovaný stav a Kubernetes sa postará o zvyšok.
Veľmi praktická je schopnosť škálovania. To znamená, že systém dokáže automaticky pridávať alebo odoberať inštancie aplikácie podľa aktuálnej záťaže.
ASCII diagram – škálovanie
Nízka záťaž:
[ Pod ]
Vysoká záťaž:
[ Pod ] [ Pod ] [ Pod ] [ Pod ]
Príklad konfigurácie – Deployment (škálovanie)
Deployment zabezpečuje, že vždy beží požadovaný počet kópií aplikácie.
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
Tu Kubernetes zabezpečí, že budú vždy bežať 3 kópie aplikácie.
Kľúčové vlastnosti Kubernetes
Medzi najdôležitejšie vlastnosti patrí vysoká dostupnosť. To znamená, že aplikácia je dostupná aj v prípade výpadku niektorého servera. Kubernetes automaticky presunie aplikáciu inde.
S tým súvisí aj odolnosť voči výpadkom, teda schopnosť systému obnoviť sa bez zásahu človeka.
Ďalšou vlastnosťou je horizontálne škálovanie, ktoré znamená pridávanie nových kópií aplikácie, a vertikálne škálovanie, ktoré znamená zvyšovanie výkonu jednej kópie.
Elasticita znamená, že systém sa vie rýchlo prispôsobiť aktuálnej záťaži.
ASCII diagram – vysoká dostupnosť
Používateľ
|
v
+---------+
| Service |
+---------+
| |
v v
[Pod][Pod]
|
(výpadok)
X
Kubernetes spustí nový Pod
Príklad konfigurácie – Service (dostupnosť)
Service zabezpečuje prístup k aplikácii a rozdeľuje požiadavky.
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
selector:
app: web
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
Service umožňuje komunikáciu medzi časťami aplikácie a zabezpečuje load balancing.
Architektúra Kubernetes
Kubernetes klaster sa skladá z dvoch hlavných častí: riadiace uzly (control plane) a pracovné uzly (worker nodes).
Riadiace uzly obsahujú komponenty ako API server, ktorý slúži na komunikáciu, scheduler, ktorý rozhoduje, kde sa aplikácia spustí, a etcd, čo je databáza uchovávajúca stav systému.
Pracovné uzly obsahujú komponenty ako kubelet, ktorý zabezpečuje beh kontajnerov, a kube-proxy, ktorý rieši sieťovú komunikáciu.
ASCII diagram – architektúra
+----------------------+
| Control Plane |
|----------------------|
| API Server |
| Scheduler |
| etcd |
+----------+-----------+
|
-------------------------------------
| |
+-----------+ +-----------+
| Worker 1 | | Worker 2 |
|-----------| |-----------|
| kubelet | | kubelet |
| kube-proxy| | kube-proxy|
| Pods | | Pods |
+-----------+ +-----------+
Príklad konfigurácie – Node komunikácia (implicitná)
Aj keď uzly sa väčšinou nekonfigurujú priamo YAML súbormi, komunikácia prebieha cez definované objekty ako napríklad Namespace:
apiVersion: v1
kind: Namespace
metadata:
name: produkcia
Namespace slúži na logické rozdelenie klastra, napríklad na produkčné a testovacie prostredie.
Ingress a LoadBalancer
Pri prevádzke aplikácií v Kubernetes je veľmi dôležité, ako sa k nim dostanú používatelia zvonku. Doteraz sme si ukázali objekt Service, ktorý umožňuje komunikáciu vo vnútri klastra. Ak však chceme sprístupniť aplikáciu mimo klastra, používame mechanizmy ako LoadBalancer a Ingress. Tieto pojmy si teraz vysvetlíme podrobnejšie.
LoadBalancer
LoadBalancer je typ Kubernetes Service, ktorý zabezpečuje prístup k aplikácii z internetu. Funguje tak, že vytvorí verejnú IP adresu a rozdeľuje prichádzajúce požiadavky medzi jednotlivé Pody. Tento proces sa nazýva load balancing, teda vyvažovanie záťaže.
Predstavme si praktický príklad. Máme webovú aplikáciu bežiacu v troch Podoch. Ak by všetci používatelia pristupovali iba k jednému Podu, ten by sa rýchlo preťažil. LoadBalancer zabezpečí, že požiadavky sa rovnomerne rozdelia medzi všetky dostupné Pody.
ASCII diagram – LoadBalancer
Internet
|
+---------------+
| LoadBalancer |
+-------+-------+
|
-------------------
| | |
[Pod] [Pod] [Pod]
LoadBalancer sa často využíva v cloudových prostrediach, ako sú AWS, Azure alebo Google Cloud, kde poskytovateľ automaticky vytvorí externý load balancer.
Príklad konfigurácie – Service typu LoadBalancer
apiVersion: v1
kind: Service
metadata:
name: web-loadbalancer
spec:
type: LoadBalancer
selector:
app: web
ports:
- port: 80
targetPort: 80
V tomto príklade Kubernetes vytvorí verejný prístup k aplikácii na porte 80 a bude rozdeľovať požiadavky medzi Pody označené labelom app: web.
Ingress
Ingress je pokročilejší spôsob, ako riadiť prístup k aplikáciám. Na rozdiel od LoadBalanceru, ktorý pracuje na úrovni IP adresy a portu, Ingress funguje na úrovni HTTP/HTTPS a umožňuje smerovanie požiadaviek podľa URL alebo domény.
To znamená, že pomocou jedného vstupného bodu môžeme sprístupniť viacero rôznych služieb. Napríklad požiadavky na example.com/api môžu smerovať na backend aplikáciu, zatiaľ čo example.com/web smeruje na frontend.
Aby Ingress fungoval, potrebujeme ešte komponent nazývaný Ingress Controller. Je to aplikácia bežiaca v klastri, ktorá spracováva Ingress pravidlá a zabezpečuje reálne smerovanie požiadaviek.
ASCII diagram – Ingress
Internet
|
+-------------+
| Ingress |
+------+------+
|
---------------------
| |
+---------+ +---------+
| Service | | Service |
+----+----+ +----+----+
| |
[Pod] [Pod]
Praktický príklad
Predstavme si, že máme dve aplikácie: jedna je webová stránka a druhá je API. Chceme ich sprístupniť cez jednu doménu, ale na rôznych cestách.
mojweb.sk/→ frontendmojweb.sk/api→ backend
Ingress nám umožní toto správanie jednoducho nastaviť.
Príklad konfigurácie – Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
spec:
rules:
- host: mojweb.sk
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: frontend-service
port:
number: 80
- path: /api
pathType: Prefix
backend:
service:
name: backend-service
port:
number: 80
Tento príklad hovorí, že všetky požiadavky na doménu mojweb.sk sa budú smerovať podľa cesty URL. Kubernetes tak dokáže obslúžiť viac aplikácií cez jeden vstupný bod.
Rozdiel medzi LoadBalancer a Ingress
LoadBalancer je jednoduchý spôsob, ako sprístupniť jednu službu na internete pomocou IP adresy. Každá služba typu LoadBalancer má zvyčajne vlastnú verejnú IP adresu.
Ingress je flexibilnejší a efektívnejší, pretože umožňuje spravovať viacero služieb cez jednu IP adresu a smerovať požiadavky podľa pravidiel.
V praxi sa často používa kombinácia oboch. LoadBalancer poskytne externú IP adresu pre Ingress Controller a Ingress potom riadi samotné smerovanie požiadaviek.
ASCII diagram – kombinácia
Internet
|
+---------------+
| LoadBalancer |
+-------+-------+
|
+-------+
|Ingress|
+---+---+
|
-----------------
| |
Service Service
| |
[Pod] [Pod]
Takáto architektúra je bežná v moderných produkčných prostrediach, pretože kombinuje jednoduchosť a flexibilitu.
Úložisko v Kubernetes
Pri práci s aplikáciami je dôležité nielen ich spúšťanie, ale aj práca s dátami. Doteraz sme sa bavili o Podoch, ktoré sú základnou jednotkou Kubernetes. Pod je však zo svojej podstaty dočasný. Keď sa Pod zruší alebo presunie na iný uzol, jeho dáta sa stratia. Tento problém rieši Kubernetes pomocou mechanizmov pre trvalé úložisko.
Úložisko v Kubernetes umožňuje uchovávať dáta nezávisle od životného cyklu Podu. To znamená, že aj keď sa aplikácia reštartuje alebo presunie, dáta zostanú zachované. Je to kľúčové napríklad pre databázy, súbory používateľov alebo logy.
Základné pojmy úložiska
Kubernetes používa niekoľko dôležitých objektov na prácu s úložiskom. Najzákladnejší je Volume. Volume je úložisko pripojené k Podu, ktoré môže existovať počas jeho behu. Volume však stále zaniká spolu s Podom, preto nie je vhodné na dlhodobé uchovávanie dát.
Pre trvalé úložisko sa používajú objekty PersistentVolume (PV) a PersistentVolumeClaim (PVC).
PersistentVolume predstavuje konkrétny úložný priestor v klastri. Môže to byť napríklad disk v cloude, sieťové úložisko alebo lokálny disk. PV je zdroj, ktorý spravuje administrátor klastra.
PersistentVolumeClaim je požiadavka na úložisko zo strany aplikácie. Vývojár si povie, koľko miesta potrebuje a aký typ úložiska chce, a Kubernetes mu priradí vhodný PersistentVolume.
Tento model funguje podobne ako prenájom bytu. PV je samotný byt a PVC je žiadosť o jeho prenájom.
ASCII diagram – PV a PVC
[ Pod ]
|
v
[ PVC ] ----> [ PV ] ----> [ Disk / Storage ]
Príklad konfigurácie – PersistentVolume
apiVersion: v1
kind: PersistentVolume
metadata:
name: moj-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /data/moj-priestor
Tento príklad definuje úložisko s veľkosťou 1 GB, ktoré sa nachádza na lokálnom disku.
Príklad konfigurácie – PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: moj-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
PVC požiada Kubernetes o úložisko s veľkosťou 1 GB. Kubernetes následne nájde vhodný PV a prepojí ich.
Použitie úložiska v Pode
Aby aplikácia mohla úložisko používať, musí byť pripojené do Podu.
apiVersion: v1
kind: Pod
metadata:
name: app-s-datami
spec:
containers:
- name: app
image: nginx
volumeMounts:
- mountPath: "/data"
name: storage
volumes:
- name: storage
persistentVolumeClaim:
claimName: moj-pvc
V tomto prípade sa úložisko pripojí do adresára /data v kontajneri.
StorageClass
StorageClass je objekt, ktorý definuje, ako sa má úložisko vytvárať. Obsahuje informácie o type úložiska, napríklad či ide o SSD disk, HDD disk alebo cloudové úložisko.
StorageClass umožňuje automatické vytváranie úložiska bez zásahu administrátora.
Príklad konfigurácie – StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: rychle-ssd
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
V reálnom prostredí by tu bol konkrétny provisioner, napríklad pre AWS alebo Azure.
Statické vs dynamické prideľovanie úložiska
Existujú dva hlavné spôsoby, ako Kubernetes priraďuje úložisko: statické a dynamické prideľovanie.
Pri statickom prideľovaní administrátor najprv manuálne vytvorí PersistentVolume. Tento PV potom čaká, kým ho niektorý PVC využije. Tento prístup je jednoduchý, ale menej flexibilný, pretože vyžaduje manuálnu správu.
Pri dynamickom prideľovaní Kubernetes automaticky vytvorí PersistentVolume na základe požiadavky PVC a definície StorageClass. To znamená, že vývojár nemusí riešiť konkrétne úložisko, stačí mu definovať požiadavku.
ASCII diagram – statické vs dynamické
Statické:
Admin -> [ PV ] -> [ PVC ] -> [ Pod ]
Dynamické:
[ PVC ] -> [ StorageClass ] -> (automaticky vytvorí PV) -> [ Pod ]
Príklad dynamického prideľovania
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: dynamicky-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: rychle-ssd
resources:
requests:
storage: 5Gi
V tomto prípade Kubernetes automaticky vytvorí úložisko s veľkosťou 5 GB podľa definície StorageClass.
Úložisko v Kubernetes rieši problém trvalosti dát v prostredí, kde sú kontajnery dočasné. Pomocou objektov ako PersistentVolume, PersistentVolumeClaim a StorageClass dokáže Kubernetes efektívne spravovať dáta. Rozdiel medzi statickým a dynamickým prideľovaním spočíva najmä v miere automatizácie, pričom dynamický prístup je dnes preferovaný v moderných aplikáciách.
Kubernetes je výkonný nástroj na správu kontajnerizovaných aplikácií v prostredí viacerých serverov. Vďaka vlastnostiam ako škálovanie, vysoká dostupnosť a automatizácia umožňuje spoľahlivý chod moderných aplikácií. Kombináciou komponentov ako Pod, Deployment a Service dokáže efektívne riadiť aplikácie v celom klastri.