Technologie

Kubernetes teoreticky i prakticky, ale hlavně stručně

24. 06. 2021

O cloudu už slyšel asi každý, spíš je to tak, že bez cloudu si už vývojář ani neškrtne. Nicméně, cloud je velmi široký pojem a když chcete v cloudu něco dělat, musíte se chytit něčeho konkrétnějšího. A je to právě Kubernetes, který získává pověst „té“ cloudové platformy.

Začátky jsou nejtěžší. Nejde ani tak o to, jak těžké jsou, ale spíš o to, že nevíme, kde začít. Jakmile uděláme první krůčky, zbytek už se poddá. Proto v tomto článku uděláme ty první kroky a nasadíme naši první aplikaci v Kubernetu.

V první části projdeme jen kousek teorie o tom, jak Kubernetes funguje, abychom se v dalších částech rovnou vrhli na nasazení. Naše aplikace nebude dokonalá a nasazení bude naivní a na produkci by neobstálo. Pomůže nám ale pochopit, co jsou stavební kameny Kubernetu a jak se používají.

Cíl

Naším cílem bude nasadit jednoduchou webovou aplikaci, která v browseru zobrazí seznam přednášek na konferenci ARTINskills. Vypadá asi takto:

Je to aplikace napsaná v node.js (ne že by nám na tom záleželo, dostaneme prostě docker image) a jediné, co potřebuje, je postgres databáze, ze které přečte ten seznam.

Diagram našeho nasazení by tedy mohl vypadat nějak takto:

Pojďme se podívat, jak to provést v Kubernetu.

Trocha teorie

Jak už jsme zmínili, Kubernetes je platforma. Je to platforma postavená na kontejnerech (jako Docker) a jejím hlavním úkolem je pouštět kontejnery s našimi aplikacemi. K tomu nabízí další podpůrné prostředky jako je např. filesystem pro jejich data, configmapy pro jejich konfiguraci, síťové propojení mezi kontejnery atd. Malou část si ukážeme v praktické části. .

Pro začátek si řekneme, co potřebujeme.

Rozhodně potřebujeme Kubernetes cluster. Nejsnazší je vzít si cluster jako službu od nějakého cloud providera jako je Google (GKE) nebo Amazon (EKS). Jediné, co to chce, je zaplatit. Pokud chceme ušetřit nebo si pohrát na vlastním písečku, není těžké udělat si vlastní cluster na svém počítači. Např. Docker Desktop pro Windows nebo Mac má Kubernetes už zabudovaný v sobě. Linuxoví uživatelé ocení utilitku k3d (https://k3d.io/), která vytváří clustery na požádání.

Ke clusteru se potřebujeme nějak připojit a k tomu slouží nástroj kubectl. Je to základní, všudypřítomný Kubernetes nástroj. Všechno, co se v Kubernetu děje, se ovládá přes HTTP API a kubectl je univerzální (a hlavní) klient pro toto API. Tak pokud jej ještě nemáte: https://kubernetes.io/docs/tasks/tools/

Dále, protože ne všechno je lepší přes command line a něco chceme občas vidět i v nějaké uživatelsky přívětivé podobě, doporučuji Lens: https://k8slens.dev/. A hodit se nám bude i nějaký textový editor (tady nechám výběr na vás, třeba VS Code?).

Pojďme na to

Kontrola spojení

Nejprve zjistíme, jestli nám jede spojení na náš Kubernetes cluster. Většinu naší práce budeme dělat z příkazové řádky (čiže command line), rovnou zavoláme:

a očekáváme odpověď ve tvaru:

První deployment

Nebudeme to zdržovat, uděláme první nasazení. Sice nebude fungovat, ale to spravíme postupně.

Cokoli chceme dostat do Kubernetu, vytvoříme YAML soubor (tzv. manifest), který popisuje, co chceme, aby v Kubernetu bylo. Ten pak, pomocí kubectl aplikujeme a uvidíme, co se stane.

Vytvoříme soubor app-deployment.yaml:

Co to vlastně děláme? Tento manifest říká, že požadujeme:

  • deployment (#1)
  • se jménem “app” (#2)
  • tento deployment bude mít jen jednu repliku (#3), tedy jen jeden pod. Pro Kubernetes Pod znamená jednu běžící věc, můžete si představit jeden kontejner nebo jeden process – není to úplně přesné, proto je to pod, ale pro představu to stačí.
    Deployment by mohl požadovat stejnou aplikaci spustit v několika replikách např. kůli výkonu nebo pro zajištění dostupnosti, když se jedna replika zasekne. Nám bude stačit jedna.
  • následují dvě věci, které se doplňují – selector a template
  • selector říká podle čeho pozná deployment svoje pody (#4)
  • template je šablona pro vytváření podů – replik. #5 musí odpovídat selectoru
  • #6 je image naší aplikace
  • #7 port, na kterém aplikace poslouchá

Na první pohled je Kubernetes manifest hodně ukecaná věc, které musíte vypsat spoustu detailů, ale není to tak zlé. Jeden z důvodů, proč to tak je, je to, že možnosti Kubernetu jsou mnohem (ale mnohem) větší, než to, co tu uvidíme, a manifesty mají pro to prostor. Ale všechny manifesty drží stejný styl a jakmile si zvyknete na jejich strukturu, už vám to tak komplikované nepřijde.

Náš manifest aplikujeme:

a odpověď:

To znamená, že Kubernetes dostal instrukce a právě se je snaží splnit. Zkontrolovat ho můžeme třeba takto:

a uvidíme:

To znamená, že naše aplikace běží. Jenže kde, a jak se k ní dostanu? Zatím sice běží, ale je schovaná uvnitř clusteru. Abychom si ji mohli zkusit, potřebujeme se “protunelovat dovnitř”. Tímto příkazem otevřeme tunel do clusteru na náš pod (jeho přesný název jsme okopírovali z předchozího příkazu) a na jeho port 3000.

A když tam nasměřujeme prohlížeč uvidíme:

Skoro! Aplikace běží, ale nemůže se připojit do databáze. Pochopitelně, databázi jsme ještě nenasadili.

Nasazení databáze

Tak tedy nasadíme databázi. Image máme nachystaný, takže se to skoro neliší od nasazení z předchozího kroku.

Připravíme si soubor db-deployment.yaml:

Jediná zajímavější věc je tu proměnná prostředí POSTGRES_PASSWORD (#1). To je nastavení pro postgres, aby věděl jaké heslo dát pro postgres admina.

Po nasazení:

uvidíme:

Tedy, že oba naše pody běží.

Můžete si zkusit udělat tunel do db podu a zkontrolovat, že je OK, ale naši aplikaci to stále nespravilo. Databáze už sice běží, ale aplikace neví kde – jaké URL má pro připojení použít.

Service

Abychom to napravili, musíme vytvořit tzv. service. Service je v Kubernetu věc, která umožňuje routování síťového provozu v clusteru. Stará se např. o DNS záznamy a o loadbalancing v případě, že má deployment více replik. Pokud tedy chcete, aby se dalo na nějakou věc připojit (u nás na databázi a na aplikaci), musí tato věc mít svou service.

Připravíme tedy soubory db-service.yaml

a app-service.yaml

Je to jiný druh manifestu (kind je Service), ale má podobnou strukturu jako deployment. V tomto případě spec říká, kam se mají posílat packety, které přijdou na adresu db (resp. app), a to na pody, které mají label application: db (resp. app).

Aplikujeme jako všechno v kubernetu:

Že nás cluster pochopil zkontrolujeme příkazem:

a odpověď:

Naše service tam jsou, a ještě něco navíc. To můžeme ignorovat. Všimněte si, že každá service dostala svoje IP. To je ale pořád interní v rámci clusteru. Ale hlavně platí, že v rámci clusteru existují DNS záznamy db a app, které mají tyto IP přiřazené. Můžeme to zkusit takto:

Tento příkaz nám otevřel příkazovou řádku (bash) přímo v podu naší aplikace. Tam můžeme pustit

A uvidíme něco jako:

Pod s databází sice neodpovídá na ping, ale vidíme, že ping ho našel – db má DNS záznam db.default.svc.cluster.local a IP 10.43.167.94.

Nastavení aplikace

Upravíme manifest app-deployment.yaml, přidáme k němu část s proměnnými pro připojení do db. Víme totiž, že naše aplikace používá proměnné PGUSER, PGPASSWORD a PGHOST.

A znovu aplikujeme – Kubernetes si všimne, že znovu aplikujeme manifest pro deployment s name: app a pochopí, že je to změna manifestu, ne jeho vytvoření.

A jdeme se rovnou podívat, co to udělalo s naší aplikací. Zobrazíme si pody:

A uděláme tunel do app podu (jméno podu se změnilo, protože po změně deploymentu kubernetes nahradil starý pod novým):

A v prohlížeči uvidíme:

Naše aplikace běží a je připojená do databáze.

Co dál

Udělali jsme naše první nasazení aplikace du Kubernetu. Hurá! Ale k dokonalosti (i k použitelnosti) ještě ledacos chybí.

  • pořád potřebujeme udělat tunel, abychom se k aplikaci vůbec dostali (zkuste hledat ingress nebo loadbalancer service)
  • hesla a konfiguraci máme hard kódovanou přímo v manifestech (mrkněte na configmaps a secrets)
  • data v databázi jsou součástí našeho image a žádné změny v db nezůstanou po restartu (volumes a persistent volume claims)

Zjevně nám toho chybí ještě hodně dořešit, ale to už nechám na vás. Snad vám tyto první krůčky pomůžou začít se seznamovat s dalšími možnostmi Kubernetu.

 

Další články

Zobrazit všechno