{"id":37475,"date":"2019-10-31T22:17:51","date_gmt":"2019-10-31T19:17:51","guid":{"rendered":"https:\/\/prohoster.info\/blog\/instrumenty-dlya-razrabotchikov-prilozhenij-zapuskaemyh-v-kubernetes\/"},"modified":"2019-10-31T22:17:51","modified_gmt":"2019-10-31T19:17:51","slug":"instrumenty-dlya-razrabotchikov-prilozhenij-zapuskaemyh-v-kubernetes","status":"publish","type":"post","link":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/instrumenty-dlya-razrabotchikov-prilozhenij-zapuskaemyh-v-kubernetes","title":{"rendered":"Instrumente pentru dezvoltatori de aplica\u021bii, care ruleaz\u0103 \u00een Kubernetes","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Instrumente pentru dezvoltatori de aplica\u021bii, care ruleaz\u0103 \u00een Kubernetes\" src=\"\/wp-content\/uploads\/2019\/08\/ad1f46a3562dcefacaa1722ee1ce3387.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAbordarea modern\u0103 a oper\u0103rii rezolv\u0103 multe probleme urgente ale afacerii. Containerele \u0219i orchestratorii permit scalarea u\u0219oar\u0103 a proiectelor de orice complexitate, simplific\u0103 lans\u0103rile de versiuni noi, le fac mai fiabile, dar \u00een acela\u0219i timp genereaz\u0103 probleme suplimentare pentru dezvoltatori. Programatorul, \u00een primul r\u00e2nd, se \u00eengrijoreaz\u0103 de codul s\u0103u: arhitectura, calitatea, performan\u021ba, elegan\u021ba - \u0219i nu de modul \u00een care se va deschide \u00een Kubernetes \u0219i cum va fi testat \u0219i depanat dup\u0103 efectuarea chiar \u0219i a celor mai minime modific\u0103ri. De aceea, este c\u00e2t se poate de natural c\u0103 se dezvolt\u0103 activ instrumente pentru Kubernetes care ajut\u0103 la rezolvarea problemelor chiar \u0219i pentru cei mai \u201earcaici\u201d dezvoltatori, permi\u021b\u00e2ndu-le s\u0103 se concentreze pe esen\u021bial.<\/p>\n<p>Aceast\u0103 recenzie ofer\u0103 informa\u021bii scurte despre unele instrumente care simplific\u0103 via\u021ba programatorului, al c\u0103rui cod ruleaz\u0103 \u00een pod-urile unui cluster Kubernetes.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Asisten\u021bi simpli<\/h2>\n<p><\/p>\n<h3>Kubectl-debug<\/h3>\n<p><\/p>\n<ul>\n<li> Esenta: <b>adaug\u0103-\u021bi containerul \u00een Pod \u0219i vezi ce se \u00eent\u00e2mpl\u0103 \u00een el<\/b>.<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/aylei\/kubectl-debug\">GitHub<\/a><\/noindex>.<\/li>\n<li> Statistici scurte GH: 715 stele, 54 commit-uri, 9 contribuabili.<\/li>\n<li> Limbaj: Go.<\/li>\n<li> Licen\u021b\u0103: Apache License 2.0.<\/li>\n<\/ul>\n<p>\nAcest plugin pentru kubectl permite crearea unui container suplimentar \u00een interiorul pod-ului dorit, care va \u00eemp\u0103rt\u0103\u0219i spa\u021biul de nume al proceselor cu celelalte containere. \u00cen el se pot efectua depanarea func\u021bion\u0103rii pod-ului: verifica func\u021bionarea re\u021belei, asculta traficul de re\u021bea, efectua strace pe procesul dorit etc.<\/p>\n<p>De asemenea, po\u021bi comuta \u00een containerul procesului execut\u00e2nd <code>chroot \/proc\/PID\/root<\/code> - aceasta este foarte convenabil atunci c\u00e2nd trebuie s\u0103 ob\u021bii un shell root \u00een containerul pentru care a fost setat \u00een manifest <code>securityContext.runAs<\/code>.<\/p>\n<p>Instrumentul este simplu \u0219i eficient, astfel \u00eenc\u00e2t poate fi util pentru fiecare dezvoltator. Mai multe detalii despre el am scris \u00een <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/436112\/\">un articol separat<\/a><\/noindex>.<\/p>\n<h3>Telepresence<\/h3>\n<p><\/p>\n<ul>\n<li> Esenta: <b>mut\u0103 aplica\u021bia pe computerul t\u0103u. Dezvolt\u0103 \u0219i depaneaz\u0103 local<\/b>.<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/www.telepresence.io\/\">Site<\/a><\/noindex>; <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/telepresenceio\/telepresence\">GitHub<\/a><\/noindex>.<\/li>\n<li> Statistici scurte GH: 2131 stea, 2712 commit-uri, 33 contribuabili.<\/li>\n<li> Limbaj: Python.<\/li>\n<li> Licen\u021b\u0103: Apache License 2.0.<\/li>\n<\/ul>\n<p>\nIdeea acestui instrument const\u0103 \u00een a rula un container cu aplica\u021bia pe computerul local al utilizatorului \u0219i a proxy-iza tot traficul din cluster \u00eenapoi \u0219i \u00eenapoi. Aceast\u0103 abordare permite dezvoltarea local\u0103, pur \u0219i simplu modific\u00e2nd fi\u0219ierele \u00een IDE-ul t\u0103u preferat: rezultatele vor fi disponibile imediat.<\/p>\n<p>Avantajele lans\u0103rii locale sunt comoditatea modific\u0103rilor \u0219i rezultatul imediat, precum \u0219i posibilitatea de a debuga aplica\u021bia \u00eentr-un mod obi\u0219nuit. Dezavantajele includ cerin\u021bele de vitez\u0103 de conexiune, ceea ce devine evident mai ales c\u00e2nd trebuie s\u0103 lucr\u0103m cu o aplica\u021bie cu un RPS \u0219i trafic destul de ridicat. \u00cen plus, Telepresence are probleme cu volume mounts \u00een Windows, ceea ce poate fi o limitare decisiv\u0103 pentru dezvoltatori obi\u0219nui\u021bi cu acest sistem de operare.<\/p>\n<p>Deja am \u00eemp\u0103rt\u0103\u0219it experien\u021ba noastr\u0103 cu Telepresence <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/446788\/\">aici<\/a><\/noindex>.<\/p>\n<h3>Ksync<\/h3>\n<p><\/p>\n<ul>\n<li> Esenta: <b>sincronizare aproape instantanee a codului cu containerul din cluster<\/b>.<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/vapor-ware\/ksync\">GitHub<\/a><\/noindex>.<\/li>\n<li> Statistici scurte GH: 555 stele, 362 comituri, 11 contributori.<\/li>\n<li> Limbaj: Go.<\/li>\n<li> Licen\u021b\u0103: Apache License 2.0.<\/li>\n<\/ul>\n<p>\nUtilitarul permite sincronizarea con\u021binutului unui director local cu un catalog al containerului care ruleaz\u0103 \u00een cluster. Un astfel de instrument este excelent pentru dezvoltatorii de limbaje de programare scriptate, ale c\u0103ror probleme principale sunt livrarea codului \u00een containerul func\u021bional. Ksync este destinat s\u0103 elimine aceast\u0103 durere de cap.<\/p>\n<p>Prin ini\u021bializarea unic\u0103 cu comanda <code>ksync init<\/code> \u00een cluster este creat un DaemonSet, care este folosit pentru a urm\u0103ri starea sistemului de fi\u0219iere al containerului selectat. Pe computerul s\u0103u local, dezvoltatorul ruleaz\u0103 comanda <code>ksync watch<\/code>, care urm\u0103re\u0219te configura\u021biile \u0219i lanseaz\u0103 <noindex><a rel=\"nofollow\" href=\"https:\/\/syncthing.net\/\">syncthing<\/a><\/noindex>, care efectueaz\u0103 sincronizarea direct\u0103 a fi\u0219ierelor cu clusterul.<\/p>\n<p>R\u0103m\u00e2ne s\u0103-i instruct\u0103m pe ksync ce \u0219i cu ce s\u0103 sincronizeze. De exemplu, o astfel de comand\u0103:<\/p>\n<pre><code class=\"plaintext\">ksync create --name=myproject --namespace=test --selector=app=backend --container=php --reload=false \/home\/user\/myproject\/ \/var\/www\/myproject\/<\/code><\/pre>\n<p>\n\u2026 va crea un watcher numit <code>myproject<\/code>, care va c\u0103uta podul cu eticheta <code>app=backend<\/code> \u0219i va \u00eencerca s\u0103 sincronizeze directorul local <code>\/home\/user\/myproject\/<\/code> cu catalogul <code>\/var\/www\/myproject\/<\/code> al containerului numit <code>php<\/code>.<\/p>\n<p>Probleme \u0219i observa\u021bii referitoare la ksync din experien\u021ba noastr\u0103:<\/p>\n<ul>\n<li> Pe nodurile clusterului Kubernetes trebuie folosit <code>overlay2<\/code> ca driver de stocare pentru Docker. Nu va func\u021biona cu alte utilitare.<\/li>\n<li> Atunci c\u00e2nd se utilizeaz\u0103 Windows ca sistem de operare client, este posibil s\u0103 existe func\u021bionare incorect\u0103 a watcher-ului sistemului de fi\u0219iere. Aceast\u0103 problem\u0103 a fost observat\u0103 la lucrul cu directoare mari \u2014 cu un num\u0103r mare de fi\u0219iere \u0219i directoare \u00eenglobate. Am creat <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/syncthing\/syncthing\/issues\/5832\">un issue corespunz\u0103tor<\/a><\/noindex> \u00een proiectul syncthing, dar nu exist\u0103 progrese pe acest subiect (de la \u00eenceputul lui iulie).<\/li>\n<li> Folosi\u021bi fi\u0219ierul <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.syncthing.net\/users\/ignoring.html\"><code>.stignore<\/code><\/a><\/noindex> pentru a specifica c\u0103ile sau \u0219abloanele de fi\u0219iere care nu trebuie sincronizate (de exemplu, directoare <code>app\/cache<\/code> \u0219i <code>.git<\/code>).<\/li>\n<li> \u00cen mod implicit, ksync va re\u00eenc\u0103rca containerele la fiecare modificare a fi\u0219ierelor. Pentru Node.js este convenabil, iar pentru PHP este complet inutil. Cel mai bine este s\u0103 dezactiva\u021bi opcache \u0219i s\u0103 folosi\u021bi flagul <code>--reload=false<\/code>.<\/li>\n<li> Configurarea poate fi \u00eentotdeauna corectat\u0103 \u00een <code>$HOME\/.ksync\/ksync.yaml<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Squash<\/h3>\n<p><\/p>\n<ul>\n<li> Esenta: <b>debu\u0219eaz\u0103 procese direct \u00een cluster<\/b>.<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/solo-io\/squash\">GitHub<\/a><\/noindex>.<\/li>\n<li> Statistici sumare GH: 1154 stele, 279 de comitete, 23 de contribuabili.<\/li>\n<li> Limbaj: Go.<\/li>\n<li> Licen\u021b\u0103: Apache License 2.0.<\/li>\n<\/ul>\n<p>\nAcest instrument este destinat depan\u0103rii proceselor direct \u00een pod-uri. Utilitarul este simplu \u0219i \u00een modul interactiv permite alegerea depanatorului dorit. <i>(vezi mai jos)<\/i> \u0219i namespace + pod, \u00een procesul c\u0103ruia trebuie s\u0103 interveni\u021bi. \u00cen prezent, sunt acceptate:<\/p>\n<ul>\n<li> delve \u2014 pentru aplica\u021bii pe Go;<\/li>\n<li> GDB \u2014 prin target remote + redirec\u021bionare de port;<\/li>\n<li> redirec\u021bionarea portului JDWP pentru debu\u0219area aplica\u021biilor Java.<\/li>\n<\/ul>\n<p>\nDin partea IDE, suportul exist\u0103 doar \u00een VScode (cu ajutorul <noindex><a rel=\"nofollow\" href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=ilevine.squash\">extensii<\/a><\/noindex>), totu\u0219i \u00een planurile pentru acest an (2019) se afl\u0103 \u0219i Eclipse \u0219i Intellij.<\/p>\n<p>Pentru debu\u0219area proceselor, Squash porne\u0219te un container privilegiat pe nodurile clusterului, a\u0219a c\u0103 este necesar s\u0103 te familiarizezi mai \u00eent\u00e2i cu posibilit\u0103\u021bile <noindex><a rel=\"nofollow\" href=\"https:\/\/squash.solo.io\/secure_mode\/\">modului de siguran\u021b\u0103<\/a><\/noindex> pentru a evita problemele de securitate.<\/p>\n<h2>Solu\u021bii complexe<\/h2>\n<p>\nTrecem la artileria grea \u2014 la proiecte mai \u201escalabile\u201d, menite s\u0103 r\u0103spund\u0103 direct la multe dintre nevoile dezvoltatorilor.<\/p>\n<p><i><b>NB<\/b>: \u00cen aceast\u0103 list\u0103, cu siguran\u021b\u0103 este loc \u0219i pentru utilitarul nostru Open Source <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/333682\/\"><b>werf<\/b><\/a><\/noindex> (cunoscut anterior ca dapp). \u00cens\u0103 am scris deja de mai multe ori despre el \u0219i am decis s\u0103 nu-l includem \u00een revizuire. Pentru cei care doresc s\u0103 se familiarizeze mai bine cu capacit\u0103\u021bile sale, recomand\u0103m citirea\/ascultarea prezent\u0103rii \u201e<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460351\/\">werf \u2014 instrumentul nostru pentru CI\/CD \u00een Kubernetes<\/a><\/noindex>\u00bb.<\/i><\/p>\n<h3>DevSpace<\/h3>\n<p><\/p>\n<ul>\n<li> Esenta: <b>pentru cei care doresc s\u0103 \u00eenceap\u0103 lucrul cu Kubernetes, dar nu doresc s\u0103 se ad\u00e2nceasc\u0103 profund \u00een h\u0103\u021bi\u0219urile sale<\/b>.<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/devspace-cloud\/devspace\">GitHub<\/a><\/noindex>.<\/li>\n<li> Statistici sumare GH: 630 stele, 1912 de comitete, 13 contribuabili.<\/li>\n<li> Limbaj: Go.<\/li>\n<li> Licen\u021b\u0103: Apache License 2.0.<\/li>\n<\/ul>\n<p>\nSolu\u021bia de la compania omonim\u0103, care ofer\u0103 clustere manage pe Kubernetes pentru dezvoltare \u00een echip\u0103. Utilitarul a fost creat pentru clustere comerciale, dar func\u021bioneaz\u0103 excelent \u0219i cu orice altele.<\/p>\n<p>C\u00e2nd rula\u021bi comanda <code>devspace init<\/code> \u00een directorul proiectului, v\u0103 va solicita (\u00een mod interactiv):<\/p>\n<ul>\n<li> s\u0103 alege\u021bi clusterul Kubernetes de lucru,<\/li>\n<li> s\u0103 folosi\u021bi unul existent <code>Dockerfile<\/code> (sau s\u0103 genera\u021bi unul nou) pentru a crea un container pe baza acestuia,<\/li>\n<li> s\u0103 alege\u021bi un depozit pentru stocarea imaginilor containerelor etc.<\/li>\n<\/ul>\n<p>\nDup\u0103 toate aceste preg\u0103tiri, se poate \u00eencepe dezvoltarea, execut\u00e2nd comanda <code>devspace dev<\/code>. Aceasta va construi containerul, \u00eel va \u00eenc\u0103rca \u00een repo, va implementa deployment-ul \u00een cluster \u0219i va porni redirec\u021bionarea porturilor \u0219i sincronizarea containerului cu directorul local.<\/p>\n<p>Op\u021bional, vi se va sugera s\u0103 intra\u021bi \u00een container prin terminal. Nu ar trebui s\u0103 refuza\u021bi, deoarece \u00een realitate containerul porne\u0219te cu comanda sleep, iar pentru a testa aplica\u021bia \u00een mod real, trebuie s\u0103 o porni\u021bi manual.<\/p>\n<p>\u00cen cele din urm\u0103, comanda <code>devspace deploy<\/code> implementeaz\u0103 aplica\u021bia \u0219i infrastructura asociat\u0103 \u00een cluster, dup\u0103 care totul \u00eencepe s\u0103 func\u021bioneze \u00een modul de produc\u021bie.<\/p>\n<p>Toat\u0103 configura\u021bia proiectului este stocat\u0103 \u00een fi\u0219ierul <code>devspace.yaml<\/code>. Pe l\u00e2ng\u0103 set\u0103rile de mediu pentru dezvoltare, \u00een acesta se poate g\u0103si \u0219i descrierea infrastructurii, similar\u0103 cu manifestele standard Kubernetes, doar c\u0103 foarte simplificate.<\/p>\n<p><img decoding=\"async\" alt=\"Instrumente pentru dezvoltatori de aplica\u021bii, care ruleaz\u0103 \u00een Kubernetes\" src=\"\/wp-content\/uploads\/2019\/08\/7abbba3806facfb69ba4e3f9e0f18938.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Arhitectura \u0219i principalele etape de lucru cu DevSpace<\/i><\/p>\n<p>\u00cen plus, \u00een proiect este u\u0219or de ad\u0103ugat un component predefinit (de exemplu, SGBD MySQL) sau un chart Helm. Citi\u021bi mai multe \u00een <noindex><a rel=\"nofollow\" href=\"https:\/\/devspace.cloud\/docs\/\">documentation<\/a><\/noindex> \u2014 nu este complicat.<\/p>\n<h3>Skaffold<\/h3>\n<p><\/p>\n<ul>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/skaffold.dev\/\">Site<\/a><\/noindex>; <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/GoogleContainerTools\/skaffold\">GitHub<\/a><\/noindex>.<\/li>\n<li> Statistici scurte GH: 7423 stele, 4173 commit-uri, 136 contribuabili.<\/li>\n<li> Limbaj: Go.<\/li>\n<li> Licen\u021b\u0103: Apache License 2.0.<\/li>\n<\/ul>\n<p>\nAcest utilitar de la Google pretinde a acoperi toate nevoile dezvoltatorului, ale c\u0103rui coduri vor rula, \u00eentr-un fel sau altul, \u00een cluster-ul Kubernetes. A \u00eencepe s\u0103-l folose\u0219ti nu este la fel de simplu ca devspace: f\u0103r\u0103 interactivitate, definirea limbajului \u0219i auto-creare. <code>Dockerfile<\/code> nu vi se va propune aici.<\/p>\n<p>Cu toate acestea, dac\u0103 acest lucru nu v\u0103 sperie \u2014 iat\u0103 ce poate face Skaffold:<\/p>\n<ul>\n<li> Urm\u0103ri\u021bi modific\u0103rile codului surs\u0103.<\/li>\n<li> Sincronizeaz\u0103-l cu containerul pod-ului, dac\u0103 acesta nu necesit\u0103 construc\u021bie.<\/li>\n<li> Construi\u021bi containere cu cod, dac\u0103 limbajul de programare este interpretat, sau compila\u021bi artefactele \u0219i \u00eempacheta\u021bi-le \u00een containere.<\/li>\n<li> Imaginile ob\u021binute s\u0103 fie verificate automat folosind <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/GoogleContainerTools\/container-structure-test\">container-structure-test<\/a><\/noindex>.<\/li>\n<li> Eticheta\u021bi \u0219i \u00eenc\u0103rca\u021bi imaginile \u00een Docker Registry.<\/li>\n<li> Implementa\u021bi aplica\u021bia \u00een cluster, folosind kubectl, Helm sau kustomize.<\/li>\n<li> Face\u021bi redirec\u021bionarea porturilor.<\/li>\n<li> Depana\u021bi aplica\u021biile scrise \u00een Java, Node.js, Python.<\/li>\n<\/ul>\n<p>\nWorkflow-ul \u00een diferite varia\u021bii este descris declara\u021biei \u00een fi\u0219ierul <code>skaffold.yaml<\/code>. Pentru proiect, pute\u021bi de asemenea s\u0103 defini\u021bi mai multe profiluri, \u00een care s\u0103 modifica\u021bi par\u021bial sau complet etapele de construc\u021bie \u0219i implementare. De exemplu, pentru dezvoltare, specifica\u021bi o imagine de baz\u0103 convenabil\u0103 pentru dezvoltator, iar pentru staging \u0219i produc\u021bie \u2014 minimal\u0103 (+ utiliza\u021bi <code>securityContext<\/code> \u00een containere sau s\u0103 redefineasc\u0103 clusterul \u00een care aplica\u021bia va fi desf\u0103\u0219urat\u0103).<\/p>\n<p>Construirea containerelor Docker poate fi realizat\u0103 local sau de la distan\u021b\u0103: \u00een <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/cloud-build\/\">Google Cloud Build<\/a><\/noindex> sau \u00een cluster cu ajutorul <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/GoogleContainerTools\/kaniko\">Kaniko<\/a><\/noindex>. De asemenea, sunt acceptate Bazel \u0219i Jib Maven\/Gradle. Pentru etichetarea Skaffold, sunt acceptate multiple strategii: dup\u0103 hash-ul commit-ului git, dat\u0103\/or\u0103, suma sha256 a surselor etc.<\/p>\n<p>Merit\u0103 men\u021bionat\u0103 \u00een mod special posibilitatea test\u0103rii containerelor. Cadrele men\u021bionate anterior, container-structure-test, ofer\u0103 urm\u0103toarele metode de verificare:<\/p>\n<ul>\n<li> Executarea comenzilor \u00een contextul containerului cu urm\u0103rirea st\u0103rii de ie\u0219ire \u0219i verificarea 'output-ului' textului comenzii.<\/li>\n<li> Verificarea existen\u021bei fi\u0219ierelor \u00een container \u0219i conformitatea atributelor cu cele specificate.<\/li>\n<li> Controlul con\u021binutului fi\u0219ierelor folosind expresii regulate.<\/li>\n<li> Compararea metadatelor imaginii (<code>ENV<\/code>, <code>ENTRYPOINT<\/code>, <code>VOLUMES<\/code> \u0219.a.<\/li>\n<li> Verificarea compatibilit\u0103\u021bii licen\u021belor.<\/li>\n<\/ul>\n<p>\nSincronizarea fi\u0219ierelor cu containerul se face \u00eentr-un mod nu foarte optim: Skaffold creeaz\u0103 pur \u0219i simplu un arhiv cu sursele, \u00eel copiaz\u0103 \u0219i \u00eel dezarhiveaz\u0103 \u00een container (tar trebuie s\u0103 fie instalat). Prin urmare, dac\u0103 scopul dumneavoastr\u0103 principal este sincronizarea codului, mai bine c\u0103uta\u021bi o solu\u021bie specializat\u0103 (ksync).<\/p>\n<p><img decoding=\"async\" alt=\"Instrumente pentru dezvoltatori de aplica\u021bii, care ruleaz\u0103 \u00een Kubernetes\" src=\"\/wp-content\/uploads\/2019\/08\/a53647e9d3bf002c292dcae7a774e561.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Etapele principale ale func\u021bion\u0103rii Skaffold<\/i><\/p>\n<p>\u00cen general, instrumentul nu permite abstractizarea de la manifestele Kubernetes \u0219i nu are vreo interactivitate, a\u0219a c\u0103 poate p\u0103rea dificil de \u00eenv\u0103\u021bat. Dar acesta este \u0219i avantajul s\u0103u - o libertate mai mare de ac\u021biune.<\/p>\n<h3>Garden<\/h3>\n<p><\/p>\n<ul>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/garden.io\/\">Site<\/a><\/noindex>; <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/garden-io\/garden\">GitHub<\/a><\/noindex>.<\/li>\n<li> Statistici scurte GH: 1063 stele, 1927 commit-uri, 17 contribuabili.<\/li>\n<li> Limbaj: TypeScript <i>(se preconizeaz\u0103 \u00eemp\u0103r\u021birea proiectului \u00een mai multe componente, unele dintre ele fiind \u00een Go, precum \u0219i realizarea unui SDK pentru crearea extensiilor \u00een TypeScript\/JavaScript \u0219i Go)<\/i>.<\/li>\n<li> Licen\u021b\u0103: Apache License 2.0.<\/li>\n<\/ul>\n<p>\nCa \u0219i Skaffold, Garden este destinat automatiz\u0103rii proceselor de livrare a codului aplica\u021biei \u00een clusterul K8s. Pentru aceasta, mai \u00eent\u00e2i este necesar s\u0103 descrie\u021bi structura proiectului \u00eentr-un fi\u0219ier YAML, dup\u0103 care s\u0103 rula\u021bi comanda <code>garden dev<\/code>. Aceasta va face toat\u0103 magia:<\/p>\n<ul>\n<li> Va construi containerele cu diferite p\u0103r\u021bi ale proiectului.<\/li>\n<li> Va efectua teste de integrare \u0219i unitate, dac\u0103 acestea au fost descrise.<\/li>\n<li> Va desf\u0103\u0219ura toate componentele proiectului \u00een cluster.<\/li>\n<li> \u00cen cazul modific\u0103rii codului surs\u0103 - va relua \u00eentregul pipeline.<\/li>\n<\/ul>\n<p>\nPrincipalul accent \u00een utilizarea acestui instrument este pe colaborarea echipei de dezvoltare \u00een cadrul unui cluster de la distan\u021b\u0103. \u00cen acest caz, dac\u0103 unele etape de compilare \u0219i testare au fost deja realizate, acest lucru va accelera semnificativ \u00eentregul proces, deoarece Garden va putea folosi rezultatele cache-uite.<\/p>\n<p>Modulul proiectului poate fi un container, un container Maven, un chart Helm, un manifest pentru <code>kubectl apply<\/code> sau chiar o func\u021bie OpenFaaS. Oricare dintre module poate fi tras dintr-un repository Git de la distan\u021b\u0103. Un modul poate defini (sau nu) servicii, sarcini \u0219i teste. Serviciile \u0219i sarcinile pot avea dependen\u021be, ceea ce permite definirea ordinii de deploy a fiec\u0103rui serviciu, organizarea lans\u0103rii sarcinilor \u0219i testelor.<\/p>\n<p>Garden ofer\u0103 utilizatorului un dashboard atractiv (deocamdat\u0103 \u00een <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/garden-io\/garden\/tree\/master\/dashboard\">stadiu experimental<\/a><\/noindex>), care afi\u0219eaz\u0103 graficul proiectului: componentele, ordinea de compilare, execu\u021bia sarcinilor \u0219i testelor, leg\u0103turile \u0219i dependen\u021bele lor. Direct \u00een browser, se pot vizualiza \u0219i jurnalele tuturor componentelor proiectului, verific\u00e2nd ce returneaz\u0103 fiecare component\u0103 prin HTTP (dac\u0103, desigur, pentru aceasta a fost declarat un resurs\u0103 ingress).<\/p>\n<p><img decoding=\"async\" alt=\"Instrumente pentru dezvoltatori de aplica\u021bii, care ruleaz\u0103 \u00een Kubernetes\" src=\"\/wp-content\/uploads\/2019\/08\/931b48a306fcce025e4dd8aa51d01552.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Panoul pentru Garden<\/i><\/p>\n<p>Acest instrument ofer\u0103 \u0219i un mod de hot-reload, care sincronizeaz\u0103 pur \u0219i simplu modific\u0103rile scripturilor cu containerul din cluster, acceler\u00e2nd semnificativ procesul de depanare a aplica\u021biei. Garden dispune de un set bun <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.garden.io\/\">documenta\u021bia<\/a><\/noindex> \u0219i nu tocmai r\u0103u <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/garden-io\/garden\/tree\/master\/examples\">de exemple<\/a><\/noindex>, permi\u021b\u00e2ndu-le utilizatorilor s\u0103 se familiarizeze rapid \u0219i s\u0103 \u00eenceap\u0103 s\u0103 utilizeze. Apropo, recent am publicat <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/459586\/\">traducerea unui articol<\/a><\/noindex> de la autorii s\u0103i.<\/p>\n<h2>Concluzie<\/h2>\n<p>\nDesigur, aceast\u0103 list\u0103 nu epuizeaz\u0103 instrumentele pentru dezvoltarea \u0219i depanarea aplica\u021biilor \u00een Kubernetes. Exist\u0103 multe utilitare utile \u0219i practice, care merit\u0103 men\u021bionate, dac\u0103 nu \u00eentr-un articol separat, atunci \u2013 cel pu\u021bin \u2013 ca o men\u021biune. Spune\u021bi-ne, ce instrumente utiliza\u021bi, cu ce probleme v-a\u021bi confruntat \u0219i cum le-a\u021bi rezolvat!<\/p>\n<h2>P.S.<\/h2>\n<p>\nCiti\u021bi \u0219i \u00een blogul nostru:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460351\/\">werf \u2014 our tool for CI\/CD in Kubernetes (overview and presentation video)<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/459586\/\">Garden v0.10.0: Laptopul t\u0103u nu are nevoie de Kubernetes<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/446788\/\">Sfaturi \u0219i trucuri Kubernetes: despre dezvoltarea local\u0103 \u0219i Telepresence<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/436112\/\">Pluginul kubectl-debug pentru depanarea \u00een pod-urile Kubernetes<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>Sursa: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/462707\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 \u0440\u0435\u0448\u0430\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043d\u0430\u0441\u0443\u0449\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0431\u0438\u0437\u043d\u0435\u0441\u0430. \u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0438 \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043b\u0435\u0433\u043a\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u043b\u044e\u0431\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u0443\u043f\u0440\u043e\u0449\u0430\u044e\u0442 \u0440\u0435\u043b\u0438\u0437\u044b \u043d\u043e\u0432\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439, \u0434\u0435\u043b\u0430\u044e\u0442 \u0438\u0445 \u0431\u043e\u043b\u0435\u0435 \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u043c\u0438, \u043d\u043e \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0442\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430, \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0437\u0430\u0431\u043e\u0442\u0438\u0442 \u0435\u0433\u043e \u043a\u043e\u0434: \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430, \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c, \u2014 \u0430 \u043d\u0435 \u0442\u043e, \u043a\u0430\u043a \u043e\u043d \u043f\u043e\u0435\u0434\u0435\u0442 \u0432 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28120,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-37475","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/instrumenty-dlya-razrabotchikov-prilozhenij-zapuskaemyh-v-kubernetes\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u044b\u0445 \u0432 Kubernetes | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/instrumenty-dlya-razrabotchikov-prilozhenij-zapuskaemyh-v-kubernetes\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:17:51+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:17:51+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Instrumente pentru dezvoltatorii de aplica\u021bii rulate \u00een Kubernetes | ProHoster","description":"Abordarea modern\u0103 la.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/instrumenty-dlya-razrabotchikov-prilozhenij-zapuskaemyh-v-kubernetes","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u044b\u0445 \u0432 Kubernetes | ProHoster","og:description":"\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a.","og:url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/instrumenty-dlya-razrabotchikov-prilozhenij-zapuskaemyh-v-kubernetes","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:17:51+00:00","article:modified_time":"2019-10-31T19:17:51+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"37475","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-23 18:00:22","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:26:27","updated":"2026-01-23 18:00:22","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/37475","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=37475"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/37475\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/28120"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=37475"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=37475"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=37475"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}