ProHoster > Blog > Adminisztráció > Kubernetes tippek és trükkök: a helyi fejlesztésről és a Telepresence-ről
Kubernetes tippek és trükkök: a helyi fejlesztésről és a Telepresence-ről
Egyre gyakrabban kérdeznek bennünket a Kubernetes mikroszolgáltatásainak fejlesztéséről. A fejlesztők, különösen az értelmezett nyelvek esetében, gyorsan szeretnék kijavítani a kódot kedvenc IDE-jükben, és látni akarják az eredményt anélkül, hogy megvárnák a felépítést/telepítést – egyszerűen az F5 megnyomásával. Ha pedig monolitikus alkalmazásról volt szó, akkor elég volt helyben telepíteni egy adatbázist és egy webszervert (Dockerben, VirtualBoxban...), és utána azonnal élvezni a fejlesztést. A monolitok mikroszolgáltatásokba vágásával és a Kubernetes megjelenésével, az egymástól való függőség megjelenésével minden kicsit nehezebb lett. Minél több ilyen mikroszolgáltatás, annál több probléma. Ahhoz, hogy újra élvezhessük a fejlesztést, egy-két Docker-konténernél többet kell felemelni, sőt néha egy tucatnál is többet... Általánosságban elmondható, hogy mindez elég sok időt vehet igénybe, hiszen ezt is naprakészen kell tartani .
Különböző időpontokban különböző megoldásokat próbáltunk a problémára. És kezdem a felhalmozott kerülő megoldásokkal vagy egyszerűen csak „mankókkal”.
1. Mankók
A legtöbb IDE képes közvetlenül a kiszolgálón szerkeszteni a kódot FTP/SFTP használatával. Ez az út nagyon kézenfekvő, és azonnal úgy döntöttünk, hogy használjuk. Lényege a következőkben rejlik:
A fejlesztői környezetek podjában (dev/review) egy további konténer indul SSH-hozzáféréssel, és továbbítja az alkalmazást véglegesítő/telepítő fejlesztő nyilvános SSH-kulcsát.
A kezdeti szakaszban (a tartályon belül prepare-app) vigye át a kódot ide emptyDirhogy hozzáférjen a kódhoz az alkalmazástárolókból és az SSH-kiszolgálóról.
Egy ilyen séma technikai megvalósításának jobb megértése érdekében a Kubernetes érintett YAML-konfigurációinak töredékeit közlöm.
Konfigurációk
1.1. értékek.yaml
ssh_pub_key:
vasya.pupkin: <ssh public key in base64>
Itt vasya.pupkin a változó értéke ${GITLAB_USER_LOGIN}.
Voila: a telepítést elindító fejlesztő szolgáltatásnév alapján csatlakozhat (hogyan biztosítson biztonságos hozzáférést a fürthöz, már elmondtuk).
Ez egy teljesen működő megoldás, de megvalósítási szempontból nyilvánvaló hátrányai vannak:
a Helm-diagram finomításának szükségessége, ami megnehezíti az olvasást a jövőben;
csak a szolgáltatást telepítő személy használhatja;
emlékeznie kell arra, hogy szinkronizálja a helyi könyvtárral a kóddal, és véglegesítse a Gitben.
2. Telejelenlét
Terv TelePresence elég régóta ismert, de mi, ahogy mondani szokás, „nem jutottunk el addig, hogy a gyakorlatban komolyan kipróbáljuk”. A kereslet azonban megtette a dolgát, és most örömmel osztjuk meg tapasztalatainkat, amelyek hasznosak lehetnek blogunk olvasói számára - főleg, hogy a Telepresence-ről más anyagok még nem jelentek meg a hubon.
Röviden, minden kiderült, nem olyan ijesztő. Minden olyan műveletet, amely végrehajtást igényel a fejlesztő részéről, egy Helm chart szövegfájlba helyeztük el NOTES.txt. Így a szolgáltatás Kubernetesben történő üzembe helyezése után a fejlesztő a GitLab munkanaplójában látja a helyi fejlesztői környezet elindítására vonatkozó utasításokat:
!!! Разработка сервиса локально, в составе Kubernetes !!!
* Настройка окружения
* * Должен быть доступ до кластера через VPN
* * На локальном ПК установлен kubectl ( https://kubernetes.io/docs/tasks/tools/install-kubectl/ )
* * Получить config-файл для kubectl (скопировать в ~/.kube/config)
* * На локальном ПК установлен telepresence ( https://www.telepresence.io/reference/install )
* * Должен быть установлен Docker
* * Необходим доступ уровня reporter или выше к репозиторию https://gitlab.site.com/group/app
* * Необходимо залогинится в registry с логином/паролем от GitLab (делается один раз):
#########################################################################
docker login registry.site.com
#########################################################################
* Запуск окружения
#########################################################################
telepresence --namespace {{ .Values.global.env }} --swap-deployment {{ .Chart.Name }}:backend --mount=/tmp/app --docker-run -v `pwd`:/app -v /tmp/app/var/run/secrets:/var/run/secrets -ti registry.site.com/group/app/backend:v8
#########################################################################
Az ebben az utasításban leírt lépésekkel nem foglalkozunk részletesen... az utolsó kivételével. Mi történik a Telepresence indulásakor?
Munka a Telepresence szolgáltatással
Indításkor (a fenti utasításokban megadott utolsó paranccsal) beállítjuk:
névtér, amelyben a mikroszolgáltatás fut;
annak a telepítésnek és a tárolónak a neve, amelyen át akarunk hatolni.
A többi argumentum opcionális. Ha szolgáltatásunk együttműködik a Kubernetes API-val és a Kubernetes API számára ServiceAccount létrehozva, tanúsítványokat/tokeneket kell csatolnunk az asztalunkra. Ehhez használja a lehetőséget --mount=true (vagy --mount=/dst_path), amely a Kubernetes-tároló gyökérjét (/) csatolja az asztalunkra. Ezt követően (az operációs rendszertől és az alkalmazás indítási módjától függően) használhatjuk a klaszter „kulcsait”.
Először nézzük meg az alkalmazás futtatásának leguniverzálisabb lehetőségét - Docker-tárolóban. Ehhez a kulcsot fogjuk használni --docker-run és csatolja a kódot tartalmazó könyvtárat a tárolóba: -v `pwd`:/app
Kérjük, vegye figyelembe, hogy ez azt feltételezi, hogy a projektkönyvtárból fut. Az alkalmazás kódja be lesz csatolva a könyvtárba /app konténerben.
Következő: -v /tmp/app/var/run/secrets:/var/run/secrets — a tanúsítvánnyal/tokennel ellátott könyvtár beillesztése egy tárolóba.
Ezt az opciót végül az a kép követi, amelyben az alkalmazás futni fog. NB: Kép készítésekor meg kell adni CMD vagy ENTRYPOINT!
Pontosan mi lesz ezután?
A Kubernetesben a megadott telepítéshez a replikák száma 0-ra módosul. Ehelyett egy új telepítés indul – egy helyettesítő tárolóval. backend.
2 konténer fog elindulni az asztalon: az első Telepresence-szel (proxy kéréseket küld a Kubernetesről/Kubernetes felé), a második a fejlesztés alatt álló alkalmazással.
Ha az alkalmazással együtt végrehajtjuk a konténerbe, akkor a Helm által a telepítés során átvitt összes ENV változó elérhető lesz számunkra, és az összes szolgáltatás is elérhető lesz. Nincs más hátra, mint szerkeszteni a kódot kedvenc IDE-jében, és élvezni az eredményt.
A munka végén csak be kell zárnia a terminált, amelyben a Telepresence fut (a munkamenetet a Ctrl + C billentyűkombinációval fejezze be) - A Docker-tárolók leállnak az asztalon, és a Kubernetesben minden visszatér a kezdeti állapotába. Már csak a kötelezettségvállalás, az MR kiadása és átadása az áttekintéshez/egyesítéshez/… (a munkafolyamatoktól függően).
Ha nem Docker konténerben szeretnénk futtatni az alkalmazást – például nem PHP-ben, hanem Go-ban fejlesztünk, és mégis helyben építjük – a Telepresence elindítása még egyszerűbb lesz:
Ha az alkalmazás hozzáfér a Kubernetes API-hoz, fel kell csatolnia a kulcsok könyvtárát (https://www.telepresence.io/howto/volumes). Van egy segédprogram Linuxhoz gyökér:
A Telepresence opció nélküli elindítása után --docker-run minden környezeti változó elérhető lesz az aktuális terminálon, ezért az alkalmazást abban kell elindítani.
NB: Például PHP használatakor ne felejtse el letiltani a különféle op_cache, apc és egyéb gyorsítókat a fejlesztéshez - különben a kód szerkesztése nem vezet a kívánt eredményhez.
Eredményei
A Kubernetes helyi fejlesztése olyan probléma, amelynek megoldása ennek a platformnak a terjedésével arányosan növekszik. A fejlesztőktől (ügyfeleinktől) érkező releváns kéréseket az első elérhető eszközökkel kezdtük megoldani, amelyek azonban hosszú távon nem bizonyultak. Szerencsére ez nem csak most és nem csak nekünk vált nyilvánvalóvá, így már megjelentek a világban erre alkalmasabb eszközök, amelyek közül a Telepresence a leghíresebb (egyébként van kerítés a Google-tól). Használati tapasztalataink még nem túl nagyok, de máris okot adunk arra, hogy „bolti kollégáinknak” ajánljuk – próbáljátok ki!