Konfigurace Kubernetes Deployment a Kubernetes Pod
Poslední aktualizace 4. 9. 2023
Úvod
Návod popisuje základní skladbu YAML objektů používaných pro definice v rámci Kubernetes. Další části pak rozebírají jednotlivé konfigurace – Pod a Deployment.
Úvod do konfigurace objektů
Konfigurace v Kubernetes je strukturovaný YAML nebo JSON objekt, přičemž YAML notace je preferována. YAML využívá dvě základní struktury – mapy a sekvence (někdy také nazývané listy). Mapy představují dvojice název-hodnota oddělené dvojtečkou a mezerou.
---
apiVersion: v1
kind: Pod
Ve výše uvedeném příkladu máme dvě mapy, název apiVersion s hodnotou v1 a název kind s hodnotou Pod. Mapy mohou být vnořené, takže hodnota jedné mapy může být vnořená mapa nebo vnořená sekvence.
apiVersion: v1
kind: Pod
metadata:
name: rss-site
labels:
app: web
Nově vložený název metadata má za hodnotu dvě vnořené mapy name a labels, přičemž název labels má ještě jednu vnořenou mapu s názvem app. Vnořování probíhá pomocí mezer, nikdy ne pomocí tabulátorů.
Sekvence nebo také listy jsou položky seznamu, každá položka je oddělená pomlčkou.
args:
- sleep
- "1000"
- message
- "Bring back Firefly!"
Opět je možné kombinovat sekvence a mapy.
Tipy:
- Přestože je možné psát Kubernetes konfigurace ve formátu YAML i JSON, je doporučeno psát všechny konfigurace v YAML díky větší uživatelské přehlednosti.
- Seskupujte související konfigurace do jednoho souboru, jednotlivé části oddělené třemi pomlčkami. Udržovat jeden soubor je jednodušší než několik (příklad této syntaxe zde).
- Množství kubectl příkazů je možné spustit nejen na soubor, ale i na složku. Například můžete zavolat kubectl apply na složku s konfiguracemi. Více informací najdete v článku Configuration Best Practices v oficiální dokumentaci.
V rámci Kubernetes je využíváno několika základních typů zdrojů, které jsou blíže rozebrány v článku Kubernetes objekty. Nyní si ukážeme základní definici objektů Pod a Deployment.
Kubernetes Pod
Každá definice zdroje začíná dvěma základními mapami – apiVersion a kind.
apiVersion: v1
kind: Pod
metadata:
name: rss-site
labels:
app: web
spec:
containers:
– name: front-end
image: nginx
ports:
– containerPort: 80
– name: rss-reader
image: nickchase/rss-php-nginx:v1
ports:
– containerPort: 88
Pod vyžaduje další informace, aby ho bylo možné korektně vytvořit. Tyto informace dělíme do dvou kategorií metadata a spec.
Mapa metadata obsahuje vnořené identifikační údaje podu, zde name s hodnotou rss-site a labels s dvojicí app: web. Jméno name musí být unikátní v rámci daného jmenného prostoru (namespace), jinak dojde při aplikování této konfigurace k přepsání stejně pojmenovaného předchozího podu.
Mapa spec definuje objekty, které vytvářejí vlastní pod. Informace o všech dostupných konfiguracích je možné najít v dokumentaci API Kubernetes.
Definujeme dva kontejnery (každý pod musí obsahovat minimálně jednu definici kontejneru), s názvem front-end a rss-reader.
spec:
containers:
– name: front-end
image: nginx
ports:
– containerPort: 80
– name: rss-reader
image: nickchase/rss-php-nginx:v1
ports:
– containerPort: 88
Definujeme zdrojové obrazy nginx pro front-end a nickchase/rss-php-nginx:v1 pro rss-reader a otevíráme porty, na kterých budou kontejnery poslouchat. (Publikování portů mimo pod se věnuje článek Konfigurace ingressu a deploymentu). Informace k dostupným volbám kontejnerů jsou k nalezení v oficiální dokumentaci.
Takto definovaný pod uložíme například do souboru pod.yml a konfiguraci aplikujeme zavoláním
kubectl apply -f pod.yml
Pokud vše proběhlo korektně a máme správná práva pro vytvoření podu, tak Kubernetes odpoví
pod "rss-site" created
Kubernetes Deployment
Kubernetes Deployment představuje objekt seskupující nasazení kontejneru nebo více kontejnerů do jedné konfigurace. Umožňuje definovat a spravovat sadu replik Kubernetes Podů, neboli ReplicaSet, a zajistit, že dané množství podů je vždy dostupné.
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: rss-site
spec:
replicas: 2
Deployment začínáme opět mapami apiVersion a kind, tentokrát využíváme apiVersion ve verzi extensions/v1beta1. Kind je tentokrát Deployment. Dále máme v části metadata název tohoto deploymentu rss-site, pod kterým ho je možné v Kubernetes následně najít. Ve spec specifikaci pak požadujeme, aby byly udržovány 2 repliky podu, o definici podu deployment následně rozšíříme.
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: rss-site
spec:
replicas: 2
template:
metadata:
labels:
app: web
spec:
containers:
- name: front-end
image: nginx
ports:
- containerPort: 80
- name: rss-reader
image: nickchase/rss-php-nginx:v1
ports:
- containerPort: 88
Definice template je velmi podobná definici, kterou jsme si představovali v části Kubernetes Pod v tomto návodu, protože zde definujeme stejné vlastnosti jako u osamoceného podu: jaká budou označení daného podu, jaké se použijí kontejnery s jakými zdrojovými obrazy a jaké jim budou přiřazeny porty.
Takto definovaný deployment uložíme do souboru a nasadíme pomocí
kubectl create -f deployment.yaml
Pokud vše proběhne v pořádku, odpoví api
deployment "rss-site" created
a po zavolání kubectl get deployments
se nám zobrazí
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
rss-site 2 2 2 2 7s
Pokud se nám hned nezobrazí všechny repliky jako dostupné (available), stačí chvíli počkat, případně se podívat na výstup kubectl describe deployment rss-site
, kde je popsáno, v jakém je momentálně deployment stavu a kde jsou případné problémy.