Konfigurace objektů v Kubernetes

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

2. Ú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 ve článku Kubernetes objekty. Nyní si ukážeme základní definici objektů Pod a Deployment.

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

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

Sdílení

Byl pro Vás článek užitečný a srozumitelný?