Nástroje pre vývojárov aplikácií bežiacich v Kubernetes

Nástroje pre vývojárov aplikácií bežiacich v Kubernetes

Súčasný prístup k prevádzke rieši množstvo naliehavých problémov podnikania. Kontajnery a orchestrátory umožňujú jednoduché škálovanie projektov akejkoľvek zložitosti, zjednodušujú vydávanie nových verzií, robia ich spoľahlivejšími, ale zároveň vytvárajú aj ďalšie problémy pre vývojárov. Programátora najmä zaujíma jeho kód: architektúra, kvalita, výkon, elegancia — a nie to, ako sa dostane do Kubernetes alebo ako ho testovať a ladenie po zavedení aj minimálnych zmien. Preto nie je prekvapujúce, že sa aktívne vyvíjajú nástroje pre Kubernetes, ktoré pomáhajú riešiť problémy aj tých naj„archaickejších“ vývojárov a umožňujú im zamerať sa na to hlavné.

V tejto recenzii je uvedená stručná informácia o niektorých nástrojoch, ktoré zjednodušujú život programátorovi, jehož kód beží v podoch Kubernetes klastra.

Jednoduchí pomocníci

Kubectl-debug

  • Podstata: pridajte svoj kontajner do Pod a sledujte, čo sa v ňom deje.
  • GitHub.
  • Stručná štatistika GH: 715 hviezd, 54 commitov, 9 prispievateľov.
  • Jazyk: Go.
  • Licencia: Apache License 2.0.

Tento plugin pre kubectl umožňuje vytvoriť vo vnútri zaujímavého podu dodatočný kontajner, ktorý bude zdieľať namespace procesov s ostatnými kontajnermi. V ňom môžete vykonávať ladenie práce podu: skontrolovať sieť, počúvať sieťovú prevádzku, vykonať strace na zaujímavom procese a podobne.

Tiež môžete prepnúť do kontajnera procesu pomocou chroot /proc/PID/root — to býva veľmi praktické, keď potrebujete získať root shell v kontajneri, pre ktorý je v manifeste nastavené securityContext.runAs.

Nástroj je jednoduchý a efektívny, takže sa môže hodiť každému vývojárovi. Viac o ňom sme písali v samostatnom článku.

Telepresence

  • Podstata: presuň aplikáciu na svoj počítač. Vyvíjaj a ladí lokálne.
  • Webová stránka; GitHub.
  • Stručná štatistika GH: 2131 hviezda, 2712 commitov, 33 prispievateľov.
  • Jazyk: Python.
  • Licencia: Apache License 2.0.

Myšlienka tejto súčasti spočíva v spustení kontajnera s aplikáciou na lokálnom počítači používateľa a proxy celého prenosu z klastra do neho a späť. Tento prístup umožňuje lokalnú vývojovú činnosť prostredníctvom jednoduchých zmien súborov v obľúbenej IDE: výsledky budú dostupné okamžite.

Výhody lokálneho spustenia — pohodlné úpravy a okamžitý výsledok, možnosť ladit aplikáciu obvyklým spôsobom. Nevýhody — náročnosť na rýchlosť pripojenia, čo je obzvlášť viditeľné pri práci s aplikáciou s relatívne vysokým RPS a prevádzka. Okrem toho, Telepresence má problémy s volume mounts vo Windows, čo môže byť rozhodujúcim obmedzením pre vývojárov zvyknutých na tento operačný systém.

Už sme sa podelili o naše skúsenosti s používaním Telepresence tu.

Ksync

  • Podstata: takmer okamžitá synchronizácia kódu s kontajnerom v klastri.
  • GitHub.
  • Krátka štatistika GH: 555 hviezd, 362 commitov, 11 prispievateľov.
  • Jazyk: Go.
  • Licencia: Apache License 2.0.

Nástroj umožňuje synchronizovať obsah lokálneho adresára s adresárom kontajnera, ktorý beží v klastri. Takýto nástroj je ideálny pre vývojárov v skriptovacích programovacích jazykoch, ktorých hlavný problém spočíva v tom, ako dostaviť kód do fungujúceho kontajnera. Ksync má za cieľ odstrániť túto bolesť hlavy.

Pri jednorazovej inicializácii príkazom ksync init sa v klastri vytvorí DaemonSet, ktorý sa používa na sledovanie stavu súborového systému vybraného kontajnera. Na svojom lokálnom počítači vývojár spustí príkaz ksync watch, ktorý sleduje konfigurácie a spúšťa syncthing, ktorý vykonáva priamu synchronizáciu súborov s klastrom.

Je potrebné poučiť ksync, čo a s čím synchronizovať. Napríklad, takýto príkaz:

ksync create --name=myproject --namespace=test --selector=app=backend --container=php --reload=false /home/user/myproject/ /var/www/myproject/

… vytvorí watcher s názvom myproject, ktorý bude hľadať pod s označením app=backend a pokúsi sa synchronizovať lokálny adresár /home/user/myproject/ s adresárom /var/www/myproject/ kontejneru s názvom php.

Problémy a poznámky k ksync z našich skúseností:

  • Na uzloch Kubernetes klastra by sa mal používať overlay2 ako storage driver pre Docker. S inými nástrojmi nebude funkcionovať.
  • Pri používaní Windows ako OS klienta je možná nesprávna funkčnosť watcher’a súborového systému. Tento bug sa prejavuje pri práci s veľkými adresármi — s veľkým počtom vnorených súborov a adresárov. Vytvorili sme príslušný issue v projekte syncthing, ale doposiaľ (od začiatku júla) nie je pokrok.
  • Použite súbor .stignore aby ste určili cesty alebo vzory súborov, ktoré sa nemajú synchronizovať (napríklad adresáre app/cache a .git).
  • Predvolená hodnota ksync je reštartovať kontajner pri každej zmene súborov. Pre Node.js je to pohodlné, pre PHP úplne zbytočné. Lepšie je vypnúť opcache a použiť prepínač --reload=false.
  • Konfiguráciu je vždy možné opraviť v $HOME/.ksync/ksync.yaml.

Squash

  • Podstata: ladíš procesy priamo v klastri.
  • GitHub.
  • Krátka štatistika GH: 1154 hviezd, 279 commitov, 23 prispievateľov.
  • Jazyk: Go.
  • Licencia: Apache License 2.0.

Tento nástroj je určený na ladenie procesov priamo v pod'och. Nástroj je jednoduchý a v interaktívnom režime umožňuje vybrať potrebného ladíča (pozri nižšie) a namespace + pod, do ktorého treba zasiahnuť. V súčasnosti sú podporované:

  • delve — pre aplikácie v Go;
  • GDB — cez target remote + presmerovanie portu;
  • presmerovanie portu JDWP pre ladenie Java-aplikácií.

Z hľadiska IDE je podpora len vo VScode (s pomocou rozšírenia), avšak v plánoch na tento (2019) rok sú aj Eclipse a Intellij.

Na ladenie procesov Squash spúšťa na uzloch klastra privilegovaný kontajner, preto je potrebné sa najprv oboznámiť s možnosťami bezpečného režimu aby ste predišli problémom so zabezpečením.

Komplexné riešenia

Prejdeme k ťažkej artilérii — väčším projektom, ktoré sa snažia naraz pokryť mnohé potreby vývojárov.

Poznámka: V tomto zozname má určite miesto aj náš Open Source nástroj werf (predtým známy ako dapp). Ale už sme o ňom písali a hovorili, a preto sme sa rozhodli ho nezaradiť do prehľadu. Pre tých, ktorí sa chcú oboznámiť s jeho možnosťami bližšie, odporúčame prečítať si/ vypočuť prednášku „werf — náš nástroj pre CI/CD v Kubernetes».

DevSpace

  • Podstata: pre tých, ktorí chcú začať pracovať v Kubernetes, ale nechcú sa hlboko zaoberať jeho zložitostiami.
  • GitHub.
  • Krátka štatistika GH: 630 hviezd, 1912 commitov, 13 prispievateľov.
  • Jazyk: Go.
  • Licencia: Apache License 2.0.

Riešenie od rovnomennej spoločnosti, ktorá ponúka spravované klastry s Kubernetes pre tímový vývoj. Nástroj bol vytvorený pre komerčné klastry, ale skvele funguje aj s akýmikoľvek inými.

Pri spustení príkazu devspace init v adresári s projektom vám ponúknu (v interaktívnom režime):

  • vybrať pracovný Kubernetes klaster,
  • použiť existujúci Dockerfile (alebo vygenerovať nový) na vytvorenie kontajnera na jeho báze,
  • vybrať repozitár na ukladanie obrázkov kontajnerov atď.

Po všetkých týchto prípravných krokoch sa môže začať vývoj, vykonaním príkazu devspace dev. Ten zíde kontajner, nahraje ho do repozitára, nasadí deployment do klastru a spustí prenos portov a synchronizáciu kontajnera s lokálnym adresárom.

Voliteľne sa ponúkne možnosť prechodom terminálu do kontajnera. Odmietať to netreba, pretože v skutočnosti sa kontajner spúšťa príkazom sleep a na reálne testovanie je potrebné aplikáciu spustiť manuálne.

Nakoniec, príkaz devspace deploy nasadzuje aplikáciu a súvisiacu infraštruktúru do klastru, po čom všetko začne fungovať v produkčnom režime.

Celá konfigurácia projektu je uložená v súbore devspace.yaml. Okrem nastavení pre vývojové prostredie v ňom možno nájsť aj popis infraštruktúry, podobný štandardným manifestom Kubernetes, avšak značne zjednodušený.

Nástroje pre vývojárov aplikácií bežiacich v Kubernetes
Architektúra a základné etapy práce s DevSpace

Okrem toho je do projektu ľahké pridať preddefinovanú komponentu (napríklad DB MySQL) alebo Helm chart. Viac si prečítajte v dokumenácie — nie je to zložitá záležitosť.

Skaffold

  • Webová stránka; GitHub.
  • Kratšia štatistika GH: 7423 hviezd, 4173 commitov, 136 prispievateľov.
  • Jazyk: Go.
  • Licencia: Apache License 2.0.

Tento nástroj od Googlu sa snaží pokryť všetky potreby vývojára, ktorého kód bude tak či onak spúšťaný v klastru Kubernetes. Začať ho používať nie je také jednoduché ako devspace: žiadna interaktivita, žiadne určovanie jazyka ani automatické vytváranie Dockerfile tu nenájdete.

Avšak, ak vás to neodradí — tu sú veci, ktoré umožňuje Skaffold:

  • Sledovať zmeny v zdrojovom kóde.
  • Synchronizovať ho s kontajnerom podu, ak nevyžaduje kompiláciu.
  • Kompilovať kontajnery s kódom, ak je programovací jazyk interpretovaný, alebo kompilovať artefakty a balíčkovať ich do kontajnerov.
  • Výsledné obrázky automaticky kontrolovať pomocou container-structure-test.
  • Označiť a nahrať obrázky do Docker Registry.
  • Nasadiť aplikáciu do klastru pomocou kubectl, Helm alebo kustomize.
  • Vykonávať prenos portov.
  • Ladiť aplikácie napísané v Jave, Node.js, Pythone.

Workflow v rôznych variáciách sa deklaratívne popisuje v súbore skaffold.yaml. Pre projekt je možné tiež definovať niekoľko profilov, v ktorých sa čiastočne alebo úplne menia fázy zostavovania a nasadenia. Napríklad pre vývoj určiť základný obraz vhodný pre vývojára, zatiaľ čo pre staging a produkciu — minimálny (+ použiť securityContext alebo predefinovať klaster, v ktorom bude aplikácia nasadená).

Zostavenie Docker kontajnerov môže prebiehať lokálne alebo vzdialene: v Google Cloud Build alebo v klastri pomocou Kaniko. Podporujú sa aj Bazel a Jib Maven/Gradle. Pre tagovanie Skaffold podporuje množstvo stratégií: podľa git commit hash, dátumu/ času, sha256 sumy zdrojov atď.

Samostatne stojí za zmienku možnosť testovania kontajnerov. Už spomenutý rámec container-structure-test ponúka nasledujúce metódy overovania:

  • Vykonávanie príkazov v kontexte kontajnera s sledovaním exit statusov a kontrolou textového „výstupu“ príkazu.
  • Kontrola prítomnosti súborov v kontajneri a zhodnosti atribútov s uvedenými.
  • Kontrola obsahu súborov pomocou regulárnych výrazov.
  • Overenie metadát obrazu (ENV, ENTRYPOINT, VOLUMES a pod.).
  • Kontrola kompatibility licencií.

Synchronizácia súborov s kontajnerom prebieha nie najoptimálnejším spôsobom: Skaffold jednoducho vytvorí archív so zdrojovými kódmi, skopíruje ho a rozbalí v kontajneri (musí byť nainštalovaný tar). Preto, ak je vašou hlavnou úlohou synchronizácia kódu, je lepšie sa pozrieť na špecializované riešenie (ksync).

Nástroje pre vývojárov aplikácií bežiacich v Kubernetes
Hlavné etapy práce Skaffold

Celkovo nástroj neumožňuje abstrahovať od Kubernetes manifestov a nemá žiadnu interaktivitu, takže sa môže zdať zložitý na osvojenie. Ale na tom je aj jeho výhoda — väčšia sloboda pohybu.

Garden

  • Webová stránka; GitHub.
  • Krátka štatistika GH: 1063 hviezd, 1927 commitov, 17 prispievateľov.
  • Jazyk: TypeScript (plánuje sa rozdeliť projekt na niekoľko komponentov, niektoré z nich budú na Go, ako aj vytvoriť SDK pre vytváranie doplnkov na TypeScript/JavaScript a Go).
  • Licencia: Apache License 2.0.

Rovnako ako Skaffold, Garden sa zameriava na automatizáciu procesov dodávky kódu aplikácie do K8s klastra. Na to je najskôr potrebné popísať štruktúru projektu v YAML súbore, po čom spustiť príkaz garden dev. Urobí všetku mágiu:

  • Zostaví kontajnery s rôznymi časťami projektu.
  • Vykoná integračné a unit testy, ak boli popísané.
  • Nasadí všetky komponenty projektu do klastra.
  • Pri zmene zdrojového kódu sa znovu spustí celý pipeline.

Hlavný dôraz pri používaní tohto nástroja je na spoluprácu tímu vývojárov s diaľkovým klastrom. V tomto prípade, ak už boli uskutočnené niektoré fázy kompilácie a testovania, to podstatne urýchli celý proces, pretože Garden môže využiť cachované výsledky.

Modulom projektu môže byť kontajner, Maven kontajner, Helm chart, manifest pre kubectl apply alebo dokonca funkcia OpenFaaS. A ktorýkoľvek z modulov je možné ťahať z diaľkového Git repozitára. Modul môže definovať (alebo nemusí) služby, úlohy a testy. Služby a úlohy môžu mať závislosti, čo umožňuje určiť poradie nasadenia tej ktorej služby, usporiadať spúšťanie úloh a testov.

Garden poskytuje používateľovi krásny dashboard (zatiaľ v experimentálnom stave), v ktorom sa zobrazuje graf projektu: komponenty, poradie kompilácie, realizácie úloh a testov, ich vzťahy a závislosti. Priamo v prehliadači si môžete prezrieť aj logy všetkých komponentov projektu, skontrolovať, čo daný komponent vracia cez HTTP (ak je pre neho samozrejme vyhlásený zdroj ingress).

Nástroje pre vývojárov aplikácií bežiacich v Kubernetes
Panel pre Garden

Tento nástroj má aj režim hot-reload, ktorý jednoducho synchronizuje zmeny skriptov s kontajnerom v klastri a mnohonásobne urýchľuje proces ladenia aplikácie. Garden má dobrý dokumentácia a slušný set príkladov, ktoré umožňujú rýchlo sa oboznámiť a začať používať. Mimochodom, nedávno sme zverejnili preklad článku od jeho autorov.

Záver

Samozrejme, tento zoznam nástrojov na vývoj a ladenie aplikácií v Kubernetes nie je vyčerpávajúci. Existuje ešte mnoho veľmi užitočných a praktických utilít, ktoré si zaslúžia, ak nie samostatný článok, tak minimálne zmienku. Povedzte nám, čo používate vy, s akými problémami ste sa stretli a ako ste ich riešili!

P.S.

Prečítajte si tiež na našom blogu:

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster