Konfigurace objektů v Kubernetes

Poslední aktualizace 31. 8. 2021


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

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

Zde definujeme pod ve verzi api v1.

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

Deployment

Deployment představuje objekt seskupující nasazení kontejneru nebo více kontejnerů do jedné konfigurace. Umožňuje definovat a spravovat sadu replik 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 3. části tohoto návodu (Pod), 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.


Máte nejasnosti nebo nápad na zlepšení článku?

Napište nám