[HUN] Kubernetes - Spring livereload 1. rész — Egyszerű példa
Manapság egyre elterjedtebb a Kubernetes konténer manager használata az alkalmazások futtatásához, hisz nagyban megkönnyíti a szoftver telepítését és üzemeltetését, illetve rengeteg egyéb szolgáltatást nyújt.
Ebben a bejegyzés sorozatban megvizsgáljuk, hogy tudunk könnyen használható fejlesztői környezetet kialakítani, ahol az alkalmazás automatikusan telepítésre kerül bármely kódváltozás hatására.
Amire szükségünk lesz:
- Alapvető Kubernetes ismeretek
- Java JDK
- IntelliJ vagy egyéb IDE
- Kubectl v1.21.1+
- Skaffold
- Docker Desktop engedélyezett Kubernetessel (vagy bármilyen -lokális- K8s)
Első lépésként egy egyszerű applikációt hozunk létre Spring segítségével, mellyel REST interface-n keresztül kommunikálhatunk.
Az IntelliJ Pro beépített Spring Initializr segítségével ezt könnyedén megtehetjük. Amennyiben valaki community editiont vagy más IDE-t használ, a Spring Start weboldalon létrehozhatja a projectet, melyet letöltés után kicsomagolva importálhat.
Függőségek közül kiválasztjuk a Spring Web-et, majd készítünk egy model-t és egy controller-t, amin keresztül lekérdezhetjük a felhasználók listáját.
Ezt követően az alkalmazást elindítva a http://localhost:8080/api/v1/users url-en tesztelhetjük a létrehozott végpontot.
Ahhoz hogy az alkalmazásunkat K8s-ben futtathassuk, először konténerizálnunk kell. Ehhez a Google által fejlesztett Jib-et hívjuk segítségül.
A build.gradle fájlba felvesszük a jib plugint és felparaméterezzük. Image alapnak az OpenJDK 17-es verzióját használjuk. Az általunk készített image nevét tetszőlegesen megválaszthatjuk. Beállítjuk a main osztály nevét, a használt portokat valamint felvesszük az 5005-ös portot remote debug használatához (erről később).
Miután elkészültünk, a gradle jibDockerBuild parancsot futtatva elkészíthetjük a konténerizált alkalmazást.
Amennyiben tesztelni szeretnénk, a következő paranccsal futtathatjuk docker konténerként a helyi 8080-as portra továbbítva az alkalmazás portját:
docker run -d -p 8080:8080 --name kubespring zalerix/kubernetes-spring-example
Ezután elkészítjük a deployment.yaml és skaffold.yaml fájlokat a project főkönyvtárában, melyek az alkalmazás K8s telepítésének leírói. Létrehozhatjuk kézzel vagy a következő parancs futtatásával:
skaffold init --generate-manifests
Generálás esetén a 8080-as portot állítsuk be port forwardingra. Így egy nem túl szép, de használható leírót kapunk. Bármely módon készült is, a leírókat személyre szabjuk.
Létrehozunk egy K8s Deployment erőforrást, mely a konténerünket telepíti, valamint definiálunk egy NodePort-ot hozzá, mely a 8080-as portot elérhetővé teszi a 30 000-es porton a külvilág felé. A NodePort-ot tesztelésre használjuk, a későbbiekben, több példány futtatásához Ingress-t fogunk beállítani.
A skaffold fájlban beállítjuk, hogy változás esetén jib buildet használva építse újra a konténert a megadott időbélyeg ellátva, majd kubectl segítségével telepítse újra és forwardolja a 8080-as portot.
Ezután a következő paranccsal elindíthatjuk az alkalmazás K8s-en:
skaffold dev --port-forward
Az alkalmazás a 8080 és a 30 000-es porton is elérhető. Teszteléshez futás közben írjuk át az egyik nevet a controller metódusában. Ekkor a skaffold újratelepíti az alkalmazást, így a következő lekérdezésnél már az új értéket kapjuk vissza.
A forráskód elérhető itt.