{"id":35955,"date":"2019-10-31T22:08:26","date_gmt":"2019-10-31T19:08:26","guid":{"rendered":"https:\/\/prohoster.info\/blog\/razvertyvanie-prilozhenij-na-neskolkih-klasterah-kubernetes-s-helm\/"},"modified":"2019-10-31T22:08:26","modified_gmt":"2019-10-31T19:08:26","slug":"razvertyvanie-prilozhenij-na-neskolkih-klasterah-kubernetes-s-helm","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/razvertyvanie-prilozhenij-na-neskolkih-klasterah-kubernetes-s-helm","title":{"rendered":"Zhvillimi i aplikacioneve n\u00eb disa klaster\u00eb Kubernetes me Helm","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<\/p>\n<p><\/p>\n<h2 id=\"kak-dailymotion-ispolzuet-kubernetes-razvertyvanie-prilozheniy\">Si si Dailymotion p\u00ebrdor Kubernetes: implementimi i aplikacioneve<\/h2>\n<p><\/p>\n<p>Ne n\u00eb Dailymotion filluam t\u00eb p\u00ebrdorim Kubernetes n\u00eb prodhim 3 vjet m\u00eb par\u00eb. Por implementimi i aplikacioneve n\u00eb disa klaster\u00eb \u00ebsht\u00eb nj\u00eb k\u00ebnaq\u00ebsi e madhe, prandaj n\u00eb vitet e fundit kemi punuar p\u00ebr t\u00eb p\u00ebrmir\u00ebsuar mjetet dhe proceset tona.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"s-chego-nachalos\">Si filloi<\/h3>\n<p><\/p>\n<p>K\u00ebtu do t\u00eb tregojm\u00eb se si ne implementojm\u00eb aplikacionet tona n\u00eb disa klaster\u00eb Kubernetes n\u00eb mbar\u00eb bot\u00ebn.<\/p>\n<p><\/p>\n<p>P\u00ebr t\u00eb implementuar disa objekte Kubernetes nj\u00ebkoh\u00ebsisht, ne p\u00ebrdorim <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/\">Helm<\/a><\/noindex>, dhe t\u00eb gjitha chartet tona ruhen n\u00eb nj\u00eb depo git. P\u00ebr t\u00eb implementuar stack-un e plot\u00eb t\u00eb aplikacionit nga disa sh\u00ebrbime, ne p\u00ebrdorim at\u00eb q\u00eb quhet chart p\u00ebrmbledh\u00ebs. N\u00eb thelb, ky \u00ebsht\u00eb nj\u00eb chart q\u00eb shpall var\u00ebsit\u00eb dhe lejon inicializimin e API-s\u00eb dhe sh\u00ebrbimeve t\u00eb saj me nj\u00eb komand\u00eb.<\/p>\n<p><\/p>\n<p>Gjithashtu kemi shkruar nj\u00eb skript t\u00eb vog\u00ebl Python mbi Helm, p\u00ebr t\u00eb b\u00ebr\u00eb verifikime, p\u00ebr t\u00eb krijuar chartet, p\u00ebr t\u00eb shtuar sekrete dhe p\u00ebr t\u00eb implementuar aplikacionet. T\u00eb gjitha k\u00ebto detyra kryhen n\u00eb nj\u00eb platform\u00eb CI qendrore duke p\u00ebrdorur nj\u00eb imazh docker.<\/p>\n<p><\/p>\n<p>Le t\u00eb kalojm\u00eb n\u00eb thelb.<\/p>\n<p><\/p>\n<blockquote><p>Sh\u00ebnim. Kur ju e lexoni k\u00ebt\u00eb, versioni i par\u00eb kandidat i Helm 3 \u00ebsht\u00eb shpallur tashm\u00eb. Versioni kryesor p\u00ebrmban nj\u00eb mori p\u00ebrmir\u00ebsimesh, t\u00eb destinuara p\u00ebr t\u00eb zgjidhur disa probleme q\u00eb kemi p\u00ebrballuar n\u00eb t\u00eb kaluar\u00ebn.<\/p><\/blockquote>\n<p><\/p>\n<h3 id=\"rabochiy-process-razrabotki-chartov\">Procesi i zhvillimit t\u00eb chart-ve<\/h3>\n<p><\/p>\n<p>P\u00ebr aplikacionet ne p\u00ebrdorim deg\u00ebzim, dhe k\u00ebt\u00eb qasje e kemi vendosur ta p\u00ebrdorim n\u00eb chartet.<\/p>\n<p><\/p>\n<ul>\n<li>Dega <strong>dev<\/strong> p\u00ebrdoret p\u00ebr t\u00eb krijuar chartet, t\u00eb cilat do t\u00eb testohen n\u00eb klaster\u00ebt e zhvillimit.<\/li>\n<li>Kur k\u00ebrkesa p\u00ebr ndihm\u00eb d\u00ebrgohet n\u00eb <strong>master<\/strong>, ato kontrollohen n\u00eb staging.<\/li>\n<li>P\u00ebrfundimisht, ne krijojm\u00eb nj\u00eb k\u00ebrkes\u00eb p\u00ebr ndihm\u00eb, p\u00ebr t\u00eb d\u00ebrguar ndryshimet n\u00eb deg\u00ebn <strong>prod<\/strong> dhe p\u00ebr t'i aplikuar ato n\u00eb prodhim.<\/li>\n<\/ul>\n<p><\/p>\n<p>\u00c7do mjedis ka depozitat e tij private, t\u00eb cilat ruajn\u00eb chartet tona, dhe ne p\u00ebrdorim <noindex><a rel=\"nofollow\" href=\"https:\/\/chartmuseum.com\/\">Chartmuseum<\/a><\/noindex> me API shum\u00eb t\u00eb dobishme. K\u00ebshtu ne sigurojm\u00eb nj\u00eb ndarje strikte midis ambienteve dhe verifikimin e chart-ve n\u00eb kushte reale, para se t'i p\u00ebrdorim ato n\u00eb prodhim.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/rz\/vt\/uk\/rzvtuk6q7b_rkeaxnyujzhmfjog.png\"><\/a><\/noindex><\/p>\n<p><\/p>\n<p><em>Repot e chart-ve n\u00eb ambiente t\u00eb ndryshme<\/em><\/p>\n<p><\/p>\n<p>Vlen t\u00eb theksohet se kur zhvilluesit d\u00ebrgojn\u00eb deg\u00ebn dev, versioni i chart-it t\u00eb tyre d\u00ebrgohet automatikisht n\u00eb dev Chartmuseum. K\u00ebshtu t\u00eb gjith\u00eb zhvilluesit p\u00ebrdorin nj\u00eb depo dev dhe duhet t\u00eb tregojn\u00eb kujdes me versionin e tyre t\u00eb chart-it, p\u00ebr t\u00eb mos p\u00ebrdorur rast\u00ebsisht ndryshimet e t\u00eb tjer\u00ebve.<\/p>\n<p><\/p>\n<p>P\u00ebr m\u00eb tep\u00ebr, skripti yn\u00eb i vog\u00ebl Python kontrollon objektet Kubernetes sipas specifikimeve t\u00eb Kubernetes OpenAPI me an\u00eb t\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/kubeval.instrumenta.dev\/\">Kubeval<\/a><\/noindex>, para se t\u2019i publikoj\u00eb ato n\u00eb Chartmusem.<\/p>\n<p><\/p>\n<h3 id=\"obschee-opisanie-rabochego-processa-razrabotki-charta\">P\u00ebrshkrimi i p\u00ebrgjithsh\u00ebm i procesit t\u00eb zhvillimit t\u00eb chartit<\/h3>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/yd\/cw\/qw\/ydcwqw-vqfitu5bj8ky4nh7xxea.png\"><\/a><\/noindex><\/p>\n<p><\/p>\n<ol>\n<li>Konfigurimi i detyrave t\u00eb pipeline sipas specifikimit <noindex><a rel=\"nofollow\" href=\"https:\/\/gazr.io\/\">gazr.io<\/a><\/noindex> p\u00ebr kontrollin e cil\u00ebsis\u00eb (lint, testim t\u00eb nj\u00ebsi).<\/li>\n<li>D\u00ebrgimi i imazhit docker me mjetet Python, t\u00eb cilat shp\u00ebrndajn\u00eb aplikacionet tona.<\/li>\n<li>Konfigurimi i mjedisit sipas emrit t\u00eb deg\u00ebs.<\/li>\n<li>Kontrollimi i skedar\u00ebve yaml t\u00eb Kubernetes me an\u00eb t\u00eb Kubeval.<\/li>\n<li>Rritja automatike e versionit t\u00eb chartit dhe t\u00eb chart\u00ebve t\u00eb tij prind, (chart\u00ebve q\u00eb varen nga charti n\u00eb ndryshim).<\/li>\n<li>D\u00ebrgimi i chartit n\u00eb Chartmuseum, i cili p\u00ebrputhet me mjedisin e tij<\/li>\n<\/ol>\n<p><\/p>\n<h2 id=\"upravlenie-razlichiyami-v-klasterah\">Menaxhimi i diferencave n\u00eb klaster\u00eb<\/h2>\n<p><\/p>\n<h3 id=\"federaciya-klasterov\">Federata e klaster\u00ebve<\/h3>\n<p><\/p>\n<p>Ishte nj\u00eb koh\u00eb kur ne p\u00ebrdornim <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/cluster-administration\/federation\/\">federat\u00ebn e klaster\u00ebve Kubernetes<\/a><\/noindex>, ku mund t\u00eb shpalleshin objektet Kubernetes nga nj\u00eb pik\u00eb p\u00ebrfundimtare API. Por lind\u00ebn probleme. P\u00ebr shembull, disa objekte Kubernetes nuk mund t\u00eb krijoheshin n\u00eb pik\u00ebn p\u00ebrfundimtare t\u00eb federat\u00ebs, duke e b\u00ebr\u00eb t\u00eb v\u00ebshtir\u00eb mb\u00ebshtetje p\u00ebr objektet e bashkuara dhe objekte t\u00eb tjera p\u00ebr klaster\u00eb t\u00eb ve\u00e7ant\u00eb.<\/p>\n<p><\/p>\n<p>P\u00ebr t\u00eb zgjidhur problemin, ne filluam t\u00eb menaxhonim klaster\u00ebt n\u00eb m\u00ebnyr\u00eb t\u00eb pavarur, duke e thjeshtuar ndjesh\u00ebm procesin (p\u00ebrdoruam versionin e par\u00eb t\u00eb federat\u00ebs; n\u00eb t\u00eb dytin, di\u00e7ka mund t\u00eb ket\u00eb ndryshuar).<\/p>\n<p><\/p>\n<h3 id=\"georaspredelennaya-platforma\">Platforma e shp\u00ebrndar\u00eb gjeografikisht<\/h3>\n<p><\/p>\n<p>Aktualisht, platforma jon\u00eb \u00ebsht\u00eb e shp\u00ebrndar\u00eb n\u00eb 6 rajone \u2014 3 lokale dhe 3 n\u00eb cloud.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/jq\/c1\/mr\/jqc1mru36g5byams4wddzducauw.png\"><\/a><\/noindex><br \/>\n<em>Depoja e shp\u00ebrndar\u00eb<\/em><\/p>\n<p><\/p>\n<h3 id=\"globalnye-znacheniya-helm\">Vlerat globale t\u00eb Helm-it<\/h3>\n<p><\/p>\n<p>4 vlera globale t\u00eb Helm-it lejojn\u00eb t\u00eb p\u00ebrcaktohen ndryshimet mes klaster\u00ebve. T\u00eb gjith\u00eb chart\u00ebt e tanish\u00ebm kan\u00eb vlera minimale parazgjedhore.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">global:\n  cloud: True\n  env: staging\n  region: us-central1\n  clusterName: staging-us-central1<\/code><\/pre>\n<p><\/p>\n<p><em>Vlerat globale<\/em><\/p>\n<p><\/p>\n<p>K\u00ebto vlera ndihmojn\u00eb n\u00eb p\u00ebrcaktimin e kontekstit p\u00ebr aplikacionet tona dhe p\u00ebrdoren p\u00ebr detyra t\u00eb ndryshme: monitorim, gjurmim, regjistrim, thirrje t\u00eb jashtme, shkall\u00ebzim etj.<\/p>\n<p><\/p>\n<ul>\n<li>\"cloud\": ne kemi nj\u00eb platform\u00eb hibride Kubernetes. P\u00ebr shembull, API-ja jon\u00eb shp\u00ebrndahet n\u00eb zonat GCP dhe n\u00eb qendrat tona t\u00eb t\u00eb dh\u00ebnave.<\/li>\n<li>\"env\": disa vlera mund t\u00eb ndryshojn\u00eb p\u00ebr mjediset jo-funksionale. P\u00ebr shembull, p\u00ebrcaktimi i burimeve dhe konfigurimi i automatik\u00ebs.<\/li>\n<li>\"region\": kjo informacion ndihmon n\u00eb p\u00ebrcaktimin e vendndodhjes s\u00eb klasterit dhe mund t\u00eb p\u00ebrdoret p\u00ebr t\u00eb p\u00ebrcaktuar pik\u00ebt m\u00eb t\u00eb af\u00ebrta p\u00ebr sh\u00ebrbimet e jashtme.<\/li>\n<li>\"clusterName\": n\u00ebse dhe kur d\u00ebshirojm\u00eb t\u00eb p\u00ebrcaktojm\u00eb nj\u00eb vler\u00eb p\u00ebr nj\u00eb klaster t\u00eb ve\u00e7ant\u00eb.<\/li>\n<\/ul>\n<p><\/p>\n<p>Ja nj\u00eb shembull konkret:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">{{\n\/* Kthen kopjet e Horizontal Pod Autoscaler p\u00ebr GraphQL*\/}}\n{{- definoni \"graphql.hpaReplicas\" -}}\n{{- n\u00ebse eq .Values.global.env \"prod\" }}\n{{- n\u00ebse eq .Values.global.region \"europe-west1\" }}\nminReplicas: 40\n{{- p\u00ebrndryshe }}\nminReplicas: 150\n{{- p\u00ebrfundoni }}\nmaxReplicas: 1400\n{{- p\u00ebrndryshe }}\nminReplicas: 4\nmaxReplicas: 20\n{{- p\u00ebrfundoni }}\n{{- p\u00ebrfundoni -}}<\/code><\/pre>\n<p><\/p>\n<p><em>Shembulli i shablonit Helm<\/em><\/p>\n<p><\/p>\n<p>Kjo logjik\u00eb p\u00ebrcaktohet n\u00eb nj\u00eb shabllon ndihm\u00ebs, p\u00ebr t\u00eb mos ndotur YAML-n\u00eb e Kubernetes.<\/p>\n<p><\/p>\n<h3 id=\"obyavlenie-prilozheniya\">Deklarata e aplikacionit<\/h3>\n<p><\/p>\n<p>Veglat tona t\u00eb shp\u00ebrndarjes bazohen n\u00eb disa skedar\u00eb YAML. M\u00eb posht\u00eb \u00ebsht\u00eb nj\u00eb shembull se si ne shpallim sh\u00ebrbimin dhe topologjin\u00eb e tij t\u00eb shkall\u00ebzimit (numrin e kopjeve) n\u00eb klaster.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">l\u00ebshime:\n  - foo.world\n\nfoo.world:                # Emri i l\u00ebshimit\n  sh\u00ebrbimet:               # Lista e aplikacioneve\/projekteve t\u00eb dailymotion\n    foobar:\n      chart_name: foo-foobar\n      repo: git@github.com:dailymotion\/foobar\n      kontekstet:\n        prod-europe-west1:\n          shp\u00ebrndarjet:\n            - emri: foo-bar-baz\n              kopjet: 18\n            - emri: shp\u00ebrndarja-tjet\u00ebr\n              kopjet: 3<\/code><\/pre>\n<p><\/p>\n<p><em>P\u00ebrcaktimi i sh\u00ebrbimit<\/em><\/p>\n<p><\/p>\n<p>Kjo \u00ebsht\u00eb nj\u00eb skem\u00eb e t\u00eb gjitha hapave q\u00eb p\u00ebrcaktojn\u00eb rrjedh\u00ebn ton\u00eb t\u00eb shp\u00ebrndarjes. Hapi p\u00ebrfundimtar shp\u00ebrndan aplikacionin nj\u00ebkoh\u00ebsisht n\u00eb disa klaster\u00eb pune.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/iu\/qh\/xk\/iuqhxki4nfqoi0mus258j0feylu.png\"><\/a><\/noindex><br \/>\n<em>Hapat e shp\u00ebrndarjes n\u00eb Jenkins<\/em><\/p>\n<p><\/p>\n<h3 id=\"a-sekrety\">Dhe sekretet?<\/h3>\n<p><\/p>\n<p>Sa i p\u00ebrket siguris\u00eb, ne p\u00ebrcjellim t\u00eb gjitha sekretet nga vende t\u00eb ndryshme dhe i ruajm\u00eb ato n\u00eb nj\u00eb depot unik <noindex><a rel=\"nofollow\" href=\"https:\/\/www.vaultproject.io\/\">Vault<\/a><\/noindex> n\u00eb Paris.<\/p>\n<p><\/p>\n<p>Veglat tona t\u00eb shp\u00ebrndarjes nxjerrin vlerat e sekretet nga Vault dhe, kur vjen koha p\u00ebr shp\u00ebrndarje, i futin ato n\u00eb Helm.<\/p>\n<p><\/p>\n<p>P\u00ebr k\u00ebt\u00eb, ne kemi p\u00ebrcaktuar nj\u00eb p\u00ebrputhje midis sekretet n\u00eb Vault dhe sekretet q\u00eb nevojiten nga aplikacionet tona:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">sekretet:                                                                                                                                                                                                        \n     - sekret_id: \"stack1-app1-password\"                                                                                                                                                                                  \n       kontekstet:                                                                                                                                                                                                   \n         - emri: \"default\"                                                                                                                                                                                         \n           rrugaVault: \"\\\/kv\\\/dev\\\/stack1\\\/app1\\\/test\"                                                                                                                                                               \n           \u00e7el\u00ebsiVault: \"password\"                                                                                                                                                                                    \n         - emri: \"cluster1\"                                                                                                                                                                           \n           rrugaVault: \"\\\/kv\\\/dev\\\/stack1\\\/app1\\\/test\"                                                                                                                                                               \n           \u00e7el\u00ebsiVault: \"password\"<\/code><\/pre>\n<p><\/p>\n<ul>\n<li>Ne kemi p\u00ebrcaktuar rregullat e p\u00ebrgjithshme q\u00eb duhet t\u00eb ndiqen gjat\u00eb regjistrimit t\u00eb sekret\u00ebve n\u00eb Vault.<\/li>\n<li>N\u00ebse sekreti i p\u00ebrket <strong>nj\u00eb konteksti apo klasteri t\u00eb caktuar<\/strong>, \u00ebsht\u00eb e nevojshme t\u00eb shtoni nj\u00eb regjistrim t\u00eb ve\u00e7ant\u00eb. (K\u00ebtu konteksti cluster1 ka nj\u00eb vler\u00eb t\u00eb vetme p\u00ebr sekretin stack-app1-password).<\/li>\n<li>N\u00eb t\u00eb kund\u00ebrt, p\u00ebrdoret vlera <strong>si parazgjedhje<\/strong>.<\/li>\n<li>P\u00ebr \u00e7do pik\u00eb n\u00eb k\u00ebt\u00eb list\u00eb, n\u00eb <strong>sekretin Kubernetes<\/strong> n\u00eb vendoset nj\u00eb \u00e7ift \u00e7el\u00ebs-vler\u00eb. Prandaj, modeli i sekretit n\u00eb diagramet tona \u00ebsht\u00eb shum\u00eb i thjesht\u00eb.<\/li>\n<\/ul>\n<p><\/p>\n<pre><code class=\"plaintext\">apiVersion: v1\ndata:\n{{- range $key,$value := .Values.secrets }}\n  {{ $key }}: {{ $value | b64enc | quote }}\n{{ end }}\nlloji: Secret\nmetadata:\n  emri: \"{{ .Chart.Name }}\"\n  etiketa:\n    versioniChart: \"{{ .Chart.Version }}\"\n    versioniTiller: \"{{ .Capabilities.TillerVersion.SemVer }}\"\ntipi: Opaque<\/code><\/pre>\n<p><\/p>\n<h2 id=\"problemy-i-ogranicheniya\">Problemet dhe kufizimet<\/h2>\n<p><\/p>\n<h3 id=\"rabota-s-neskolkimi-repozitoriyami\">Puna me disa depo<\/h3>\n<p><\/p>\n<p>Tani ne ndajm\u00eb zhvillimin e diagrameve dhe aplikacioneve. Kjo do t\u00eb thot\u00eb se zhvilluesit duhet t\u00eb punojn\u00eb n\u00eb dy depo git: nj\u00eb p\u00ebr aplikacionin dhe nj\u00eb tjet\u00ebr p\u00ebr p\u00ebrcaktimin e shp\u00ebrndarjes s\u00eb tij n\u00eb Kubernetes. 2 depo git jan\u00eb 2 procese pune, dhe p\u00ebr nj\u00eb fillestar \u00ebsht\u00eb e leht\u00eb t\u00eb ngat\u00ebrrohet.<\/p>\n<p><\/p>\n<h3 id=\"upravlyat-obobschennymi-chartami-hlopotno\">T\u00eb menaxhosh diagramet e p\u00ebrgjithshme \u00ebsht\u00eb e m\u00ebrzitshme<\/h3>\n<p><\/p>\n<p>Si\u00e7 e p\u00ebrmend\u00ebm, diagramet e p\u00ebrgjithshme jan\u00eb shum\u00eb t\u00eb dobishme p\u00ebr p\u00ebrcaktimin e var\u00ebsive dhe shp\u00ebrndarjen e shpejt\u00eb t\u00eb disa aplikacioneve. Por ne p\u00ebrdorim <code>--reuse-values<\/code>, p\u00ebr t\u00eb shmangur kalimin e t\u00eb gjitha vlerave \u00e7do her\u00eb kur ne shp\u00ebrndajm\u00eb nj\u00eb aplikacion q\u00eb b\u00ebn pjes\u00eb n\u00eb k\u00ebt\u00eb diagram t\u00eb p\u00ebrgjithsh\u00ebm.<\/p>\n<p><\/p>\n<p>N\u00eb procesin e pun\u00ebs s\u00eb d\u00ebrges\u00ebs s\u00eb vazhdueshme kemi vet\u00ebm dy vlera q\u00eb ndryshojn\u00eb rregullisht: numri i kopjeve dhe etiketa e imazhit (versioni). Vlera t\u00eb tjera, m\u00eb t\u00eb q\u00ebndrueshme, ndryshojn\u00eb manualisht dhe kjo \u00ebsht\u00eb mjaft e nd\u00ebrlikuar. M\u00eb tep\u00ebr, nj\u00eb gabim n\u00eb shp\u00ebrndarjen e diagramit t\u00eb p\u00ebrgjithsh\u00ebm mund t\u00eb sjell\u00eb d\u00ebshtime t\u00eb r\u00ebnda, si\u00e7 e kemi provuar n\u00eb p\u00ebrvoj\u00ebn ton\u00eb t\u00eb vet.<\/p>\n<p><\/p>\n<h3 id=\"obnovlenie-neskolkih-faylov-konfiguracii\">P\u00ebrdit\u00ebsimi i disa skedave t\u00eb konfigurimit<\/h3>\n<p><\/p>\n<p>Kur nj\u00eb zhvillues shton nj\u00eb aplikacion t\u00eb ri, ai duhet t\u00eb ndryshoj\u00eb disa skeda: shpallja e aplikacionit, lista e sekreteve, shtimi i aplikacionit n\u00eb var\u00ebsi, n\u00ebse ai b\u00ebn pjes\u00eb n\u00eb diagramin e p\u00ebrgjithsh\u00ebm.<\/p>\n<p><\/p>\n<h3 id=\"razresheniya-jenkins-slishkom-rasshireny-v-vault\">Lejet e Jenkins jan\u00eb tep\u00ebr t\u00eb gjera n\u00eb Vault<\/h3>\n<p><\/p>\n<p>Tani kemi nj\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/www.vaultproject.io\/docs\/auth\/approle.html\">AppRole<\/a><\/noindex>, e cila lexon t\u00eb gjitha sekretet nga Vault.<\/p>\n<p><\/p>\n<h3 id=\"process-otkata-ne-avtomatizirovan\">Procesi i rikthimit nuk \u00ebsht\u00eb automatizuar<\/h3>\n<p><\/p>\n<p>P\u00ebr rikthimin, duhet t\u00eb ekzekutohet nj\u00eb komand\u00eb n\u00eb disa klastera, gj\u00eb q\u00eb \u00ebsht\u00eb e rrezikshme p\u00ebr gabimet. Ne e kryejm\u00eb k\u00ebt\u00eb operacion manualisht p\u00ebr t\u00eb garantuar identifikimin e sakt\u00eb t\u00eb versionit.<\/p>\n<p><\/p>\n<h2 id=\"my-dvizhemsya-v-storonu-gitops\">Ne po shk\u00ebputemi drejt GitOps<\/h2>\n<p><\/p>\n<h3 id=\"nasha-cel\">Q\u00ebllimi yn\u00eb<\/h3>\n<p><\/p>\n<p>Duam ta kthejm\u00eb diagramin n\u00eb repositorin e aplikacionit q\u00eb ai shp\u00ebrndan.<\/p>\n<p><\/p>\n<p>Procesi do t\u00eb jet\u00eb i nj\u00ebjt\u00eb si p\u00ebr zhvillimin. P\u00ebr shembull, kur deg\u00ebsohet n\u00eb master, shp\u00ebrndarja do t\u00eb filloj\u00eb automatikisht. Diferenca kryesore midis k\u00ebtij qasjet dhe procesit aktual do t\u00eb jet\u00eb q\u00eb <strong>t\u00eb gjitha do t\u00eb menaxhohen n\u00eb git<\/strong> (vet\u00eb aplikacioni dhe m\u00ebnyra e shp\u00ebrndarjes s\u00eb tij n\u00eb Kubernetes).<\/p>\n<p><\/p>\n<p>Ka disa p\u00ebrpar\u00ebsi:<\/p>\n<p><\/p>\n<ul>\n<li>Shum\u00eb <strong>m\u00eb e kuptueshme<\/strong> p\u00ebr zhvilluesin. M\u00eb e leht\u00eb p\u00ebr t'u m\u00ebsuar p\u00ebr t\u00eb aplikuar ndryshimet n\u00eb diagramin lokal.<\/li>\n<li>Definimi i shp\u00ebrndarjes s\u00eb sh\u00ebrbimit mund t\u00eb specifikohet <strong>atje ku \u00ebsht\u00eb kodi<\/strong> i sh\u00ebrbimit.<\/li>\n<li><strong>Menaxhimi i fshirjes s\u00eb diagrameve t\u00eb p\u00ebrgjithshme<\/strong>. Sh\u00ebrbimi do t\u00eb ket\u00eb l\u00ebshimin e tij Helm. Kjo do t\u00eb lejoj\u00eb menaxhimin e ciklit t\u00eb jet\u00ebs s\u00eb aplikacionit (rikthimi, azhurnimi) n\u00eb nivelin m\u00eb t\u00eb holl\u00ebsish\u00ebm, p\u00ebr t\u00eb mos prekur sh\u00ebrbime t\u00eb tjera.<\/li>\n<li><strong>P\u00ebrfitimet e git<\/strong> p\u00ebr menaxhimin e diagrameve: anulimi i ndryshimeve, regjistri i auditet dhe etj. N\u00ebse duhet t\u00eb anuloni nj\u00eb ndryshim n\u00eb diagram, kjo mund t\u00eb b\u00ebhet p\u00ebrmes git. Shp\u00ebrndarja fillon automatikisht.<\/li>\n<li>Mund t\u00eb mendohet p\u00ebr p\u00ebrmir\u00ebsimin e procesit t\u00eb zhvillimit me ndihm\u00ebn e mjeteve si <strong>Skaffold<\/strong>, me t\u00eb cilat zhvilluesit mund t\u00eb testojn\u00eb ndryshimet n\u00eb nj\u00eb kontekst t\u00eb af\u00ebrt me prodhimin.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"dvuhetapnaya-migraciya\">Migroni n\u00eb dy etapa<\/h3>\n<p><\/p>\n<p>Zhvilluesit tan\u00eb e kan\u00eb p\u00ebrdorur k\u00ebt\u00eb proces pune tash e 2 vjet, k\u00ebshtu q\u00eb na nevojitet nj\u00eb migrim sa m\u00eb paq\u00ebsor. Prandaj, vendos\u00ebm t\u00eb shtojm\u00eb nj\u00eb hap nd\u00ebrmjet\u00ebs n\u00eb rrug\u00ebn drejt q\u00ebllimit.<br \/>\nHapi i par\u00eb \u00ebsht\u00eb i thjesht\u00eb:<\/p>\n<p><\/p>\n<ul>\n<li>Ne ruajm\u00eb nj\u00eb struktur\u00eb t\u00eb ngjashme p\u00ebr konfigurimin e shp\u00ebrndarjes s\u00eb aplikacioneve, por n\u00eb nj\u00eb objekt me emrin DailymotionRelease.<\/li>\n<\/ul>\n<p><\/p>\n<pre><code class=\"plaintext\">apiVersion: \"v1\"\nkind: \"DailymotionRelease\"\nmetadata:\n  name: \"app1.ns1\"\n  environment: \"dev\"\n  branch: \"mybranch\"\nspec:\n  slack_channel: \"#admin\"\n  chart_name: \"app1\"\n  scaling:\n    - context: \"dev-us-central1-0\"\n      replicas:\n        - name: \"hermes\"\n          count: 2\n    - context: \"dev-europe-west1-0\"\n      replicas:\n        - name: \"app1-deploy\"\n          count: 2\n  secrets:\n    - secret_id: \"app1\"\n      contexts:\n        - name: \"default\"\n          vaultPath: \"\\\/kv\\\/dev\\\/ns1\\\/app1\\\/test\"\n          vaultKey: \"password\"\n        - name: \"dev-europe-west1-0\"\n          vaultPath: \"\\\/kv\\\/dev\\\/ns1\\\/app1\\\/test\"\n          vaultKey: \"password\"<\/code><\/pre>\n<p><\/p>\n<ul>\n<li>1 riliz p\u00ebr aplikacion (pa grafik\u00eb t\u00eb p\u00ebrgjithshme).<\/li>\n<li>Grafikat n\u00eb depozit\u00ebn git t\u00eb aplikacionit.<\/li>\n<\/ul>\n<p><\/p>\n<p>Biseduam me t\u00eb gjith\u00eb zhvilluesit, k\u00ebshtu q\u00eb processi i migrimit ka filluar. Hapi i par\u00eb ende kontrollohet duke p\u00ebrdorur platform\u00ebn CI. S\u00eb shpejti do t\u00eb shkruaj nj\u00eb postim tjet\u00ebr p\u00ebr hapat e dyt\u00eb: si kaluam n\u00eb procesin GitOps me <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/weaveworks\/flux\">Flux<\/a><\/noindex>. Do t'ju tregoj si e konfiguruan gjith\u00e7ka dhe me cilat sfida u p\u00ebrball\u00ebm (disa depo, sekrete etj.). Q\u00ebndroni t\u00eb informuar.<\/p>\n<p><\/p>\n<p>K\u00ebtu p\u00ebrpiqemi t\u00eb p\u00ebrshkruajm\u00eb p\u00ebrparimin ton\u00eb n\u00eb procesin e shp\u00ebrndarjes s\u00eb aplikacioneve gjat\u00eb viteve t\u00eb fundit, i cili na \u00e7oi n\u00eb mendime mbi qasjen GitOps. Ende nuk e kemi arritur q\u00ebllimin dhe do t'i raportojm\u00eb rezultatet, por tani jemi t\u00eb bindur se b\u00ebm\u00eb mir\u00eb q\u00eb vendos\u00ebm gjith\u00e7ka ta thjeshtojm\u00eb dhe ta afrojm\u00eb me zakonet e zhvilluesve.<\/p>\n<p>Burimi: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/458934\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041a\u0430\u043a Dailymotion \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Kubernetes: \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u041c\u044b \u0432 Dailymotion \u043d\u0430\u0447\u0430\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Kubernetes \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435 3 \u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434. \u041d\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u0445 \u0442\u043e \u0435\u0449\u0435 \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442 \u043c\u044b \u0441\u0442\u0430\u0440\u0430\u043b\u0438\u0441\u044c \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043d\u0430\u0448\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b. \u0421 \u0447\u0435\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a \u043c\u044b \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u0448\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u0445 Kubernetes \u043f\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-35955","post","type-post","status-publish","format-standard","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=\"\u041a\u0430\u043a Dailymotion \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Kubernetes: \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u041c\u044b \u0432 Dailymotion \u043d\u0430\u0447\u0430\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Kubernetes \u0432.\" \/>\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\/razvertyvanie-prilozhenij-na-neskolkih-klasterah-kubernetes-s-helm\" \/>\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\udd47\u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u0445 Kubernetes \u0441 Helm | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041a\u0430\u043a Dailymotion \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Kubernetes: \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u041c\u044b \u0432 Dailymotion \u043d\u0430\u0447\u0430\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Kubernetes \u0432.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/razvertyvanie-prilozhenij-na-neskolkih-klasterah-kubernetes-s-helm\" \/>\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:08:26+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:08:26+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\udd47Shp\u00ebrndarja e aplikacioneve n\u00eb klaster\u00eb t\u00eb ndrysh\u00ebm Kubernetes me Helm | ProHoster","description":"Si Dailymotion e p\u00ebrdor Kubernetes: shp\u00ebrndarja e aplikacioneve. Ne n\u00eb Dailymotion filluam ta p\u00ebrdorim Kubernetes n\u00eb.","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/razvertyvanie-prilozhenij-na-neskolkih-klasterah-kubernetes-s-helm","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\udd47\u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u0445 Kubernetes \u0441 Helm | ProHoster","og:description":"\u041a\u0430\u043a Dailymotion \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Kubernetes: \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u041c\u044b \u0432 Dailymotion \u043d\u0430\u0447\u0430\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Kubernetes \u0432.","og:url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/razvertyvanie-prilozhenij-na-neskolkih-klasterah-kubernetes-s-helm","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:08:26+00:00","article:modified_time":"2019-10-31T19:08:26+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"35955","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 01:25:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:53:31","updated":"2026-01-22 01:25: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\/35955","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=35955"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/35955\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=35955"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=35955"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=35955"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}