Kihagyás

Alkalmazás telepítése Kubernetes klaszterbe

Cél

A labor célja egy alkalmazás telepítése Kubernetes klaszterbe, valamint a frissítés módjának megismerése. A telepítéshez és frissítéshez részben Helm chartot, részben magunk által elkészített yaml erőforrás leírókat használunk.

Előkövetelmények

  • Kubernetes
    • Bármely felhő platform által biztosított klaszter
    • Linux platformon: minikube
    • Windows platformon: Docker Desktop
  • kubectl
    • A binárisa legyen elérhető PATH-on.
  • helm v3
    • A binárisa legyen elérhető PATH-on.
  • Kubernetes dashboard
    • Telepítése és használata korábbi anyag szerint.
  • Telepítendő alkalmazás

Feladatok

Célok, tervezés

A célunk a todo-kat kezelő konténeralapú mikroszolgáltatásokra épülő webalkalmazás telepítése Kubernetes-be. A rendszerünk alapvetően három féle komponensből épül fel:

  • az általunk megvalósított mikroszolgáltatások (backend és frontend),
  • az adatbázis rendszerek (MongoDB, Elasticsearch és Redis),
  • valamint az api gateway.

Célunk nem csak az egyszeri telepítés, hanem az alkalmazás naprakészen tartásához a folyamatos frissítés lehetőségének megteremtése. A fenti komponensek azonban nem ugyanolyan frissítési ciklussal rendelkeznek: a saját komponenseink gyakran fognak változni, míg az adatbázisok és az api gateway ritkán frissül. A telepítést ennek megfelelően ketté vágjuk:

  1. Az api gateway-t és az adatbázisokat egyszer telepítjük.
  2. Az alkalmazásunk saját komponenseihez yaml alapú leírókat készítünk, amit kubectl apply segítségével fogunk telepíteni.

Helm

Ellenőrizzük, hogy a helm CLI elérhető-e: helm version

Helm 3

A feladat során a Helm 3-as verzióját fogjuk használni. A korábbi verziója koncepcióban azonos, de működésében eltérő.

Ingress Controller (api gateway) telepítése Helm charttal

A Traefik-et Helm charttal fogjuk telepíteni, mert a Traefik helyes működéséhez a Traefik konténer (Deployment) mellett egyéb elemekre is szükség lesz (klaszteren belüli hozzáférés szabályzás miatt).

Chart-ok ellenőrzése

A Helm chartok nagy része harmadik féltől származik, így a klaszterünbe való telepítés előtt a tartalmukat érdemes alaposan megnézni.

  1. A Helm is repository-kkal dolgozik, ahonnan a chart-okat letölti. Ezeket regisztrálni kell. Regisztráljuk a Traefik hivatalos chart-ját tartalmazó repository-t, majd frissítsük az elérhető char-okat:

    helm repo add traefik https://containous.github.io/traefik-helm-chart
    helm repo update
    
  2. Telepítsük:

    helm install traefik traefik/traefik --set ports.web.nodePort=32080 --set service.type=NodePort --version 10.19.4`
    
    • A legelső traefik a Helm release nevét adja meg. Ezzel tudunk rá hivatkozni a jövőben.
    • A traefik/traefik azonosítha a telepítendő chartot (repository/chartnév).
    • A --set kapcsolóval a chart változóit állítjuk be.
    • A --verzió a Helm chart verzióját adja meg.

    Publikus eléréshez

    A Traefik jelen konfigurációban NodePort service típussal van konfigurálva, ami azt jelenti, lokálisan, helyben a megadott porton lesz csak elérhető. Ha publikusan elérhető klaszterben dolgozunk, akkor tipikusan LoadBalancer service típust fogunk kérni, hogy publikus IP címet is kapjon a Traefik.

  3. Ellenőrizzük, hogy fut-e: kubectl get pod

    • Látunk kell egy traefik kezdetű podot.
  4. A Traefik dashboard-ja nem elérhető "kívülről". A dashboard segít minket látni a Traefik konfigurációját és működését. Mivel ez a klaszter belső állapotát publikálja, production üzemben valamilyen módon authentikálnunk kellene. Ezt most megkerülve kubectl segítségével egy helyi portra továbbítjuk a Traefik dashboard-ot. A következő parancsot egy új konzolban adjuk ki, és utána hagyjuk nyitva a konzolt:

    kubectl port-forward $(kubectl get pods --selector "app.kubernetes.io/name=traefik" --output=name) 9000:9000
    
  5. Nézzük meg a Traefik dashboardot: http://localhost:9000/dashboard/ (a végén kell a perjel!)

Ha frissíteni szeretnénk később a Traefik-et, akkor azt a helm upgrade traefik traefik/traefik ... paranccsal tudjuk megtenni.

Adatbázisok telepítése

Az adatbázisainkat saját magunk által megírt yaml leíróval telepítjük. Ez a leíró fájl már rendelkezésünkre áll a todoapp alkalmazás repositoryjában.

  1. Navigáljunk el a forráskód repository-jában a kubernetes/db könyvtárba. Nézzük meg a yaml leírókat.
  2. Telepítsük az adatbázisokat: kubectl apply -f db
  3. Kapcsolódjunk a Kubernetes Dashboard-hoz a korábban ismertetett módon (ill. telepítsük a klaszterbe, ha nem lenne).
  4. Ellenőrizzük, hogy az adatbázis podok elindulnak-e. Minden a default névtérbe kellett települjön.
  5. Nézzük meg a Persistent Volume és Persistent Volume Claim-eket.

Alkalmazásunk telepítése

Az alkalmazásunk telepítéséhez szintén yaml leírókat találunk a kubernetes/app könyvtárban.

  1. Nézzük meg a leírókat. Az előbb látott Deployment és Service mellet Ingress-t is látni fogunk.

  2. Telepítsük az adatbázisokat: kubectl apply -f app

  3. Kubernetes dashboard segítségével nézzük meg, hogy létrejöttek a Deployment-ek podok, stb. Viszont vegyük észre, hogy piros lesz még pár dolog. A hiba oka, hogy a hivatkozott image-eket nem találja a rendszer.

  4. Navigáljunk el az src/Docker könyvtárba, és buildeljük le az alkalmazást docker-compose segítségével úgy, hogy a megfelelő taggel ellátjuk az image-eket. Ehhez a compose fájlunk az IMAGE_TAG környezeti változó beállítását várja.

    • Powershell-ben

      $env:IMAGE_TAG="v1"
      docker-compose build
      
    • Windows Command Prompt-ban

      setx IMAGE_TAG "v1"
      docker-compose build
      
  5. A build folyamat végén előállnak helyben az image-ek, pl. todoapp/web:v1 taggel. Ha távoli registry-be szeretnénk feltölteni őket, akkor taggelhetnénk őket a registry-nek megfelelően. A helyi fejlesztéshez nincs szükségünk ehhez, mert a helyben elindított Kubernetes "látja" a Docker helyi image-eit.

  6. Menjünk vissza a Kubernetes dashboard-ra. Egy kicsit várjunk, és azt kell lássuk, hogy az eddig piros elemek kizöldülnek. A Kubernetes folyamatosan törekszik az elvárt állapot elérésére, ezért a nem elérhető image-einket újra és újra megpróbálta elérni, míg nem sikerült.

  7. Próbáljuk ki az alkalmazást a http://localhost:32080 címen

Alkalmazás frissítése

Tegyük fel, hogy az alkalmazásunkból újabb verzió készül, és szeretnénk frissíteni. A fentebb használt yaml leírókat azért (is) a verziókezelőben tároljuk, mert így a telepítési "útmutatók" is verziózottak. Tehát nincs más dolgunk, mit a konténer image-ek elkészítése után a Deployment-ekben a megfelelő tag-ek lecserélése, és a kubectl apply paranccsal a telepítés frissítése.

Helm chart készítése

Az alkalmazás fent ismertetett frissítéséhez a yaml fájlokba minden alkalommal bele kell írnunk. Jó lenne, ha az image tag-et mint egy változó tudnánk atelepítés során átadni. Erre szolgál a Helm. Készítsünk egy chart-ot a szolgáltatásainknak. A chart a telepítés leíró neve, ami gyakorlatilag yaml fájlok gyűjteménye egy speciális szintaktikával kiegészítva.

  1. Konzolban navigáljunk egy el tetszőleges munkakönyvtárba.

  2. Készítsünk egy új, üres chart-ot: helm create todoapp. Ez létrehoz egy todoapp nevű chartot egy azonos nevű könyvtárban.

  3. Nézzük meg a chart fájljait.

    • Chart.yaml a metaadatokat írja le.
    • values.yaml írja le a változóink alapértelmezett értékeit.
    • .helmignore azon fájlokat listázza, amelyeket a chart értelmezésekor nem kell figyelembe venni.
    • templates könyvtárban vannak a template fájlok, amik a generálás alapjául szolgálnak.

    A Helm egy olyan template nyelvet használ, amelyben változó behelyettesítések, ciklusok, egyszerű szövegműveletek támogatottak. Mi most csak a változó behelyettesítést fogjuk használni.

  4. Töröljük ki a templates könyvtárból az összes fájlt a _helpers.tpl kivételével. Másoljuk helyette be ide a korábban a telepítéshez használt yaml fájljainkat (3 darab).

  5. Szerkesszük meg a todos.yaml fájl tartalmát. Leegyszerűsítve az alábbiakra lesz szükség:

    • Ha Visual Studio Code-ot használunk, akkor telepítsük a ms-kubernetes-tools.vscode-kubernetes-tools extension-t. Így kapunk némi segítséget a szintaktikával.

    • Mindenhol, ahol labels vagy matchLabels szerepel, még egy sort fel kell vennünk:

      app.kubernetes.io/instance: {{ .Release.Name }}

      Ez egy implicit változót helyettesít be: a release nevét. Ezzel azonosítja a Helm a telepítés és frissítés során, hogy mely elemeket kell frissítenie, melyek tartoznak a fennhatósága alá.

    • A pod-ban az image beállításához használjunk változót:

      image: todoapp/todos: {{ .Values.todos.tag }}

  6. Definiáljuk az előbbi változó alapértelmezett értékét. A values.yaml fájlban (egy könyvtárral feljebb) töröljünk ki mindent, és vegyük fel ezt a kulcsot:

    todos:
      tag: v1
    
  7. A másik két komponens yaml leíróival is hasonlóan kell eljárnunk.

  8. A továbbiakhoz el kell távolítanunk az előbb telepített alkalmazásunkat, mert összeakadna a Helm-mel. Ezt a parancsot a telepítéshez korábban használt app könyvtárban adjuk ki: kubectl delete -f app

  9. Nézzük meg a template-eket kiértékelve.

    • A chartunk könyvtárából lépjünk eggyel feljebb, hogy a todoapp chart könyvtár az aktuális könyvtárban legyen.
    • Futtassuk le csak a template generálást a telepítés nélkül: helm install todoapp --debug --dry-run todoapp
    • Konzolra megkapjuk a kiértékelt yaml-öket.
  10. Telepítsük újra az alkalmazást a chart segítségével: helm upgrade todoapp --install todoapp

    • A release-nek todoapp nevet választottunk. Ez a Helm release azonosítója.

    • Az upgrade parancs és az --install kapcsoló telepít, ha nem létezik, ill. frissít, ha már létezik ilyen telepítés.

  11. Nézzük meg, hogy a Helm szerint létezik-e a release: helm list

  12. Próbáljuk ki az alkalmazást a http://localhost:32080 címen.

  13. Ezen chart segítségével a Docker image tag-et telepítési paraméterben adhatjuk át, pl. ha a "v2" az új tag, akkor egy paranccsal tudjuk frissíteni: helm upgrade todoapp --install todoapp --set todos.tag=v2

Back to top