{"id":36754,"date":"2019-10-31T22:13:37","date_gmt":"2019-10-31T19:13:37","guid":{"rendered":"https:\/\/prohoster.info\/blog\/werf-nash-instrument-dlya-ci-cd-v-kubernetes-obzor-i-video-doklada\/"},"modified":"2019-10-31T22:13:37","modified_gmt":"2019-10-31T19:13:37","slug":"werf-nash-instrument-dlya-ci-cd-v-kubernetes-obzor-i-video-doklada","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/werf-nash-instrument-dlya-ci-cd-v-kubernetes-obzor-i-video-doklada","title":{"rendered":"werf - mjeti yn\u00eb p\u00ebr CI\/CD n\u00eb Kubernetes (shqyrtim dhe video prezantimi)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>M\u00eb 27 maj n\u00eb sall\u00ebn kryesore t\u00eb konferenc\u00ebs DevOpsConf 2019, q\u00eb po zhvillohet n\u00eb kuad\u00ebr t\u00eb festivalit <noindex><a rel=\"nofollow\" href=\"http:\/\/ritfest.ru\/2019\/\">RIT++ 2019<\/a><\/noindex>, n\u00eb kuad\u00ebr t\u00eb sesionit \"Shp\u00ebrndarja e vazhdueshme\", u mbajt nj\u00eb kumtes\u00eb \"werf - mjeti yn\u00eb p\u00ebr CI\/CD n\u00eb Kubernetes\". Ajo flet p\u00ebr ato <b>problemet dhe sfidat me t\u00eb cilat p\u00ebrballet \u00e7do njeri gjat\u00eb deploimit n\u00eb Kubernetes<\/b>, si dhe p\u00ebr nuancat q\u00eb mund t\u00eb mos duken menj\u00ebher\u00eb. Duke analizuar posibilitetet e zgjidhjeve, ne tregojm\u00eb se si \u00ebsht\u00eb realizuar n\u00eb mjetin Open Source <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\">werf<\/a><\/noindex>.<\/p>\n<p>Q\u00eb nga paraqitja, utilita jon\u00eb (e njohur m\u00eb par\u00eb si dapp) ka kaluar nj\u00eb pik\u00eb historike n\u00eb <b>1000 yje n\u00eb GitHub<\/b> \u2014 shpresojm\u00eb se komuniteti n\u00eb rritje i p\u00ebrdoruesve t\u00eb saj do t\u00eb leht\u00ebsoj\u00eb jet\u00ebn e shum\u00eb inxhinier\u00ebve DevOps.<\/p>\n<p><img decoding=\"async\" alt=\"werf - mjeti yn\u00eb p\u00ebr CI\/CD n\u00eb Kubernetes (shqyrtim dhe video prezantimi)\" src=\"\/wp-content\/uploads\/2019\/08\/c2d1ad5133c0de944b60ae37e3dbe598.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPrandaj, paraqesim <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=cK3ackGUTLw\"><b>video me referatin<\/b><\/a><\/noindex> (~47 minuta, shum\u00eb informative m\u00eb shum\u00eb se artikulli) dhe nj\u00eb p\u00ebrmbledhje themelore t\u00eb saj n\u00eb form\u00eb tekstuale. Le t\u00eb fillojm\u00eb!<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>D\u00ebrgimi i kodit n\u00eb Kubernetes<\/h2>\n<p>\nKumtesa do t\u00eb flas\u00eb m\u00eb shum\u00eb jo p\u00ebr werf, por p\u00ebr CI\/CD n\u00eb Kubernetes, duke n\u00ebnkuptuar se softi yn\u00eb \u00ebsht\u00eb paketuar n\u00eb konteiner\u00eb Docker <i>(k\u00ebt\u00eb e kam folur n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/322686\/\">kumtes\u00ebn e vitit 2016<\/a><\/noindex>)<\/i>, dhe K8s do t\u00eb p\u00ebrdoret p\u00ebr ta nisur at\u00eb n\u00eb prodhim <i>(p\u00ebr k\u00ebt\u00eb \u2014 n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/331188\/\">shuma e fondeve was e ngjashme me vitin 2019, dhe n\u00eb faqet e Arch Linux dhe FFmpeg<\/a><\/noindex>)<\/i>.<\/p>\n<p>Si duket d\u00ebrgimi n\u00eb Kubernetes?<\/p>\n<ul>\n<li> Ka nj\u00eb repozitor Git me kodin dhe udh\u00ebzimet p\u00ebr nd\u00ebrtimin e tij. Aplikacioni nd\u00ebrtohet n\u00eb nj\u00eb imazh Docker dhe publikohet n\u00eb Docker Registry.<\/li>\n<li> N\u00eb t\u00eb nj\u00ebjtin repozitor ka edhe udh\u00ebzime p\u00ebr m\u00ebnyr\u00ebn e deploimit dhe nisjes s\u00eb aplikacionit. N\u00eb faz\u00ebn e deploimit, k\u00ebto udh\u00ebzime d\u00ebrgohen n\u00eb Kubernetes, i cili merr imazhin e nevojsh\u00ebm nga registry dhe e nis at\u00eb.<\/li>\n<li> P\u00ebr m\u00eb tep\u00ebr, zakonisht ka teste. Disa prej tyre mund t\u00eb kryhen gjat\u00eb publikimit t\u00eb imazhit. Gjithashtu mund t\u00eb (sip\u00ebr udh\u00ebzimeve t\u00eb nj\u00ebjta) rrisni nj\u00eb kopje t\u00eb aplikacionit (n\u00eb nj\u00eb hap\u00ebsir\u00eb emri t\u00eb ve\u00e7ant\u00eb K8s ose n\u00eb nj\u00eb klaster t\u00eb ve\u00e7ant\u00eb) dhe t\u00eb kryeni testet aty.<\/li>\n<li> N\u00eb fund, na nevojitet nj\u00eb sistem CI q\u00eb merr ngjarje nga Git (ose shtypje butonash) dhe aktivizon t\u00eb gjitha fazat e caktuara: nd\u00ebrtimi, publikimi, vendosja, testimi.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"werf - mjeti yn\u00eb p\u00ebr CI\/CD n\u00eb Kubernetes (shqyrtim dhe video prezantimi)\" src=\"\/wp-content\/uploads\/2019\/08\/ec0d1fd1bf1a68cca92badf7cf1affe1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nK\u00ebtu ka disa v\u00ebrejtje t\u00eb r\u00ebnd\u00ebsishme:<\/p>\n<ol>\n<li> Duke qen\u00eb se ne kemi nj\u00eb infrastruktur\u00eb t\u00eb pandryshueshme <i>(infrastructure e pandryshueshme)<\/i>, imazhi i aplikacionit, q\u00eb p\u00ebrdoret n\u00eb t\u00eb gjitha fazat (staging, prodhim etj.), <b>duhet t\u00eb jet\u00eb nj\u00eb<\/b>. <i>P\u00ebr m\u00eb shum\u00eb informacion mbi k\u00ebt\u00eb me shembuj kam folur <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/324274\/\">k\u00ebtu<\/a><\/noindex>.<\/i><\/li>\n<li> Duke qen\u00eb se ndiqnim qasjen infrastruktur\u00eb si kod <i>(IaC)<\/i>, kodi i aplikacionit, udh\u00ebzimet p\u00ebr nd\u00ebrtimin dhe nisjen e tij duhet t\u00eb jen\u00eb <b>pik\u00ebrisht n\u00eb nj\u00eb repozitor<\/b>. <i>P\u00ebr m\u00eb shum\u00eb mbi k\u00ebt\u00eb - shih n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/324274\/\">at\u00eb kumtes\u00eb t\u00eb nj\u00ebjt\u00eb<\/a><\/noindex>.<\/i><\/li>\n<li> Faza e dor\u00ebzimit <i>(delivery)<\/i> zakonisht e shohim k\u00ebshtu: aplikacioni \u00ebsht\u00eb nd\u00ebrtuar, testuar, l\u00ebshuar <i>(faz\u00eb release)<\/i> dhe gjith\u00e7ka \u2014 d\u00ebrgesa u realizua. Por n\u00eb t\u00eb v\u00ebrtet\u00eb, p\u00ebrdoruesi merr at\u00eb q\u00eb ju publikoni, <b>jo<\/b> kur e \u00e7uat at\u00eb n\u00eb production, dhe kur ai ka mund\u00ebsin\u00eb t\u00eb hyj\u00eb aty dhe ky production funksionoi. Prandaj, mendoj se zinxhiri i d\u00ebrges\u00ebs p\u00ebrfundon <b>vet\u00ebm n\u00eb faz\u00ebn e operimit<\/b> <i>(run)<\/i>, dhe n\u00ebse flasim m\u00eb sakt\u00eb, madje n\u00eb at\u00eb moment, kur kodi u hoq nga production (duke e z\u00ebvend\u00ebsuar at\u00eb me nj\u00eb t\u00eb ri).<\/li>\n<\/ol>\n<p>\nLe t\u00eb kthehemi te skema e d\u00ebrges\u00ebs t\u00eb p\u00ebrmendur m\u00eb sip\u00ebr n\u00eb Kubernetes: ajo u shpik jo vet\u00ebm nga ne, por edhe nga praktisht \u00e7do kush q\u00eb \u00ebsht\u00eb marr\u00eb me k\u00ebt\u00eb problem. E v\u00ebrteta \u00ebsht\u00eb se tani ky model quhet GitOps <i>(m\u00eb shum\u00eb p\u00ebr termin dhe idet\u00eb q\u00eb q\u00ebndrojn\u00eb pas tij mund t\u00eb lexoni <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/458878\/\">k\u00ebtu<\/a><\/noindex>)<\/i>. Le t\u00eb shohim fazat e skem\u00ebs.<\/p>\n<h2>Faza e nd\u00ebrtimit (build)<\/h2>\n<p>\nDuket se \u00e7far\u00eb mund t\u00eb thuhet n\u00eb vitin 2019 p\u00ebr nd\u00ebrtimin e imazheve Docker, kur t\u00eb gjith\u00eb din\u00eb t\u00eb shkruajn\u00eb Dockerfile dhe t\u00eb ekzekutojn\u00eb <code>docker build<\/code>?.. \u0412\u043e\u0442 \u043d\u044e\u0430\u043d\u0441\u044b, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435:<\/p>\n<ol>\n<li> <b>Pesha e imazhit<\/b> ka r\u00ebnd\u00ebsi, prandaj p\u00ebrdorni <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/develop\/develop-images\/multistage-build\/\">multi-stage<\/a><\/noindex>, p\u00ebr t\u00eb l\u00ebn\u00eb n\u00eb imazh vet\u00ebm at\u00eb q\u00eb \u00ebsht\u00eb n\u00eb t\u00eb v\u00ebrtet\u00eb e nevojshme p\u00ebr funksionimin e aplikacionit.<\/li>\n<li> <b>Numri i shtresave<\/b> duhet minimizuar, duke i kombinuar zinxhir\u00ebt e <code>RUN<\/code>-komandave sipas kuptimit.<\/li>\n<li> Megjithat\u00eb, kjo shton probleme <b>n\u00eb debugging<\/b>, sepse kur ndodhi nj\u00eb gabim n\u00eb nd\u00ebrtim, duhet t\u00eb gjejm\u00eb at\u00eb komand\u00eb t\u00eb nevojshme nga zinxhiri q\u00eb shkaktoi problemin.<\/li>\n<li> <b>Shpejt\u00ebsia e nd\u00ebrtimit<\/b> \u00ebsht\u00eb e r\u00ebnd\u00ebsishme, sepse duam t\u00eb nxjerrim ndryshime shpejt dhe t\u00eb shohim rezultatin. P\u00ebr shembull, nuk \u00ebsht\u00eb d\u00ebshir\u00eb t\u00eb ripohojm\u00eb var\u00ebsit\u00eb n\u00eb bibliotekat e gjuh\u00ebs n\u00eb \u00e7do nd\u00ebrtim t\u00eb aplikacionit.<\/li>\n<li> Shpesh nga nj\u00eb Git-repository k\u00ebrkohen <b>shum\u00eb imazhe<\/b>, q\u00eb mund t\u00eb zgjidhet me nj\u00eb grup Dockerfile (ose faza t\u00eb em\u00ebruara n\u00eb nj\u00eb skedar) dhe nj\u00eb skript Bash p\u00ebr nd\u00ebrtimin e tyre t\u00eb renditur.<\/li>\n<\/ol>\n<p>\nKjo ishte vet\u00ebm maja e ajsbergut me t\u00eb cilin p\u00ebrballen t\u00eb gjith\u00eb. Por ekzistojn\u00eb edhe probleme t\u00eb tjera, n\u00eb ve\u00e7anti:<\/p>\n<ol>\n<li> Shpesh n\u00eb faz\u00ebn e nd\u00ebrtimit na nevojitet t\u00eb <b>montojm\u00eb<\/b> (p\u00ebr shembull, t\u00eb ruhet rezultati i komand\u00ebs si apt n\u00eb nj\u00eb drejtori t\u00eb jashtme).<\/li>\n<li> Ne duam <b>Ansible<\/b> n\u00eb vend q\u00eb t\u00eb shkruhet n\u00eb shell.<\/li>\n<li> Ne duam <b>t\u00eb nd\u00ebrtojm\u00eb pa Docker<\/b> (pse na nevojitet nj\u00eb makin\u00eb virtuale shtes\u00eb, n\u00eb t\u00eb cil\u00ebn duhet t\u00eb gjitha t\u00eb konfigurohen p\u00ebr k\u00ebt\u00eb, kur tashm\u00eb ekziston nj\u00eb klaster Kubernetes, n\u00eb t\u00eb cilin mund t\u00eb nisim konteinerit?).<\/li>\n<li> <b>Nd\u00ebrtimi paralel<\/b>, e cila mund t\u00eb kuptohet n\u00eb m\u00ebnyra t\u00eb ndryshme: komanda t\u00eb ndryshme nga Dockerfile (n\u00ebse p\u00ebrdoret multi-stage), disa komite nga nj\u00eb depo, disa Dockerfile.<\/li>\n<li> <b>Nd\u00ebrtimi i shp\u00ebrndar\u00eb<\/b>: ne duam t\u00eb nd\u00ebrtojm\u00eb di\u00e7ka n\u00eb pod, t\u00eb cilat jan\u00eb \"ephemerale\", pasi humbasin cache, k\u00ebshtu q\u00eb duhet ta mbajm\u00eb ndonj\u00ebher\u00eb ndryshe.<\/li>\n<li> N\u00eb fund, un\u00eb e quajta maj\u00ebn e d\u00ebshirave <b>automagji<\/b>: do t\u00eb ishte p\u00ebrsosm\u00ebrisht t\u00eb hysh n\u00eb depo, t\u00eb shkruash ndonj\u00eb komand\u00eb dhe t\u00eb marr\u00ebsh nj\u00eb imazh t\u00eb gatsh\u00ebm, i nd\u00ebrtuar me kuptimin se si dhe \u00e7far\u00eb duhet b\u00ebr\u00eb si\u00e7 duhet. Megjithat\u00eb, personalisht nuk jam i sigurt se t\u00eb gjitha nuancat mund t\u00eb parashikohen k\u00ebshtu.<\/li>\n<\/ol>\n<p>\nDhe ja, ka projekte:<\/p>\n<ul>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/moby\/buildkit\">moby\/buildkit<\/a><\/noindex> \u2014 nd\u00ebrtuesi nga kompania Docker Inc (tani i integruar n\u00eb versionet aktuale t\u00eb Docker), e cila p\u00ebrpiqet t\u00eb zgjidh\u00eb t\u00eb gjitha k\u00ebto probleme;<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/GoogleContainerTools\/kaniko\">kaniko<\/a><\/noindex> \u2014 nd\u00ebrtuesi nga Google, q\u00eb lejon nd\u00ebrtimin pa Docker;<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/buildpacks.io\/\">Buildpacks.io<\/a><\/noindex> \u2014 p\u00ebrpjekja e CNCF p\u00ebr t\u00eb b\u00ebr\u00eb automagjin\u00eb dhe, n\u00eb ve\u00e7anti, nj\u00eb zgjidhje interesante me rebase p\u00ebr shtresa;<\/li>\n<li> dhe ende shum\u00eb utilitete t\u00eb tjer\u00eb, t\u00eb till\u00eb si <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/containers\/buildah\">buildah<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/genuinetools\/img\">genuinetools\/img<\/a><\/noindex>\u2026<\/li>\n<\/ul>\n<p>\n\u2026 dhe shihni sa shum\u00eb yje kan\u00eb n\u00eb GitHub. Pra, nga nj\u00ebra an\u00eb, <code>docker build<\/code> ka dhe mund t\u00eb b\u00ebj\u00eb di\u00e7ka, por n\u00eb fakt <b>\u00e7\u00ebshtja nuk \u00ebsht\u00eb e zgjidhur deri n\u00eb fund<\/b> \u2014 d\u00ebshmi p\u00ebr k\u00ebt\u00eb \u00ebsht\u00eb zhvillimi paralel i nd\u00ebrtuesve alternativ\u00eb, \u00e7do nj\u00ebri prej t\u00eb cil\u00ebve zgjidh nj\u00eb pjes\u00eb t\u00eb problemeve.<\/p>\n<h2>Nd\u00ebrtimi n\u00eb werf<\/h2>\n<p>\nK\u00ebshtu arrit\u00ebm te <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\">werf<\/a><\/noindex> <i>(m\u00eb par\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/333682\/\">i njohur<\/a><\/noindex> si dapp)<\/i> \u2014 nj\u00eb utilitar Open Source nga kompania \"Flant\", q\u00eb ne e zhvillojm\u00eb prej shum\u00eb vitesh. \u00c7do gj\u00eb filloi pes\u00eb vjet m\u00eb par\u00eb me skriptet Bash, q\u00eb optimizuan nd\u00ebrtimin e Dockerfile, dhe tre vitet e fundit p\u00ebrfundimisht \u00ebsht\u00eb zhvilluar brenda nj\u00eb projekti me depo t\u00eb vet. <i>(fillimisht n\u00eb Ruby, dhe pastaj <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/437044\/\">u ri-shkrua<\/a><\/noindex> n\u00eb Go, dhe nj\u00ebkoh\u00ebsisht u rinovua)<\/i>. \u00c7far\u00eb probleme t\u00eb nd\u00ebrtimit zgjidhen n\u00eb werf?<\/p>\n<p><img decoding=\"async\" alt=\"werf - mjeti yn\u00eb p\u00ebr CI\/CD n\u00eb Kubernetes (shqyrtim dhe video prezantimi)\" src=\"\/wp-content\/uploads\/2019\/08\/ab6aa8831b49977a419fd4cc3543eb83.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nProblemet e ngjyrosura me blu jan\u00eb tashm\u00eb t\u00eb realizuara, nd\u00ebrtimi paralel \u00ebsht\u00eb b\u00ebr\u00eb brenda nj\u00eb hosti, dhe problemet e sh\u00ebnuara me t\u00eb verdh\u00eb planifikojm\u00eb t'i p\u00ebrfundojm\u00eb deri n\u00eb fund t\u00eb ver\u00ebs.<\/p>\n<h2>Faza e publikimit n\u00eb registry (publish)<\/h2>\n<p>\nMblodh\u00ebm <code>docker push<\/code>\u2026 \u2014 \u00e7far\u00eb mund t\u00eb jet\u00eb e komplikuar p\u00ebr t\u00eb ngarkuar nj\u00eb imazh n\u00eb registry? Dhe k\u00ebtu lind pyetja: \"Cila etiket\u00eb t'i japim imazhit?\" Ajo lind p\u00ebr shkak se kemi <b>Gitflow<\/b> (ose nj\u00eb strategji tjet\u00ebr Git) dhe Kubernetes, dhe industria po p\u00ebrpiqet q\u00eb ajo \u00e7far\u00eb ndodh n\u00eb Kubernetes t\u00eb ndjek\u00eb at\u00eb q\u00eb b\u00ebhet n\u00eb Git. Sepse Git \u00ebsht\u00eb burimi yn\u00eb i vet\u00ebm i v\u00ebrtet\u00eb.<\/p>\n<p>\u00c7far\u00eb ka t\u00eb v\u00ebshtir\u00eb n\u00eb k\u00ebt\u00eb? <b>T\u00eb garantojm\u00eb riprodhueshm\u00ebrin\u00eb<\/b>: nga commiti n\u00eb Git, i cili p\u00ebr natyr\u00ebn e tij \u00ebsht\u00eb i pandryshuesh\u00ebm <i>(immutable)<\/i>, deri n\u00eb imazhin Docker, i cili duhet t\u00eb ruhet i till\u00eb.<\/p>\n<p>Na \u00ebsht\u00eb gjithashtu e r\u00ebnd\u00ebsishme <b>t\u00eb p\u00ebrcaktojm\u00eb origjin\u00ebn<\/b>, sepse duam t\u00eb kuptojm\u00eb nga cili komit u nd\u00ebrtua aplikacioni q\u00eb u aktivizua n\u00eb Kubernetes (at\u00ebher\u00eb mund t\u00eb b\u00ebjm\u00eb diferenca dhe gj\u00ebra t\u00eb ngjashme).<\/p>\n<h3>Strategjit\u00eb e etiketimit<\/h3>\n<p>\nE para \u00ebsht\u00eb e thjesht\u00eb <b>git tag<\/b>. Kemi nj\u00eb regjistrim me imazhin, i etiketuar si <code>1.0<\/code>. N\u00eb Kubernetes ka nj\u00eb stage dhe prodhim, ku ky imazh \u00ebsht\u00eb shkarkuar. N\u00eb Git ne b\u00ebjm\u00eb commit dhe n\u00eb nj\u00eb moment vendosim nj\u00eb etiket\u00eb <code>2.0<\/code>. E grumbullojm\u00eb at\u00eb sipas udh\u00ebzimeve nga repository dhe e vendosim n\u00eb regjistrin me etiket\u00ebn <code>2.0<\/code>. E d\u00ebrgojm\u00eb n\u00eb stage dhe, n\u00ebse gjith\u00e7ka shkon mir\u00eb, m\u00eb pas n\u00eb prodhim.<\/p>\n<p><img decoding=\"async\" alt=\"werf - mjeti yn\u00eb p\u00ebr CI\/CD n\u00eb Kubernetes (shqyrtim dhe video prezantimi)\" src=\"\/wp-content\/uploads\/2019\/08\/8545b84bfa63a91773f0d7dc1c2bd49f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nProblemi me k\u00ebt\u00eb qasje \u00ebsht\u00eb se fillimisht vendos\u00ebm etiket\u00ebn dhe vet\u00ebm pastaj e testuam dhe e d\u00ebrguam. Pse? S\u00eb pari, \u00ebsht\u00eb thjesht ilogjike: ne po l\u00ebshojm\u00eb nj\u00eb version t\u00eb softuerit, t\u00eb cilin nuk e kemi verifikuar ende (nuk mund ta b\u00ebjm\u00eb ndryshe, pasi p\u00ebr ta verifikuar, ne duhet t\u00eb vendosim etiket\u00ebn). S\u00eb dyti, nj\u00eb rrug\u00eb e till\u00eb nuk p\u00ebrputhet me Gitflow.<\/p>\n<p>Opcioni i dyt\u00eb \u00ebsht\u00eb <b>git commit + tag<\/b>. N\u00eb deg\u00ebn master ka nj\u00eb etiket\u00eb <code>1.0<\/code>; p\u00ebr t\u00eb, n\u00eb regjistrim \u2013 imazhi, i implementuar n\u00eb prodhim. P\u00ebr m\u00eb tep\u00ebr, n\u00eb klasterin Kubernetes ka skema preview dhe staging. M\u00eb pas ndjekim Gitflow: n\u00eb deg\u00ebn kryesore p\u00ebr zhvillim (<code>develop<\/code>) b\u00ebjm\u00eb karakteristika t\u00eb reja, duke rezultuar n\u00eb nj\u00eb commit me identifikuesin <code>#c1<\/code>. E grumbullojm\u00eb dhe e publikojm\u00eb n\u00eb regjistrin, duke p\u00ebrdorur k\u00ebt\u00eb identifikues (<code>#c1<\/code>). Me t\u00eb nj\u00ebjtin identifikues e d\u00ebrgojm\u00eb n\u00eb preview. Po ashtu, b\u00ebjm\u00eb me commitet <code>#c2<\/code> dhe <code>#c3<\/code>.<\/p>\n<p>Kur e kuptojm\u00eb se kemi mjaft karakteristika, fillojm\u00eb t\u00eb stabilizojm\u00eb gjith\u00e7ka. N\u00eb Git krijojm\u00eb nj\u00eb deg\u00eb <code>release_1.1<\/code> (bazuar n\u00eb <code>#c3<\/code> nga <code>develop<\/code>). Nuk do t\u00eb nevojitet t\u00eb grumbullojm\u00eb k\u00ebt\u00eb l\u00ebshim, sepse \u00ebsht\u00eb b\u00ebr\u00eb n\u00eb faz\u00ebn e m\u00ebparshme. Prandaj mund ta d\u00ebrgojm\u00eb thjesht n\u00eb staging. Nd\u00ebrsa korrigjojm\u00eb gabimet n\u00eb <code>#c4<\/code> dhe po ashtu e d\u00ebrgojm\u00eb n\u00eb staging. Paralelisht, n\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb zhvillohet puna n\u00eb <code>develop<\/code>, ku ndryshimet e ndihen nganj\u00ebher\u00eb nga <code>release_1.1<\/code>. N\u00eb nj\u00eb moment e marrim commit-in e grumbulluar dhe t\u00eb d\u00ebrguar n\u00eb staging, me t\u00eb cilin jemi t\u00eb k\u00ebnaqur (<code>#c25<\/code>).<\/p>\n<p>At\u00ebher\u00eb ne b\u00ebjm\u00eb nj\u00eb bashkim (me fast-forward) t\u00eb deg\u00ebs s\u00eb l\u00ebshimit (<code>release_1.1<\/code>) n\u00eb master. Vendosim n\u00eb k\u00ebt\u00eb commit nj\u00eb etiket\u00eb me versionin e ri (<code>1.1<\/code>). Por ky imazh \u00ebsht\u00eb tashm\u00eb nd\u00ebrtuar n\u00eb regjist\u00ebr, prandaj, p\u00ebr t\u00eb mos e nd\u00ebrtuar p\u00ebrs\u00ebri, ne thjesht shtojm\u00eb nj\u00eb etiket\u00eb t\u00eb dyt\u00eb n\u00eb imazhin ekzistues (tani ai n\u00eb regjist\u00ebr ka etiketat <code>#c25<\/code> dhe <code>1.1<\/code>). Pas k\u00ebsaj, e d\u00ebrgojm\u00eb n\u00eb prodhim.<\/p>\n<p>Ka nj\u00eb disavantazh, q\u00eb n\u00eb staging \u00ebsht\u00eb diskutuar nj\u00eb imazh (<code>#c25<\/code>), nd\u00ebrsa n\u00eb prodhim \u2013 si\u00e7 duket - nj\u00eb tjet\u00ebr (<code>1.1<\/code>), por ne e dim\u00eb se 'fizikisht' \u00ebsht\u00eb e nj\u00ebjta imazh nga regjistri.<\/p>\n<p><img decoding=\"async\" alt=\"werf - mjeti yn\u00eb p\u00ebr CI\/CD n\u00eb Kubernetes (shqyrtim dhe video prezantimi)\" src=\"\/wp-content\/uploads\/2019\/08\/b3fa2c34442aa401d1e7b30eb593be9a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMegjithat\u00eb, disavantazhi i v\u00ebrtet\u00eb \u00ebsht\u00eb se nuk ka mb\u00ebshtetje p\u00ebr komitetet e bashkimit, duhet t\u00eb b\u00ebjm\u00eb fast-forward.<\/p>\n<p>Mund t\u00eb shkojm\u00eb m\u00eb tej dhe t\u00eb b\u00ebjm\u00eb nj\u00eb trik... Le t\u00eb shqyrtojm\u00eb nj\u00eb shembull t\u00eb nj\u00eb Dockerfile t\u00eb thjesht\u00eb:<\/p>\n<pre><code class=\"plaintext\">FROM ruby:2.3 as assets\nRUN mkdir -p \/app\nWORKDIR \/app\nCOPY . .\/\nRUN gem install bundler &amp;&amp; bundle install\nRUN bundle exec rake assets:precompile\nCMD bundle exec puma -C config\/puma.rb\n\nFROM nginx:alpine\nCOPY --from=assets \/app\/public \/usr\/share\/nginx\/www\/public<\/code><\/pre>\n<p>\nDo ta nd\u00ebrtojm\u00eb k\u00ebt\u00eb skedar sipas k\u00ebsaj parimi, q\u00eb do t\u00eb marrim:<\/p>\n<ul>\n<li> SHA256 nga identifikuesit e imazheve t\u00eb p\u00ebrdorura (<code>ruby:2.3<\/code> dhe <code>nginx:alpine<\/code>), t\u00eb cilat jan\u00eb shumicat kontrolluese t\u00eb p\u00ebrmbajtjes s\u00eb tyre;<\/li>\n<li> t\u00eb gjitha komandat (<code>RUN<\/code>, <code>CMD<\/code> etj.);<\/li>\n<li> SHA256 nga skedar\u00ebt q\u00eb jan\u00eb shtuar.<\/li>\n<\/ul>\n<p>\n\u2026 dhe do t\u00eb marrim shumic\u00ebn kontrolluese (s\u00ebrish SHA256) nga nj\u00eb skedar i till\u00eb. Kjo <b>n\u00ebnshkrim<\/b> e gjith\u00e7kaje q\u00eb p\u00ebrcakton p\u00ebrmbajtjen e imazhit Docker.<\/p>\n<p><img decoding=\"async\" alt=\"werf - mjeti yn\u00eb p\u00ebr CI\/CD n\u00eb Kubernetes (shqyrtim dhe video prezantimi)\" src=\"\/wp-content\/uploads\/2019\/08\/b2af0b7952eefe26ddbb145955e778e8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nT\u00eb kthehemi te skema dhe <b>n\u00eb vend t\u00eb komiteteve do t\u00eb p\u00ebrdorim nj\u00eb n\u00ebnshkrim t\u00eb till\u00eb<\/b>, dmth. t\u00eb etiketojm\u00eb imazhet me n\u00ebnshkrime.<\/p>\n<p><img decoding=\"async\" alt=\"werf - mjeti yn\u00eb p\u00ebr CI\/CD n\u00eb Kubernetes (shqyrtim dhe video prezantimi)\" src=\"\/wp-content\/uploads\/2019\/08\/115f290bd5951614c041b3d510fae38e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTani, kur ne na nevojitet, p\u00ebr shembull, t\u00eb bashkojm\u00eb ndryshimet nga l\u00ebshimi n\u00eb master, mund t\u00eb b\u00ebjm\u00eb nj\u00eb komitet t\u00eb v\u00ebrtet\u00eb t\u00eb bashkimit: do t\u00eb ket\u00eb nj\u00eb identifikues tjet\u00ebr, por t\u00eb nj\u00ebjt\u00ebn n\u00ebnshkrim. Me t\u00eb nj\u00ebjtin identifikues do t\u00eb l\u00ebshojm\u00eb grafikun edhe n\u00eb prodhim.<\/p>\n<p>Mungesa \u00ebsht\u00eb se tani nuk do t\u00eb jet\u00eb e mundur t\u00eb p\u00ebrcaktojm\u00eb se cili komitet \u00ebsht\u00eb \u00e7uar n\u00eb production \u2014 shumicat kontrolluese punojn\u00eb vet\u00ebm n\u00eb nj\u00eb drejtim. Kjo problem zgjidhet me nj\u00eb shtres\u00eb shtes\u00eb me metadata \u2014 do t\u00eb flas m\u00eb shum\u00eb p\u00ebr k\u00ebt\u00eb m\u00eb von\u00eb.<\/p>\n<h3>Etiketimi n\u00eb werf<\/h3>\n<p>\nN\u00eb werf ne shkuam edhe m\u00eb tej dhe po p\u00ebrgatitemi t\u00eb b\u00ebjm\u00eb nj\u00eb nd\u00ebrtim t\u00eb shp\u00ebrndar\u00eb me cache, i cili nuk ruhet n\u00eb nj\u00eb makin\u00eb... Pra, ne po nd\u00ebrtuam imazhe Docker t\u00eb dy llojeve, t\u00eb cilat i quajm\u00eb <i>) \u2014 nj\u00eb nj\u00ebsi organizimi e pipeline-it, p\u00ebrmban 1+ detyr\u00eb,<\/i> dhe <i>image<\/i>.<\/p>\n<p>N\u00eb depozita Git werf ruhen udh\u00ebzime specifike p\u00ebr nd\u00ebrtim, q\u00eb p\u00ebrshkruajn\u00eb fazat e ndryshme t\u00eb nd\u00ebrtimit (<i>beforeInstall<\/i>, <i>instalo<\/i>, <i>paraSetup<\/i>, <i>setup<\/i>). Ne e nd\u00ebrtuam imazhin e par\u00eb t\u00eb faz\u00ebs me n\u00ebnshkrim, e cila \u00ebsht\u00eb p\u00ebrcaktuar si shumic\u00eb kontrolluese e hapave t\u00eb par\u00eb. Pastaj shtojm\u00eb kodin burimor, p\u00ebr imazhin e ri t\u00eb faz\u00ebs e llogarisim shumic\u00ebn kontrolluese... K\u00ebto operacione p\u00ebrs\u00ebriten p\u00ebr t\u00eb gjitha fazat, duke rezultuar n\u00eb nj\u00eb grup imazhesh t\u00eb fazave. Pastaj krijojm\u00eb imazhin p\u00ebrfundimtar, i cili p\u00ebrmban gjithashtu metadata mbi prejardhjen e tij. Dhe ky imazh ne e etiketojm\u00eb n\u00eb m\u00ebnyra t\u00eb ndryshme (detaje m\u00eb von\u00eb).<\/p>\n<p><img decoding=\"async\" alt=\"werf - mjeti yn\u00eb p\u00ebr CI\/CD n\u00eb Kubernetes (shqyrtim dhe video prezantimi)\" src=\"\/wp-content\/uploads\/2019\/08\/22df8b6347b45be19ecb889c102b92b5.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLe t\u00eb ndodh\u00eb q\u00eb nj\u00eb angazhim i ri t\u00eb shfaqet, ku \u00ebsht\u00eb ndryshuar vet\u00ebm kodi i aplikacionit. \u00c7far\u00eb do t\u00eb ndodh\u00eb? Do t\u00eb krijohet nj\u00eb patch p\u00ebr ndryshimet e kodit, nj\u00eb imazh i ri stage do t\u00eb p\u00ebrgatitet. N\u00ebnshkrimi i tij do t\u00eb p\u00ebrcaktohet si nj\u00eb kontrolli i shum\u00ebs s\u00eb vjet\u00ebr t\u00eb imazhit t\u00eb stage dhe patch-eve t\u00eb reja. Nga ky imazh do t\u00eb formohet dhe nj\u00eb imazh final i ri.<\/p>\n<p>Prandaj, imazhet stage jan\u00eb nj\u00eb kesh q\u00eb mund t\u00eb ruhet n\u00eb m\u00ebnyr\u00eb t\u00eb shp\u00ebrndar\u00eb, nd\u00ebrsa imazhet q\u00eb krijohen prej tij ngarkohen n\u00eb Docker Registry.<\/p>\n<p><img decoding=\"async\" alt=\"werf - mjeti yn\u00eb p\u00ebr CI\/CD n\u00eb Kubernetes (shqyrtim dhe video prezantimi)\" src=\"\/wp-content\/uploads\/2019\/08\/35805eca81605bd64c6910b7965b567e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Pastrimi i registry<\/h3>\n<p>\nNuk do t\u00eb flasim p\u00ebr fshirjen e shtresave q\u00eb kan\u00eb mbetur t\u00eb varura pas etiketave t\u00eb fshira, kjo \u00ebsht\u00eb nj\u00eb mund\u00ebsi standarde e Docker Registry vet\u00eb. B\u00ebhet fjal\u00eb p\u00ebr situat\u00ebn kur akumulohet nj\u00eb num\u00ebr i madh i etiketave Docker dhe ne e kuptojm\u00eb se nj\u00eb pjes\u00eb e tyre nuk na nevojitet m\u00eb, por ata po z\u00ebn\u00eb hap\u00ebsir\u00eb (dhe\/ose ne po paguajm\u00eb p\u00ebr t\u00eb).<\/p>\n<p>Cilat jan\u00eb strategjit\u00eb e pastrimit?<\/p>\n<ol>\n<li> Mund t\u00eb mos b\u00ebsh asgj\u00eb <b>n\u00eb pastrim<\/b>. Ndonj\u00ebher\u00eb \u00ebsht\u00eb gjithashtu m\u00eb e leht\u00eb t\u00eb paguash p\u00ebr hap\u00ebsir\u00ebn e tep\u00ebrt se sa t\u00eb zgjidhesh nga nj\u00eb klumb i madh i etiketave. Por kjo funksionon vet\u00ebm deri n\u00eb nj\u00eb pik\u00eb t\u00eb caktuar.<\/li>\n<li> <b>Rimbus i plot\u00eb<\/b>. N\u00ebse fshihen t\u00eb gjitha imazhet dhe rikonstruktivohen vet\u00ebm ato aktuese n\u00eb sistemin CI, at\u00ebher\u00eb mund t\u00eb ndodh\u00eb nj\u00eb problem. N\u00ebse kontejneri do t\u00eb rinis\u00eb n\u00eb prodhim, p\u00ebr t\u00eb do t\u00eb ngarkohet nj\u00eb imazh i ri \u2014 nj\u00eb q\u00eb nuk \u00ebsht\u00eb testuar nga askush. Kjo shkat\u00ebrron iden\u00eb e infrastruktur\u00ebs s\u00eb pandryshueshme.<\/li>\n<li> <b>Blu-jeshile<\/b>. Nj\u00eb registry filloi t\u00eb mbushet \u2014 ngarkohet imazhe n\u00eb nj\u00eb tjet\u00ebr. E nj\u00ebjta problematik\u00eb si n\u00eb m\u00ebnyr\u00ebn e m\u00ebparshme: n\u00eb cil\u00ebn pik\u00eb mund t\u00eb pastroni at\u00eb registry q\u00eb filloi t\u00eb mbushej?<\/li>\n<li> <b>Sipas koh\u00ebs<\/b>. T\u00eb fshihen t\u00eb gjitha imazhet m\u00eb t\u00eb vjetra se 1 muaj? Por patjet\u00ebr do t\u00eb ket\u00eb nj\u00eb sh\u00ebrbim q\u00eb nuk \u00ebsht\u00eb p\u00ebrdit\u00ebsuar p\u00ebr nj\u00eb muaj\u2026<\/li>\n<li> <b>Dore<\/b> t\u00eb p\u00ebrcaktoj\u00eb se \u00e7far\u00eb mund t\u00eb fshihet tashm\u00eb.<\/li>\n<\/ol>\n<p>\nN\u00eb t\u00eb v\u00ebrtet\u00eb, ka dy variante t\u00eb q\u00ebndrueshme: ose nuk pastroni ose nj\u00eb kombinim nga blue-green + manual. N\u00eb rastin e fundit, b\u00ebhet fjal\u00eb p\u00ebr k\u00ebt\u00eb: kur kuptoni se \u00ebsht\u00eb koha p\u00ebr t\u00eb pastruar regjistrin, krijoni nj\u00eb t\u00eb ri dhe shtoni t\u00eb gjitha imazhet e reja n\u00eb t\u00eb p\u00ebr nj\u00eb periudh\u00eb, p\u00ebr shembull, nj\u00eb muaj. Dhe pas nj\u00eb muaji shikoni cilat pod n\u00eb Kubernetes vazhdojn\u00eb t\u00eb p\u00ebrdorin regjistrin e vjet\u00ebr, dhe i transferoni ato gjithashtu n\u00eb regjistrin e ri.<\/p>\n<p>\u00c7far\u00eb kemi arritur n\u00eb <b>werf<\/b>? \u041c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c:<\/p>\n<ol>\n<li> Git head: t\u00eb gjitha etiketat, t\u00eb gjitha deg\u00ebt, - duke supozuar se gjith\u00e7ka q\u00eb \u00ebsht\u00eb etiketuar n\u00eb Git \u00ebsht\u00eb e nevojshme dhe n\u00eb imazhet (nd\u00ebrsa n\u00ebse jo, at\u00ebher\u00eb duhet t\u00eb fshihet n\u00eb vet\u00eb Git);<\/li>\n<li> t\u00eb gjitha pod&#8217;et q\u00eb po shkarkohen tani n\u00eb Kubernetes;<\/li>\n<li> ReplicaSet&#8217;et e vjetra (ato q\u00eb u shkarkuan koh\u00ebt e fundit), si dhe planifikojm\u00eb t\u00eb skanojm\u00eb l\u00ebshimet Helm dhe t\u00eb p\u00ebrzgjedhim imazhet m\u00eb t\u00eb fundit atje.<\/li>\n<\/ol>\n<p>\n\u2026 dhe e b\u00ebjm\u00eb k\u00ebt\u00eb grup whitelist \u2014 lista e imazheve q\u00eb nuk do t'i heqim. \u00c7do gj\u00eb tjet\u00ebr do ta pastronsim, pas s\u00eb cil\u00ebs do t\u00eb gjejm\u00eb imazhet stage jetimore dhe do t'i heqim ato gjithashtu.<\/p>\n<h2>Faza e deploy-it<\/h2>\n<p><\/p>\n<h3>Deklarativitet i besuesh\u00ebm<\/h3>\n<p>\nMomenti i par\u00eb, p\u00ebr t\u00eb cilin do t\u00eb doja t\u00eb t\u00ebrhiqja v\u00ebmendjen n\u00eb deploy, \u00ebsht\u00eb l\u00ebshimi i konfiguracionit t\u00eb rinovuar t\u00eb burimeve, i shpallur n\u00eb m\u00ebnyr\u00eb deklarative. Dokumenti origjinal YAML me p\u00ebrshkrimin e burimeve t\u00eb Kubernetes gjithmon\u00eb dallon shum\u00eb nga rezultati q\u00eb funksionon realisht n\u00eb klaster. Sepse Kubernetes shton n\u00eb konfiguracion:<\/p>\n<ol>\n<li> identifikuesit;<\/li>\n<li> informacionin e sh\u00ebrbimeve;<\/li>\n<li> shum\u00eb vlera p\u00ebrkat\u00ebse;<\/li>\n<li> seksionin me statusin aktual;<\/li>\n<li> ndryshimet e b\u00ebra gjat\u00eb pun\u00ebs s\u00eb admission webhook;<\/li>\n<li> rezultatin e pun\u00ebs s\u00eb kontrolluesve t\u00eb ndrysh\u00ebm (dhe planifikuesit).<\/li>\n<\/ol>\n<p>\nPra, kur shfaqet nj\u00eb konfigurim i ri burimi (<i>t\u00eb reja<\/i>), ne nuk mund ta marrim thjesht dhe ta shkruajm\u00eb at\u00eb mbi konfigurimin aktual, \"live\", (<i>live<\/i>). P\u00ebr k\u00ebt\u00eb, na duhen t\u00eb krahasojm\u00eb <i>t\u00eb reja<\/i> me konfigurimin e aplikuar m\u00eb par\u00eb (<i>last-applied<\/i>) dhe t\u00eb aplikojm\u00eb <i>live<\/i> patch-in e marr\u00eb.<\/p>\n<p>Ky qasje quhet <b>2-way merge<\/b>. Ai p\u00ebrdoret, p\u00ebr shembull, n\u00eb Helm.<\/p>\n<p>Ka edhe <b>3-way merge<\/b>, i cili dallon nga fakti se:<\/p>\n<ul>\n<li> duke krahasuar <i>last-applied<\/i> dhe <i>t\u00eb reja<\/i>, ne shohim \u00e7far\u00eb \u00ebsht\u00eb fshir\u00eb;<\/li>\n<li> duke krahasuar <i>t\u00eb reja<\/i> dhe <i>live<\/i>, ne shohim \u00e7far\u00eb \u00ebsht\u00eb shtuar ose ndryshuar;<\/li>\n<li> patch-i i totalizuar vihet mbi <i>live<\/i>.<\/li>\n<\/ul>\n<p>\nNe depolojm\u00eb 1000+ aplikacione me Helm, prandaj n\u00eb fakt jetojm\u00eb me bashkimin 2-way. Megjithat\u00eb, ai ka disa probleme, t\u00eb cilat i kemi zgjidhur me patch-et tona, q\u00eb ndihmojn\u00eb Helm&#8217;n t\u00eb punoj\u00eb normalisht.<\/p>\n<h3>Statusi real i l\u00ebshimit<\/h3>\n<p>\nPas k\u00ebsaj, nga nj\u00eb ngjarje t\u00eb radh\u00ebs, sistemi yn\u00eb CI gjeneron nj\u00eb konfigurim t\u00eb ri p\u00ebr Kubernetes, e d\u00ebrgon p\u00ebr t'u aplikuar <i>(apply)<\/i> n\u00eb klaster \u2014 me ndihm\u00ebn e Helm ose <code>kubectl apply<\/code>. Nd\u00ebrsa ndodh tashm\u00eb N-way merge i p\u00ebrshkruar, Kubernetes API p\u00ebrgjigjet miratuesh\u00ebm sistemit CI, dhe ai \u2014 p\u00ebrdoruesit t\u00eb tij.<\/p>\n<p><img decoding=\"async\" alt=\"werf - mjeti yn\u00eb p\u00ebr CI\/CD n\u00eb Kubernetes (shqyrtim dhe video prezantimi)\" src=\"\/wp-content\/uploads\/2019\/08\/fcc8251525f32c913f30fbcdc4296198.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMegjithat\u00eb, ka nj\u00eb problem t\u00eb madh: sepse <b>aplikaimi i suksessh\u00ebm nuk do t\u00eb thot\u00eb l\u00ebshim t\u00eb suksessh\u00ebm<\/b>. N\u00ebse Kubernetes kupton se cilat ndryshime duhet t\u00eb aplikohen, i zbatojn\u00eb ato - ne ende nuk e dim\u00eb se \u00e7far\u00eb do t\u00eb rezultoj\u00eb. P\u00ebr shembull, p\u00ebrdit\u00ebsimi dhe rilindja e pod&#8217;eve n\u00eb frontend mund t\u00eb kalojn\u00eb me sukses, nd\u00ebrsa n\u00eb backend jo, dhe do t\u00eb kemi versione t\u00eb ndryshme t\u00eb imazheve t\u00eb aplikacionit t\u00eb ndara.<\/p>\n<p>P\u00ebr t\u00eb b\u00ebr\u00eb gjith\u00e7ka si\u00e7 duhet, ky skem\u00eb k\u00ebrkon nj\u00eb element shtes\u00eb - nj\u00eb gjurmues t\u00eb ve\u00e7ant\u00eb q\u00eb do t\u00eb marri informacione p\u00ebr statusin nga Kubernetes API dhe do t'i transmetoj\u00eb ato p\u00ebr analiz\u00eb t\u00eb m\u00ebtejshme t\u00eb situat\u00ebs aktuale. Ne krijuam nj\u00eb bibliotek\u00eb Open Source n\u00eb Go - <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/kubedog\"><b>kubedog<\/b><\/a><\/noindex> <i>(shih njoftimin e saj <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/434160\/\">k\u00ebtu<\/a><\/noindex>)<\/i>, - e cila zgjidh k\u00ebt\u00eb problem dhe \u00ebsht\u00eb e integruar n\u00eb werf.<\/p>\n<p>Shtesat e k\u00ebtij gjurmuesi p\u00ebr nivelin werf konfigurtohen me an\u00eb t\u00eb annotimeve t\u00eb vendosura n\u00eb Deployments ose StatefulSets. Annotimi kryesor - <code>fail-mode<\/code> - kupton vlerat e m\u00ebposhtme:<\/p>\n<ul>\n<li> <code>IgnoreAndContinueDeployProcess<\/code> - injorojm\u00eb problemet e shp\u00ebrndarjes s\u00eb k\u00ebtij elementi dhe vazhdojm\u00eb me depon;<\/li>\n<li> <code>FailWholeDeployProcessImmediately<\/code> - nj\u00eb gabim n\u00eb k\u00ebt\u00eb element ndalon procesin e shp\u00ebrndarjes;<\/li>\n<li> <code>HopeUntilEndOfDeployProcess<\/code> - shpresojm\u00eb se ky element do t\u00eb funksionoj\u00eb deri n\u00eb fund t\u00eb shp\u00ebrndarjes.<\/li>\n<\/ul>\n<p>\nP\u00ebr shembull, nj\u00eb kombinim i till\u00eb i burimeve dhe vlerave t\u00eb annotimit <code>fail-mode<\/code>:<\/p>\n<p><img decoding=\"async\" alt=\"werf - mjeti yn\u00eb p\u00ebr CI\/CD n\u00eb Kubernetes (shqyrtim dhe video prezantimi)\" src=\"\/wp-content\/uploads\/2019\/08\/40e161710e8a535cd95f1eb66ca8407b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKur depolojm\u00eb p\u00ebr her\u00eb t\u00eb par\u00eb, baza e t\u00eb dh\u00ebnave (MongoDB) ndoshta ende nuk \u00ebsht\u00eb gati - Deployment&#8217;et do t\u00eb bien. Por mund t\u00eb presim momentin q\u00eb ajo t\u00eb nis\u00eb, dhe depolimi gjithsesi do t\u00eb kaloj\u00eb.<\/p>\n<p>Ekzistojn\u00eb gjithashtu dy annotime p\u00ebr kubedog n\u00eb werf:<\/p>\n<ul>\n<li> <code>failures-allowed-per-replica<\/code> - numri i d\u00ebshtimeve t\u00eb lejuara p\u00ebr \u00e7do replic\u00eb;<\/li>\n<li> <code>show-logs-until<\/code> \u2014 rregullon momentin deri n\u00eb t\u00eb cilin werf tregon (n\u00eb stdout) log-et nga t\u00eb gjitha pod&#8217;et q\u00eb po l\u00ebshohen. N\u00eb m\u00ebnyr\u00eb t\u00eb parazgjedhur, kjo \u00ebsht\u00eb <code>PodIsReady<\/code> (p\u00ebr t\u00eb injoruar mesazhet q\u00eb ndoshta nuk na duh\u00ebn, kur pod-i fillon t\u00eb marr\u00eb trafikun), megjithat\u00eb, vlerat e lejuara jan\u00eb gjithashtu <code>ControllerIsReady<\/code> dhe <code>EndOfDeploy<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h3>\u00c7far\u00eb tjet\u00ebr duam nga shp\u00ebrndarja?<\/h3>\n<p>\nP\u00ebrve\u00e7 dy pikave t\u00eb p\u00ebrshkruara tashm\u00eb, ne d\u00ebshirojm\u00eb:<\/p>\n<ul>\n<li> t\u00eb shohim <b>log-et<\/b> - p\u00ebr m\u00eb tep\u00ebr vet\u00ebm ato q\u00eb na duhen, jo t\u00eb gjitha pa ndonj\u00eb rend;<\/li>\n<li> t\u00eb ndjekim <b>progresin<\/b>, sepse n\u00ebse nj\u00eb pun\u00eb \"nuk z\u00ebvendoset\" p\u00ebr disa minuta, \u00ebsht\u00eb e r\u00ebnd\u00ebsishme t\u00eb kuptosh se \u00e7far\u00eb po ndodh;<\/li>\n<li> t\u00eb kemi <b>rul muajor<\/b> n\u00eb rast se di\u00e7ka shkoi keq (dhe p\u00ebr k\u00ebt\u00eb \u00ebsht\u00eb kritikisht e nevojshme t\u00eb din\u00eb statusin real t\u00eb shp\u00ebrndarjes). Shp\u00ebrndarja duhet t\u00eb jet\u00eb atomike: ose kalon deri n\u00eb fund, ose gjith\u00e7ka kthehet n\u00eb gjendjen e m\u00ebparshme.<\/li>\n<\/ul>\n<p><\/p>\n<h2>P\u00ebrfundime<\/h2>\n<p>\nNe si kompani p\u00ebr t\u00eb realizuar t\u00eb gjitha nuancat e p\u00ebrshkruara n\u00eb faza t\u00eb ndryshme t\u00eb dor\u00ebzimit (nd\u00ebrtimi, publikimi, shp\u00ebrndarja) mjafton nj\u00eb sistem CI dhe nj\u00eb utilitar <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\">werf<\/a><\/noindex>.<\/p>\n<p>P\u00ebrfundim:<\/p>\n<p><img decoding=\"async\" alt=\"werf - mjeti yn\u00eb p\u00ebr CI\/CD n\u00eb Kubernetes (shqyrtim dhe video prezantimi)\" src=\"\/wp-content\/uploads\/2019\/08\/bafba54f2df8740a1a12c93b3476e49a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMe ndihm\u00ebn e werf, ne kemi avancuar mir\u00eb n\u00eb zgjidhjen e nj\u00eb numri t\u00eb madh problemesh p\u00ebr inxhinier\u00ebt DevOps dhe do t\u00eb ishim t\u00eb lumtur n\u00ebse nj\u00eb komunitet m\u00eb i gjer\u00eb do t\u00eb provonte k\u00ebt\u00eb utilitar n\u00eb pun\u00eb. T\u00eb arrijm\u00eb rezultate t\u00eb mira bashk\u00eb do t\u00eb jet\u00eb m\u00eb e leht\u00eb.<\/p>\n<h2>Videot dhe slidet<\/h2>\n<p>\nVideo e prezantimit (~47 minuta):<\/p>\n<p><center><div class=\"youtube-placeholder\" data-id=\"cK3ackGUTLw\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/cK3ackGUTLw\/hqdefault.jpg\" alt=\"Luaj videon\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<p>Prezantimi i raportit:<\/p>\n<p><center><iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"\/\/speakerdeck.com\/player\/2033277984c04900b18940588edf1161\" frameborder=\"0\" allowfullscreen><\/iframe><\/center><\/p>\n<h2>P.S.<\/h2>\n<p>\nRaporte t\u00eb tjera n\u00eb lidhje me Kubernetes n\u00eb blogun ton\u00eb:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/459326\/\">Autoskalimi dhe menaxhimi i burimeve n\u00eb Kubernetes<\/a><\/noindex>\u00bb <i>(Dmitri Stolyarov; 27 prill 2019 n\u00eb \u00abStachka\u00bb)<\/i>;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/449096\/\">Zgjerimi dhe plot\u00ebsimi i Kubernetes<\/a><\/noindex>\u00bb <i>(Andrej Polovov; 8 prill 2019 n\u00eb Saint HighLoad++)<\/i>;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/431500\/\">Baza t\u00eb dh\u00ebnash dhe Kubernetes<\/a><\/noindex>\u00bb <i>(Dmitri Stolyarov; 8 n\u00ebntor 2018 n\u00eb HighLoad++)<\/i>;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/412901\/\">Monitorimi dhe Kubernetes<\/a><\/noindex>\u00bb <i>(Dmitry Stolyarov; 28 maj 2018 n\u00eb RootConf)<\/i>;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/345116\/\">Praktikat m\u00eb t\u00eb mira CI\/CD me Kubernetes dhe GitLab<\/a><\/noindex>\u00bb <i>(Dmitry Stolyarov; 7 n\u00ebntor 2017 n\u00eb HighLoad++)<\/i>;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/331188\/\">P\u00ebrvoja jon\u00eb me Kubernetes n\u00eb projekte t\u00eb vogla<\/a><\/noindex>\u00bb <i>(Dmitry Stolyarov; 6 qershor 2017 n\u00eb RootConf)<\/i>.<\/li>\n<\/ul>\n<p>Burimi: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460351\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>27 \u043c\u0430\u044f \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u0437\u0430\u043b\u0435 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 DevOpsConf 2019, \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0435\u0439 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0444\u0435\u0441\u0442\u0438\u0432\u0430\u043b\u044f \u0420\u0418\u0422++ 2019, \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0441\u0435\u043a\u0446\u0438\u0438 \u00ab\u041d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u0430\u044f \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0430\u00bb, \u043f\u0440\u043e\u0437\u0432\u0443\u0447\u0430\u043b \u0434\u043e\u043a\u043b\u0430\u0434 \u00abwerf \u2014 \u043d\u0430\u0448 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f CI\/CD \u0432 Kubernetes\u00bb. \u0412 \u043d\u0451\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e \u0442\u0435\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0445 \u0438 \u0432\u044b\u0437\u043e\u0432\u0430\u0445, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u0438 \u0434\u0435\u043f\u043b\u043e\u0435 \u0432 Kubernetes, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e \u043d\u044e\u0430\u043d\u0441\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043c\u0435\u0442\u043d\u044b \u043d\u0435 \u0441\u0440\u0430\u0437\u0443. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":27531,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-36754","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=\"27 \u043c\u0430\u044f \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u0437\u0430\u043b\u0435 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 DevOpsConf 2019, \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0435\u0439 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0444\u0435\u0441\u0442\u0438\u0432\u0430\u043b\u044f \u0420\u0418\u0422++ 2019, \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0441\u0435\u043a\u0446\u0438\u0438 \u00ab\u041d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u0430\u044f \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0430\u00bb, \u043f\u0440\u043e\u0437\u0432\u0443\u0447\u0430\u043b.\" \/>\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\/sq\/blog\/administrirovanie\/werf-nash-instrument-dlya-ci-cd-v-kubernetes-obzor-i-video-doklada\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"sq_AL\" \/>\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\udd47werf \u2014 \u043d\u0430\u0448 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f CI\/CD \u0432 Kubernetes (\u043e\u0431\u0437\u043e\u0440 \u0438 \u0432\u0438\u0434\u0435\u043e \u0434\u043e\u043a\u043b\u0430\u0434\u0430) | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"27 \u043c\u0430\u044f \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u0437\u0430\u043b\u0435 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 DevOpsConf 2019, \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0435\u0439 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0444\u0435\u0441\u0442\u0438\u0432\u0430\u043b\u044f \u0420\u0418\u0422++ 2019, \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0441\u0435\u043a\u0446\u0438\u0438 \u00ab\u041d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u0430\u044f \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0430\u00bb, \u043f\u0440\u043e\u0437\u0432\u0443\u0447\u0430\u043b.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/werf-nash-instrument-dlya-ci-cd-v-kubernetes-obzor-i-video-doklada\" \/>\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:13:37+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:13:37+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\udd47werf \u2014 mjeti yn\u00eb p\u00ebr CI\/CD n\u00eb Kubernetes (raport dhe video e fjalimit) | ProHoster","description":"M\u00eb 27 maj n\u00eb sall\u00ebn kryesore t\u00eb konferenc\u00ebs DevOpsConf 2019, q\u00eb zhvillohet brenda festivalit RIT++ 2019, n\u00eb seksionin \u00abD\u00ebrgesa e vazhdueshme\u00bb, u shpreh.","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/werf-nash-instrument-dlya-ci-cd-v-kubernetes-obzor-i-video-doklada","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sq_AL","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\udd47werf \u2014 \u043d\u0430\u0448 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f CI\/CD \u0432 Kubernetes (\u043e\u0431\u0437\u043e\u0440 \u0438 \u0432\u0438\u0434\u0435\u043e \u0434\u043e\u043a\u043b\u0430\u0434\u0430) | ProHoster","og:description":"27 \u043c\u0430\u044f \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u0437\u0430\u043b\u0435 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 DevOpsConf 2019, \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0435\u0439 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0444\u0435\u0441\u0442\u0438\u0432\u0430\u043b\u044f \u0420\u0418\u0422++ 2019, \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0441\u0435\u043a\u0446\u0438\u0438 \u00ab\u041d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u0430\u044f \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0430\u00bb, \u043f\u0440\u043e\u0437\u0432\u0443\u0447\u0430\u043b.","og:url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/werf-nash-instrument-dlya-ci-cd-v-kubernetes-obzor-i-video-doklada","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:13:37+00:00","article:modified_time":"2019-10-31T19:13:37+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"36754","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-22 04:44:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:39:23","updated":"2026-01-22 04:44:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/36754","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=36754"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/36754\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/27531"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=36754"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=36754"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=36754"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}