Naučíte sa:

  • Komunikovať s klastrom.
  • Vytvoriť a zrušiť jednoduchú aplikáciu.
  • Zistiť stav klastra a stav aplikácie.
  • Zverejniť port aplikácie pomocou služby.

Vytvorte si pracovné prostredie

Ak máte Docker Desktop, inštalácia je jednoduchá.

Kubernetes bežiaci na pozadí môže spomaľovať Váš počítač

S klastrom budete komunikovať pomocou príkazu kubectl. Kubectl používa sieťový protokol pre komunikáciu s aplikačným rozhraním zvoleného Kubernetes klastra, preto musí mať prihlasovacie údaje pre ovládanie klastra.

Najprv vyskúšajte, či klient funguje v poriadku a či má spojenie s klastrom. S ktorým klastrom komunikujem?

kubectl cluster-info

Nasadenie aplikácie pomocu objektu Deployment

Na začiatok si skúsime nasadenie jednoduchej aplikácie, ktorá bude vedieť opakovať prijaté požiadavky. Aplikácia bude vo svojom kontajneri bežať na určitom porte a odpovedať na požiadavky protokolom HTTP.

O úlohy súvisiace s behom aplikácie sa bude starať Kubernetes klaster. Aplikácia sa bude vedieť podľa potreby škálovať a reštartovať na ľubovoľnom uzle.

O beh aplikácie sa starajú špeciálne Kubernetes objekty. Vyjadrujú požadovaný a aktuálny stav aplikácie. Objekty vytvárame priamo pomocou klienta kubectl alebo pomocou konfiguračných súborov vo formáte YAML.

Počas nasadenia prvej aplikácie vznikne Kubernetes objekt typu Deployment ktorý sa stará o beh aplikácie. Objekt typu Deployment sa bude volať hello-kube.

Viac o objekte Deployment v tutoriáli.

Prvú Kubernetes aplikáciu si vytvoríme príkazom:

kubectl create deployment hello-kube --image=k8s.gcr.io/echoserver:1.10

Zisťovanie stavu klastra

Stav objektov v klastri sa v čase mení. Systém priradí vhodný uzol, pokúsi za získať obraz kontajnera a vytvoriť nový proces podľa našich požiadaviek.

O priebehu nasadenia sa viac dozvieme pomocou príkazu describe:

kubectl describe deployment/hello-kube

Ak bolo nasadenie úspešné, vieme si pozrieť výpisy zo štartu kontajnera pomocou príkazu logs:

kubectl logs deployment/hello-kube

Overte si nový stav klastra a pozrite si objekty ktoré vznikli:

kubectl get all

Malo by sa zobraziť niečo takéto:

NAME                              READY   STATUS    RESTARTS   AGE
pod/hello-kube-5d764c75f7-ffv6l   1/1     Running   0          11m

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   3d16h

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/hello-kube   1/1     1            1           11m

NAME                                    DESIRED   CURRENT   READY   AGE
replicaset.apps/hello-kube-5d764c75f7   1         1         1       11m

Uvidíte, že okrem hello-kube vznikne aj niekoľko ďalších objektov. Každý objekt má svoje meno a svoj druh.

POD

Základnou jednotkou klaudovej aplikácie v systéme Kubernetes je objekt typu Pod. Jeden Pod je tvorený viacerými kontajnermi a zväzkami. Je zaručené, že jeden Pod bude bežať na maximálne jednom uzle. Vďaka tomu môžu jeho kontajnery navzájom ľahko komunikovať pomocou lokálnych portov a zdieľaných zväzkov.

Pozriem si konkrétny druh objektov v klastri:

kubectl get pods

Podľa mena sa môžme o pode niečo dozvedieť:

kubectl describe pods/<pod_name>

nám zobrazí aktuálny stav podu v klastri.

Riešenie problémov

Príkazy describe a logs vieme použiť na všetky objekty pri hľadaní a riešení problémov v prípade že klaster nie je v želanom stave.

Chybové hlásenia podu si zobrazíme pomocou:

kubectl logs pods/<pod_name>

Do bežiaceho podu sa pripojíte pomocou tohto návodu.

Okrem podu sa vytvorí ReplicaSet, ktorá dáva pozor na jeden alebo viacero podov. Pomocou objektu typu ReplicaSet vieme aplikáciu škálovať - za behu pridávať alebo odoberať záťaž vo forme podov.

V našom príklade sa o vytvorenie ReplicaSet-u a Pod-u postaral objekt typu Deployment.

Deployment dáva pozor na pody a ReplicaSet-y. Jeho úlohou je zabezpečiť, aby hladko fungovali zmeny verzií podov bez toho aby nastalo prerušenie behu aplikácie.

Ak nová verzia podov nebude fungovať, odmietne update a beh bude pokračovať so starou verziou.

Zrušenie Kubernetes objektov

Ak objekt už nepotrebujeme, je potrebné ho odstrániť aby zbytočne nezaberal systémové zdroje.

Obstránenie objektu sa vykonáva pomocou príkazu:

kubectl delete <druh objektu>/<meno objektu>

Vyskúšajte zmazať vyvorený Pod a overte si nový stav klastra:

kubectl delete pod/<meno podu>
kubectl get all

Podobne vyskúšajte zmazať vytvorený ReplicaSet.

  • Ak zmažeme POD, ReplicaSet sa postará o spustenie ďalšieho
  • Ak zmažeme ReplicaSet, Deployment sa postarrá o znovuspustenie
  • Pri rušení objektov by sme mali postupovať v opačnom poradí.
  • Ak zmažeme Deployment, Kubernetes sa postará o zrušenie ReplicaSet a Podov.

Služby - objekt Service

Na to aby bola aplikácia použiteľná musíme určiť spôsob prístupu k nej. Kontajnery v rámci jedného podu spolu vedia ľahko komunikovať pomocou lokálnych portov, ale inak sú uzavreté pred vonkajším prístupom.

Proces vytvorenia služby je podobný zaregistrovaniu DNS mena pre Váš server. Vznikne DNS záznam platný v rámci klastra ktorý môžeme využiť na vytvorenie spojenia medzi viacerými PODmi.

O vykonanie funkcionality služby sa stará skupina Podov ktoré môžu bežať na ktoromkoľvek uzle klastra. Kubernetes sa postará o to, aby na požiadavku odpovedal jeden z nich.

Ak je podov viac, pody musíme navrhnúť tak, aby boli ľubovoľne zameniteľné - je jedno ktorý pod na požiadavku odpovedá. To je dosiahneme tak, že oddelíme dáta od aplikácie. Ak máme dáta na jednom mieste, napr. v databáze, potom je jedno na ktorom mieste sa vykoná spracovanie.

Musíme povedať akým spôsobom a pod akým menom budeme pristupovať k službe, ktorú pod poskytuje. Na to slúži objekt typu Service.

Vytvorenie objektu Service zverejnení službu pre iné pody alebo pre verejnosť mimo klastra.

       +----------+
       | Service  |
       | DNS name |
       +----------+
       ^      ^   ^
      /       |    \
     /        |     \
    |         |      |
+-------+ +-------+ +-------+
| Pod 1 | | Pod 2 | | Pod 3 |
+-------+ +-------+ +-------+

Vytvorí sa symbolické DNS meno pod ktorým je prístupná služba.

Dôležité druhy služieb:

  • ClusterIP: dostupná v rámci klastra.
  • NodePort: dostupná z vonku na každom uzle.
  • LoadBalancer: dostupná pomocou nástrojov poskytovateľa.

Službu s menom hello-kube typu NodePort vytvoríme príkazom:

kubectl expose deployment hello-kube --type=NodePort --port=8080

Overte si nový stav Vášho klastra pomocou príkazového riadka:

kubectl get all

Môžeme sa aj pozrieť bližšie len na služby:

kubectl get services

Zobrazí sa nám zoznam služieb. Vieme z neho vyčítať, na ktorom porte bude služba zverenená.

Dostaneme niečo takéto:

hello-kube   NodePort    10.111.243.205   <none>        8080:32453/TCP   5s
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP          4d22h

Číslo verejného portu je za dvojbodkou. NodePort znamená, že služba beží na každom pracovnom uzle nášho klastra. V tomto prípade je číslo verejného portu automaticky vygenerované a vo Vašom prípade môže byť iné. Verejný port sa dá nastaviť aj podľa našich požiadaviek.

Vieme si ho vyskúšať pomocou webového prehliadača alebo pomocou príkazu curl:

curl -X GET http://localhost:32453

Na obrazovke by sa mala zobraziť odpoveď echoservra na našu požiadavku.

Textovo-grafické rozhranie

Ak na klastri beží viac aplikácií, oceníte konzolový nástroj pre zisťovanie stavu klastra s názvom k9s:

Nainštalujete si ho jednoducho:

wget https://github.com/derailed/k9s/releases/download/v0.32.3/k9s_Linux_amd64.tar.gz    
tar zxf k9s_Linux_x86_64.tar.gz
sudo mv k9s /usr/local/bin

Previous Post Next Post

Prvé kroky so systémom Kubernetes