Nástroje pro vývojáře aplikací běžících v Kubernetes

Nástroje pro vývojáře aplikací běžících v Kubernetes

Moderní přístup k provozování řeší řadu naléhavých problémů podnikání. Kontejnery a orchestry umožňují snadno škálovat projekty jakékoliv složitosti, zjednodušují uvolňování nových verzí, zvyšují jejich spolehlivost, ale zároveň vytvářejí další problémy pro vývojáře. Programátora především zajímá jeho kód: architektura, kvalita, výkon, elegance, - a ne to, jak poběží v Kubernetes a jak ho testovat a ladit po i minimálních úpravách. Proto je velmi přirozené, že se aktivně vyvíjejí nástroje pro Kubernetes, které pomáhají řešit problémy i těch „nejarchaičtějších“ vývojářů a umožňují jim soustředit se na to hlavní.

Tato recenze přináší stručné informace o některých nástrojích, které usnadňují život programátorovi, jehož kód běží v podch Kubernetes klastru.

Jednoduché pomocníky

Kubectl-debug

  • Podstata: přidej svůj kontejner do Podu a zjisti, co se v něm děje.
  • GitHub.
  • Stručná statistika GH: 715 hvězd, 54 commitů, 9 přispěvatelů.
  • Jazyk: Go.
  • Licence: Apache License 2.0.

Tento plugin pro kubectl umožňuje vytvořit uvnitř zajímavého podu další kontejner, který bude sdílet prostor názvů procesů s ostatními kontejnery. Lze v něm ladit fungování podu: zkontrolovat fungování sítě, poslouchat síťový provoz, provést strace zajímavého procesu atd.

Také se lze přepnout do kontejneru procesu, provedením chroot /proc/PID/root - to může být velmi užitečné, když je potřeba získat root shell v kontejneru, pro který je v manifestu nastaveno securityContext.runAs.

Nástroj je jednoduchý a efektivní, takže se může hodit každému vývojáři. Více o něm jsme psali v samostatném článku.

Telepresence

  • Podstata: přenést aplikaci na svůj počítač. Vyvíjejte a laděte lokálně.
  • Web; GitHub.
  • Stručná statistika GH: 2131 hvězda, 2712 commitů, 33 přispěvatelů.
  • Jazyk: Python.
  • Licence: Apache License 2.0.

Myšlenka této komponenty spočívá v spuštění kontejneru s aplikací na lokálním uživatelském počítači a procházení veškerého provozu z klastru do něj a zpět. Tento přístup umožňuje vývoj lokálně, jednoduše měnící soubory ve své oblíbené IDE: výsledky budou okamžitě dostupné.

Výhody místního spuštění zahrnují pohodlné úpravy a okamžitý výsledek, možnost ladit aplikaci obvyklým způsobem. Mezi nevýhody patří nároky na rychlost připojení, což je obzvlášť patrné při práci s aplikací s dostatečně vysokým RPS a provozem. Kromě toho má Telepresence problémy s volume mounts ve Windows, což může být rozhodujícím omezením pro vývojáře zvyklé na tento operační systém.

Již jsme se podělili o naše zkušenosti s používáním Telepresence zde.

Ksync

  • Podstata: téměř okamžitá synchronizace kódu s kontejnerem v klastru.
  • GitHub.
  • Krátká statistika GH: 555 hvězd, 362 commitů, 11 přispěvatelů.
  • Jazyk: Go.
  • Licence: Apache License 2.0.

Nástroj umožňuje synchronizovat obsah místního adresáře s adresářem kontejneru běžícího v klastru. Takový nástroj se skvěle hodí pro vývojáře v skriptovacích programovacích jazycích, jejichž hlavní problém spočívá v doručení kódu do běžícího kontejneru. Ksync má za cíl tuto bolest hlavy odstranit.

Při jednorázové inicializaci příkazem ksync init se v klastru vytvoří DaemonSet, který se používá k sledování stavu souborového systému vybraného kontejneru. Na svém místním počítači vývojář spustí příkaz ksync watch, který sleduje konfigurace a spouští syncthing, provádějící přímou synchronizaci souborů s klastrem.

Zbývá instruovat ksync, co a s čím synchronizovat. Například příkaz:

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

… vytvoří watcher s názvem myproject, který bude hledat pod s štítkem app=backend a pokusí se synchronizovat místní adresář /home/user/myproject/ s adresářem /var/www/myproject/ u kontejneru s názvem php.

Problémy a poznámky k ksync z naší praxe:

  • Na uzlech Kubernetes klastru by měl být použit overlay2 jako storage driver pro Docker. S žádným jiným nástrojem nebude fungovat.
  • Při použití Windows jako klientského OS může docházet k nesprávné funkci watcheru souborového systému. Tato chyba byla zaznamenána při práci s velkými adresáři — s velkým množstvím vnořených souborů a adresářů. Vytvořili jsme odpovídající issue v projektu syncthing, ale od té doby (počátku července) není žádný pokrok.
  • Použijte soubor .stignore Abyste určili cesty nebo šablony souborů, které se nemají synchronizovat (například adresáře app/cache a .git).
  • Ve výchozím nastavení ksync restartuje kontejner při každé změně souborů. Pro Node.js je to užitečné, ale pro PHP zcela nadbytečné. Raději vypněte opcache a použijte přepínač --reload=false.
  • Konfiguraci lze vždy upravit v $HOME/.ksync/ksync.yaml.

Squash

  • Podstata: ladit procesy přímo v clusteru.
  • GitHub.
  • Krátká statistika GH: 1154 hvězd, 279 commitů, 23 přispěvatelů.
  • Jazyk: Go.
  • Licence: Apache License 2.0.

Tento nástroj je určen pro ladění procesů přímo v podech. Utility je jednoduchá a v interaktivním režimu umožňuje vybrat potřebný ladicí nástroj (viz níže) a namespace + pod, do kterého je třeba zasáhnout. V současné době se podporují:

  • delve - pro aplikace v Go;
  • GDB - přes target remote + port forwarding;
  • port forwarding JDWP pro ladění Java aplikací.

Z pohledu IDE je podporována pouze ve VScode (pomocí rozšíření), avšak v plánech na aktuální (2019) rok jsou Eclipse a Intellij.

Pro ladění procesů Squash spouští na uzlech clustera privilegovaný kontejner, proto je nejprve třeba se seznámit s možnostmi bezpečnostního režimu aby se předešlo problémům se zabezpečením.

Komplexní řešení

Přejdeme k těžké artilerii - na větší "škálovatelné" projekty, které mají okamžitě vyřešit mnoho potřeb vývojářů.

NB: V tomto seznamu má bezesporu své místo i naše Open Source utility werf (dříve známé jako dapp). Nicméně jsme o ní již několikrát psali a hovořili, proto jsme se rozhodli ji do přehledu nezahrnout. Pro ty, kteří se chtějí s jejími možnostmi blíže seznámit, doporučujeme přečíst/slyšet přednášku "werf - náš nástroj pro CI/CD v Kubernetes».

DevSpace

  • Podstata: pro ty, kteří chtějí začít pracovat v Kubernetes, ale nechtějí se ponořit do jeho hlubin.
  • GitHub.
  • Krátká statistika GH: 630 hvězd, 1912 commitů, 13 přispěvatelů.
  • Jazyk: Go.
  • Licence: Apache License 2.0.

Řešení od stejnojmenné společnosti, která poskytuje spravované clustery s Kubernetes pro týmový vývoj. Utility byla vytvořena pro komerční clustery, ale skvěle funguje i s jakýmikoli jinými.

Při spuštění příkazu devspace init v adresáři s projektem budete vyzváni (v interaktivním režimu):

  • vybrat pracovní Kubernetes cluster,
  • použít existující Dockerfile (nebo vygenerovat nový) pro vytvoření kontejneru na jeho základě,
  • vybrat repozitář pro uložení obrazů kontejnerů atd.

Po všech těchto přípravných krocích můžete začít vývoj tímto příkazem devspace dev. Ten sestaví kontejner, nahraje ho do repozitáře, nasadí deployment do clusteru a spustí přesměrování portů a synchronizaci kontejneru s lokálním adresářem.

Volitelně vám bude nabídnuto přepnout se do kontejneru pomocí terminálu. Není třeba odmítat, protože ve skutečnosti se kontejner spouští s příkazem sleep, a pro skutečné testování je potřeba aplikaci spouštět ručně.

Nakonec příkaz devspace deploy nasazuje aplikaci a s ní spojenou infrastrukturu do clusteru, po čemž vše začne fungovat v produkčním režimu.

Veškeré nastavení projektu je uloženo v souboru devspace.yaml. Kromě nastavení prostředí pro vývoj v něm můžete také najít popis infrastruktury, podobný standardním manifestům Kubernetes, avšak značně zjednodušený.

Nástroje pro vývojáře aplikací běžících v Kubernetes
Architektura a hlavní fáze práce s DevSpace

Kromě toho je do projektu snadné přidat předdefinovanou komponentu (například DB MySQL) nebo Helm chart. Více informací najdete v dokumentaci — je to jednoduché.

Skaffold

  • Web; GitHub.
  • Stručná statistika GH: 7423 hvězdiček, 4173 commitů, 136 přispěvatelů.
  • Jazyk: Go.
  • Licence: Apache License 2.0.

Tento nástroj od Googlu tvrdí, že pokryje všechny potřeby vývojáře, jehož kód bude nějakým způsobem spuštěn v clusteru Kubernetes. Začít ho používat není tak snadné jako devspace: žádná interaktivita, určení jazyka a automatické vytváření Dockerfile zde vám nebude nabídnuto.

Nicméně, pokud vás to neodradí — zde je, co umožňuje Skaffold:

  • Sledovat změny v zdrojovém kódu.
  • Synchronizovat ho s kontejnerem podu, pokud není potřeba kompilace.
  • Sestavovat kontejnery s kódem, pokud je programovací jazyk interpretovaný, nebo kompilovat artefakty a balit je do kontejnerů.
  • Výsledné obrazy automaticky kontrolovat pomocí container-structure-test.
  • Tagovat a nahrávat obrazy do Docker Registry.
  • Nasazovat aplikaci v clusteru pomocí kubectl, Helm nebo kustomize.
  • Provádět přesměrování portů.
  • Ladit aplikace napsané v Javě, Node.js, Pythonu.

Workflow v různých variantách je deklarativně popsán v souboru skaffold.yaml. Pro projekt můžete také definovat několik profilů, ve kterých lze částečně nebo úplně měnit fáze sestavení a nasazení. Například pro vývoj můžete určit základní obraz, který je pohodlný pro vývojáře, a pro staging a produkci — minimální (+ použít securityContext nebo předefinovat klastr, ve kterém bude aplikace nasazena).

Sestavení Docker kontejnerů může probíhat místně nebo vzdáleně: v Google Cloud Build nebo v klastru pomocí Kaniko. Také jsou podporovány Bazel a Jib Maven/Gradle. Pro tagování Skaffold podporuje mnoho strategií: podle git commit hashe, data/čas, sha256 součtu zdrojového kódu atd.

Mimo to stojí za zmínku možnost testování kontejnerů. Již zmíněný framework container-structure-test nabízí následující metody ověřování:

  • Vykonávání příkazů v kontextu kontejneru se sledováním exit statusů a kontrolou textového „výstupu“ příkazu.
  • Kontrola přítomnosti souborů v kontejneru a jejich atributů shodných s uvedenými.
  • Kontrola obsahu souborů na základě regulárních výrazů.
  • Ověření metadat obrazu (ENV, ENTRYPOINT, VOLUMES atd.).
  • Ověření souladu licencí.

Synchronizace souborů s kontejnerem se provádí ne zcela optimálním způsobem: Skaffold jednoduše vytvoří archiv se zdrojovými kódy, zkopíruje jej a rozbalí v kontejneru (musí být nainstalován tar). Proto, pokud je vaším hlavním úkolem synchronizace kódu, je lepší podívat se na specializované řešení (ksync).

Nástroje pro vývojáře aplikací běžících v Kubernetes
Hlavní etapy práce Skaffold

Celkově však nástroj neumožňuje abstrahovat od Kubernetes manifestů a nemá žádnou interaktivitu, takže se může zdát obtížné se ho naučit. Ale v tom je i jeho plus — větší svoboda jednání.

Garden

  • Web; GitHub.
  • Krátká statistika GH: 1063 hvězdičky, 1927 commitů, 17 přispěvatelů.
  • Jazyk: TypeScript (plánuje se rozdělit projekt na několik komponent, z nichž některé budou na Go, a také vytvořit SDK pro vytváření doplňků na TypeScript/JavaScript a Go).
  • Licence: Apache License 2.0.

Stejně jako Skaffold, Garden se zaměřuje na automatizaci procesů dodání kódu aplikace do K8s klastru. K tomu je nejprve nutné popsat strukturu projektu v YAML souboru, po čemž spustíte příkaz garden dev. Ten udělá všechno kouzlo:

  • Sestaví kontejnery s různými částmi projektu.
  • Provede integrační a unit testy, pokud byly popsány.
  • Vyjede všechny komponenty projektu do cloudu.
  • V případě změny zdrojového kódu - znovu spustí celý pipeline.

Hlavní důraz při používání tohoto nástroje je kladen na společné sdílení vzdáleného clustera týmem vývojářů. V tomto případě, pokud už byly nějaké fáze sestavení a testování provedeny, výrazně to urychlí celý proces, protože Garden bude moci využít vyrovnané výsledky.

Modul projektu může být kontejner, Maven kontejner, Helm chart, manifest pro kubectl apply nebo dokonce OpenFaaS funkce. Přičemž jakýkoli z modulů lze stáhnout z vzdáleného Git repozitáře. Modul může definovat (nebo nemusí) služby, úkoly a testy. Služby a úkoly mohou mít závislosti, což umožňuje určit pořadí nasazení jednotlivých služeb, organizovat spuštění úloh a testů.

Garden poskytuje uživateli krásný dashboard (zatím v experimentálním stavu), ve kterém se zobrazuje graf projektu: komponenty, pořadí sestavení, provádění úloh a testů, jejich vazby a závislosti. Přímo v prohlížeči je možné zkontrolovat i logy všech komponent projektu, ověřit, co vrací daný komponent přes HTTP (pokud tedy je pro něj deklarován ingress resource).

Nástroje pro vývojáře aplikací běžících v Kubernetes
Panel pro Garden

Tento nástroj má také režim hot-reload, který jednoduše synchronizuje změny skriptů s kontejnerem v clusterech, čímž několikanásobně urychluje proces debugování aplikace. Garden má dobrou dokumentace a slušnou sadu příkladů, které umožňují rychle se zorientovat a začít používat. Mimochodem, nedávno jsme publikovali překlad článku od jeho autorů.

Závěr

Samozřejmě, že tento seznam nástrojů pro vývoj a debugování aplikací v Kubernetes není vyčerpávající. Existuje mnoho užitečných a praktických utilit, které si zaslouží, pokud ne samostatný článek, tak minimálně zmínku. Podělte se o to, co používáte vy, s jakými problémy jste se setkali a jak jste je řešili!

P.S.

Přečtěte si také náš blog:

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster