{"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\/et\/blog\/administrirovanie\/razvertyvanie-prilozhenij-na-neskolkih-klasterah-kubernetes-s-helm","title":{"rendered":"Rakenduste juurutamine mitmetes Kubernetes klastrites Helmiga","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<\/p>\n<p><\/p>\n<h2 id=\"kak-dailymotion-ispolzuet-kubernetes-razvertyvanie-prilozheniy\">Kuidas Dailymotion kasutab Kubernetes't: rakenduste juurutamine<\/h2>\n<p><\/p>\n<p>Me Dailymotion'is alustasime Kubernetes'e kasutamist tootmisest 3 aastat tagasi. Kuid rakenduste juurutamine mitmetes klastrites on t\u00f5eline v\u00e4ljakutse, mist\u00f5ttu oleme viimastel aastatel p\u00fc\u00fcdnud oma t\u00f6\u00f6riistu ja t\u00f6\u00f6vooge parandada.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"s-chego-nachalos\">Kust see k\u00f5ik algas<\/h3>\n<p><\/p>\n<p>Siin r\u00e4\u00e4gime, kuidas me juurutame oma rakendusi mitmetes Kubernetes'i klastrites \u00fcle maailma.<\/p>\n<p><\/p>\n<p>K\u00fcsimisel, kuidas juurutada mitmeid Kubernetes'i objekte korraga, kasutame <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/\">Helm<\/a><\/noindex>, ja k\u00f5ik meie chart'id on salvestatud \u00fches git-repos. Rakenduse t\u00e4ieliku stack'i juurutamiseks, mis koosneb mitmest teenusest, kasutame nn \u00fcldist chart'i. See on p\u00f5him\u00f5tteliselt chart, mis m\u00e4\u00e4ratleb s\u00f5ltuvused ja v\u00f5imaldab algatada API ning selle teenused \u00fche k\u00e4suga.<\/p>\n<p><\/p>\n<p>Lisaks oleme kirjutanud v\u00e4ikese Python'i skripti Helm'i peale, et teha kontrollimisi, luua chart'e, lisada salajasi andmeid ja juurutada rakendusi. K\u00f5iki neid \u00fclesandeid t\u00e4idetakse keskse CI platvormi abil docker'i pildi kaudu.<\/p>\n<p><\/p>\n<p>L\u00e4heme asja juurde.<\/p>\n<p><\/p>\n<blockquote><p>M\u00e4rkus. Kui te seda loete, on esimene Helm 3 versiooni kandidaat juba v\u00e4lja kuulutatud. Peamine versioon sisaldab hulga parandusi, mille eesm\u00e4rgiks on lahendada m\u00f5ned eelmisel ajal tekkinud probleemid.<\/p><\/blockquote>\n<p><\/p>\n<h3 id=\"rabochiy-process-razrabotki-chartov\">Chart'ide arendamise t\u00f6\u00f6voog<\/h3>\n<p><\/p>\n<p>Rakenduste jaoks kasutame harude loomist ja otsustasime selle sama l\u00e4henemise rakendada ka chart'idele.<\/p>\n<p><\/p>\n<ul>\n<li>Haru <strong>dev<\/strong> kasutatakse chart'ide loomiseks, mis testitakse arendusklastrites.<\/li>\n<li>Kui pull-ettepanek esitatakse <strong>master<\/strong>, kontrollitakse neid stseeni tasemel.<\/li>\n<li>L\u00f5puks loome pull-ettepaneku, et edastada muudatused haru <strong>prod<\/strong> ja rakendada need tootmises.<\/li>\n<\/ul>\n<p><\/p>\n<p>Igal keskkonnal on oma privaatne repos, mis hoiab meie chart'e, ja me kasutame <noindex><a rel=\"nofollow\" href=\"https:\/\/chartmuseum.com\/\">Chartmuseum'i<\/a><\/noindex> k\u00f5igi kasulike API-dega. Nii tagame ranget isoleeritust keskkondade vahel ja controlime chart'e reaalsetes tingimustes, enne kui kasutame neid tootmises.<\/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>Chart'ide reposid erinevates keskkondades<\/em><\/p>\n<p><\/p>\n<p>Tasub m\u00e4rkida, et kui arendajad saadavad haru dev, saadetakse nende chart'i versioon automaatselt dev Chartmuseum'i. Nii kasutavad k\u00f5ik arendajad \u00fchte dev reposi ja tuleb hoolikalt m\u00e4rkida oma chart'i versioon, et mitte kogemata kasutada kellegi teise muudatusi.<\/p>\n<p><\/p>\n<p>Veel meer, meie v\u00e4ike Python skript kontrollib Kubernetes objekte Kubernetes OpenAPI spetsifikatsioonide p\u00f5hjal <noindex><a rel=\"nofollow\" href=\"https:\/\/kubeval.instrumenta.dev\/\">Kubeval<\/a><\/noindex>, enne kui need avaldatakse Chartmusesse.<\/p>\n<p><\/p>\n<h3 id=\"obschee-opisanie-rabochego-processa-razrabotki-charta\">Chart\u2019i arendamise t\u00f6\u00f6k\u00e4igu \u00fcldine \u00fclevaade<\/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>Pipeliini \u00fclesannete seadistamine spetsifikatsiooni j\u00e4rgi <noindex><a rel=\"nofollow\" href=\"https:\/\/gazr.io\/\">gazr.io<\/a><\/noindex> kvaliteedikontrolliks (lint, \u00fcksuste testimine).<\/li>\n<li>Docker'i pildi saatmine koos Python'i t\u00f6\u00f6riistadega, mis juurutavad meie rakendused.<\/li>\n<li>Keskkonna seadistamine harunime j\u00e4rgi.<\/li>\n<li>Kubernetes yaml failide kontrollimine Kubeval\u2019i abil.<\/li>\n<li>Chart\u2019i ja selle vanemate chart\u2019ide (chart\u2019id, mis s\u00f5ltuvad muudetavast chart\u2019ist) versiooni automaatne t\u00f5stmine.<\/li>\n<li>Chart'i saatmine Chartmuseumisse, mis vastab oma keskkonnale<\/li>\n<\/ol>\n<p><\/p>\n<h2 id=\"upravlenie-razlichiyami-v-klasterah\">Erinevuste haldamine klastrites<\/h2>\n<p><\/p>\n<h3 id=\"federaciya-klasterov\">Klastrite f\u00f6deratsioon<\/h3>\n<p><\/p>\n<p>Oli aeg, mil kasutasime <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/cluster-administration\/federation\/\">Kubernetes klastrite f\u00f6deratsiooni<\/a><\/noindex>, kus Kubernetes objekte sai kuulutada \u00fche API l\u00f5pp-punkti kaudu. Kuid tekkisid probleemid. N\u00e4iteks teatud Kubernetes objekte ei saanud f\u00f6deratsiooni l\u00f5pp-punktis luua, mist\u00f5ttu oli keeruline hallata \u00fchendatud objekte ja muid objekte eraldi klastrite jaoks.<\/p>\n<p><\/p>\n<p>Probleemi lahendamiseks hakkasime haldama klastreid s\u00f5ltumatult, mis lihtsustas protsessi oluliselt (kasutades f\u00f6deratsiooni esimest versiooni; teises v\u00f5is midagi muutuda).<\/p>\n<p><\/p>\n<h3 id=\"georaspredelennaya-platforma\">Geograafiliselt jaotatud platvorm<\/h3>\n<p><\/p>\n<p>Praegu on meie platvorm jaotatud kuude regioonide vahel \u2014 kolm kohalikku ja kolm pilves.<\/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>Jaotatud juurutamine<\/em><\/p>\n<p><\/p>\n<h3 id=\"globalnye-znacheniya-helm\">Globaalne Helm'i v\u00e4\u00e4rtus<\/h3>\n<p><\/p>\n<p>4 globaalset Helm'i v\u00e4\u00e4rtust aitavad m\u00e4\u00e4ratleda erinevusi klastrite vahel. K\u00f5ikide meie chart'ide jaoks on minimaalsed vaikev\u00e4\u00e4rtused.<\/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>Globaalne v\u00e4\u00e4rtus<\/em><\/p>\n<p><\/p>\n<p>Need v\u00e4\u00e4rtused aitavad m\u00e4\u00e4ratleda konteksti meie rakendustele ja neid kasutatakse erinevatel \u00fclesannetel: j\u00e4lgimine, j\u00e4litamine, logimine, v\u00e4listes k\u00f5nedes osalemine, skaleerimine jne.<\/p>\n<p><\/p>\n<ul>\n<li>\"cloud\": meil on h\u00fcbriidne Kubernetes platvorm. N\u00e4iteks meie API juurutatakse GCP tsoonides ja meie andmekeskustes.<\/li>\n<li>\"env\": m\u00f5ned v\u00e4\u00e4rtused v\u00f5ivad erineda mitte-toimivates keskkondades. N\u00e4iteks ressursside m\u00e4\u00e4ratlemised ja automaatse skaleerimise konfiguratsioon.<\/li>\n<li>\"region\": see teave aitab m\u00e4\u00e4rata klastri asukohta ja seda saab kasutada v\u00e4liste teenuste l\u00e4hima l\u00f5pp-punkti m\u00e4\u00e4ramiseks.<\/li>\n<li>\"clusterName\": kui ja millal tahame m\u00e4\u00e4rata v\u00e4\u00e4rtuse eraldi klastri jaoks.<\/li>\n<\/ul>\n<p><\/p>\n<p>Siin on konkreetne n\u00e4ide:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">{{\n\/* Tagastab GraphQL-i horisontaalse podi autoskaalija koopiate arvu *\/}}\n{{- define \"graphql.hpaReplicas\" -}}\n{{- if eq .Values.global.env \"prod\" }}\n{{- if eq .Values.global.region \"europe-west1\" }}\nminReplicas: 40\n{{- else }}\nminReplicas: 150\n{{- end }}\nmaxReplicas: 1400\n{{- else }}\nminReplicas: 4\nmaxReplicas: 20\n{{- end }}\n{{- end -}}<\/code><\/pre>\n<p><\/p>\n<p><em>Helmi mall n\u00e4ide<\/em><\/p>\n<p><\/p>\n<p>See loogika on m\u00e4\u00e4ratletud abimallis, et mitte ummistada Kubernetes YAML-i.<\/p>\n<p><\/p>\n<h3 id=\"obyavlenie-prilozheniya\">Rakenduse v\u00e4ljakuulutamine<\/h3>\n<p><\/p>\n<p>Meie juurutust\u00f6\u00f6riistad p\u00f5hinevad mitmel YAML-failil. Siin on n\u00e4ide, kuidas me kuulutame v\u00e4lja teenuse ja selle skaleerimis-topoloogia (koopiate arv) klastris.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">releases:\n  - foo.world\n\nfoo.world:                # V\u00e4ljalaske nimi\n  services:               # Dailymotioni rakenduste\/projektide loetelu\n    foobar:\n      chart_name: foo-foobar\n      repo: git@github.com:dailymotion\/foobar\n      contexts:\n        prod-europe-west1:\n          deployments:\n            - name: foo-bar-baz\n              replicas: 18\n            - name: another-deployment\n              replicas: 3<\/code><\/pre>\n<p><\/p>\n<p><em>Teenuse m\u00e4\u00e4ratlemine<\/em><\/p>\n<p><\/p>\n<p>See on skeem k\u00f5igist sammudest, mis m\u00e4\u00e4ratlevad meie juurutusprotsessi. Viimane samm juurutab rakenduse samal ajal mitmes t\u00f6\u00f6kllastri.<\/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>Jenkinsis juurutamise sammud<\/em><\/p>\n<p><\/p>\n<h3 id=\"a-sekrety\">Aga saladused?<\/h3>\n<p><\/p>\n<p>Turvalisuse osas j\u00e4lgime k\u00f5iki saladusi erinevatest kohtadest ja hoiame neid unikaalses salvestusruumis <noindex><a rel=\"nofollow\" href=\"https:\/\/www.vaultproject.io\/\">Vault<\/a><\/noindex> Pariisis.<\/p>\n<p><\/p>\n<p>Meie juurutust\u00f6\u00f6riistad t\u00f5mbavad saladuste v\u00e4\u00e4rtusi Vaultist ja kui on aeg juurutamiseks, sisestavad nad need Helmisse.<\/p>\n<p><\/p>\n<p>Selle jaoks oleme m\u00e4\u00e4ratlenud vastavuse Vaultis olevate saladuste ja meie rakenduste vajalike saladuste vahel:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">salad:                                                                                                                                                                                                        \n     - secret_id: \"stack1-app1-password\"                                                                                                                                                                                  \n       contexts:                                                                                                                                                                                                   \n         - name: \"default\"                                                                                                                                                                                         \n           vaultPath: \"\\\/kv\\\/dev\\\/stack1\\\/app1\\\/test\"                                                                                                                                                               \n           vaultKey: \"password\"                                                                                                                                                                                    \n         - name: \"cluster1\"                                                                                                                                                                           \n           vaultPath: \"\\\/kv\\\/dev\\\/stack1\\\/app1\\\/test\"                                                                                                                                                               \n           vaultKey: \"password\"<\/code><\/pre>\n<p><\/p>\n<ul>\n<li>Oleme m\u00e4\u00e4ratlenud \u00fcldised p\u00f5him\u00f5tted, mida tuleb j\u00e4rgida saladuste registreerimisel Vaultis.<\/li>\n<li>Kui saladus kuulub <strong>kindlasse konteksti v\u00f5i klastrisse<\/strong>, tuleb lisada konkreetne kirje. (Siin on kontekstis cluster1 saladuse stack-app1-password jaoks oma v\u00e4\u00e4rtus).<\/li>\n<li>Muidu kasutatakse v\u00e4\u00e4rtust <strong>vaikimisi<\/strong>.<\/li>\n<li>Iga punkti jaoks selles loendis lisatakse <strong>Kubernetes'i saladusse<\/strong> v\u00f5ti-v\u00e4\u00e4rtus paar. Seet\u00f5ttu on saladuse mall meie chartides v\u00e4ga lihtne.<\/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 }}\nkind: Secret\nmetadata:\n  name: \"{{ .Chart.Name }}\"\n  labels:\n    chartVersion: \"{{ .Chart.Version }}\"\n    tillerVersion: \"{{ .Capabilities.TillerVersion.SemVer }}\"\ntype: Opaque<\/code><\/pre>\n<p><\/p>\n<h2 id=\"problemy-i-ogranicheniya\">Probleemid ja piirangud<\/h2>\n<p><\/p>\n<h3 id=\"rabota-s-neskolkimi-repozitoriyami\">T\u00f6\u00f6tamine mitme repodega<\/h3>\n<p><\/p>\n<p>Praegu jagame chartide ja rakenduste arendust. See t\u00e4hendab, et arendajad peavad t\u00f6\u00f6tama kahes git-repos, \u00fcks rakenduse jaoks ja teine selle juurutamise m\u00e4\u00e4ratlemiseks Kubernetesis. 2 git-repositooriumi t\u00e4hendab 2 t\u00f6\u00f6protsessi ja algajal on lihtne segadusse minna.<\/p>\n<p><\/p>\n<h3 id=\"upravlyat-obobschennymi-chartami-hlopotno\">\u00dcldiste chartide haldamine on t\u00fclikas<\/h3>\n<p><\/p>\n<p>Nagu me juba mainisime, on \u00fcldised chartid v\u00e4ga mugavad s\u00f5ltuvuste m\u00e4\u00e4ratlemiseks ja mitme rakenduse kiireks juurutamiseks. Kuid me kasutame <code>--reuse-values<\/code>, et v\u00e4ltida k\u00f5igi v\u00e4\u00e4rtuste edastamist iga kord, kui me rakendust, mis kuulub sellesse \u00fcldisesse charti, juurutame.<\/p>\n<p><\/p>\n<p>T\u00f5husa pideva tarnimise protsessis on meil vaid kaks v\u00e4\u00e4rtust, mis pidevalt muutuvad: koopiate arv ja pildi silt (versioon). Teised, stabiilsemad v\u00e4\u00e4rtused muudetakse k\u00e4sitsi ja see on \u00fcsna keeruline. Veelgi enam, \u00fcks viga \u00fcldise chart'i juurutamisel v\u00f5ib viia t\u00f5siste t\u00f5rgeteni, nagu oleme oma kogemustest kogenud.<\/p>\n<p><\/p>\n<h3 id=\"obnovlenie-neskolkih-faylov-konfiguracii\">Mitme konfiguratsioonifaili uuendamine<\/h3>\n<p><\/p>\n<p>Kui arendaja lisab uue rakenduse, peab ta muutma mitmeid faile: rakenduse kuulutamise, saladuste nimekirja, rakenduse lisamise s\u00f5ltuvustesse, kui see kuulub \u00fcldisesse chart'i.<\/p>\n<p><\/p>\n<h3 id=\"razresheniya-jenkins-slishkom-rasshireny-v-vault\">Jenkins'i \u00f5igused on Vault'is liiga laiad<\/h3>\n<p><\/p>\n<p>Praegu on meil \u00fcks <noindex><a rel=\"nofollow\" href=\"https:\/\/www.vaultproject.io\/docs\/auth\/approle.html\">AppRole<\/a><\/noindex>, mis loeb k\u00f5iki saladusi Vault'ist.<\/p>\n<p><\/p>\n<h3 id=\"process-otkata-ne-avtomatizirovan\">Tagasiv\u00f5tmise protsess ei ole automatiseeritud<\/h3>\n<p><\/p>\n<p>Tagasiv\u00f5tmiseks tuleb k\u00e4ivitada k\u00e4sk mitmel klastril, mis on eksitav. Teeme seda toimingut k\u00e4sitsi, et kindlalt n\u00e4idata \u00f5iget versiooniidentifikaatorit.<\/p>\n<p><\/p>\n<h2 id=\"my-dvizhemsya-v-storonu-gitops\">Liigume GitOps'i suunas<\/h2>\n<p><\/p>\n<h3 id=\"nasha-cel\">Meie eesm\u00e4rk<\/h3>\n<p><\/p>\n<p>Soovime tuua chart'i tagasi rakenduse repository'sse, mida ta juurutab.<\/p>\n<p><\/p>\n<p>T\u00f6\u00f6k\u00e4ik on sama, nagu arenduses. N\u00e4iteks, kui haru saadetakse masterisse, siis juurutamine k\u00e4ivitatakse automaatselt. Peamine erinevus sellise l\u00e4henemise ja hetke t\u00f6\u00f6k\u00e4igu vahel on see, et <strong>k\u00f5ike hallatakse git'is<\/strong> (ise rakendus ja kuidas seda Kubernetes'es juurutada).<\/p>\n<p><\/p>\n<p>Eeliseid on mitu:<\/p>\n<p><\/p>\n<ul>\n<li>Oluliselt <strong>arendajale arusaadavam<\/strong> . Lihtsam on \u00f5ppida, kuidas kohandada muudatusi kohalikus chart'is.<\/li>\n<li>Teenuse juurutamise m\u00e4\u00e4ratlemine saab toimuda <strong>seal, kus on kood<\/strong> teenusest.<\/li>\n<li><strong>\u00dcldiste chart'ide eemaldamise haldamine<\/strong>. Teenusel on oma Helm'i v\u00e4ljaanne. See v\u00f5imaldab hallata rakenduse eluts\u00fcklit (tagasiv\u00f5tt, uuendus) k\u00f5ige v\u00e4iksemal tasemel, et mitte m\u00f5jutada teisi teenuseid.<\/li>\n<li><strong>Git'i eelised<\/strong> chart'ide haldamiseks: muudatuste t\u00fchistamine, auditi ajalugu jne. Kui chart'i muudatus tuleb t\u00fchistada, saab seda teha git'i abil. Juurutamine k\u00e4ivitatakse automaatselt.<\/li>\n<li>V\u00f5ib m\u00f5elda t\u00f6\u00f6voo t\u00e4iustamisele selliste t\u00f6\u00f6riistade abil nagu <strong>Skaffold<\/strong>, millega arendajad saavad testida muudatusi kontekstis, mis sarnaneb tootmistingimustele.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"dvuhetapnaya-migraciya\">Kaks sammu migreerimise<\/h3>\n<p><\/p>\n<p>Meie arendajad on kasutanud seda t\u00f6\u00f6voogu juba 2 aastat, nii et me vajame v\u00f5imalikult sujuvat migratsiooni. Seet\u00f5ttu otsustasime lisada vaheetapi teele eesm\u00e4rgile.<br \/>\nEsimene etapp on lihtne:<\/p>\n<p><\/p>\n<ul>\n<li>S\u00e4ilitame sarnase struktuuri rakenduste k\u00e4itamise seadistamiseks, kuid \u00fches objektis nimega 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 v\u00e4ljalaskmine rakendusele (ilma \u00fcldiselt chartideta).<\/li>\n<li>Chartid rakenduse git-repositooriumis.<\/li>\n<\/ul>\n<p><\/p>\n<p>Me oleme r\u00e4\u00e4kinud k\u00f5ikide arendajatega, nii et migratsiooniprotsess on juba alanud. Esimest etappi juhitakse endiselt CI platvormi abil. Varsti kirjutan veel \u00fche postituse teisest etapist: kuidas me l\u00e4ksime \u00fcle GitOps t\u00f6\u00f6voole <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/weaveworks\/flux\">Flux<\/a><\/noindex>. R\u00e4\u00e4gin, kuidas me k\u00f5ik seadistasime ja milliste raskustega silmitsi seisime (mitmed repositooriumid, saladused jne). J\u00e4lgige uudiseid.<\/p>\n<p><\/p>\n<p>Siin proovime kirjeldada meie edusamme rakenduste juurutamise t\u00f6\u00f6voos viimastel aastatel, mis viis meid m\u00f5teteni GitOps l\u00e4henemise osas. Me ei ole veel eesm\u00e4rgile j\u00f5udnud ja anname tulemuste kohta teada, kuid oleme praegu veendunud, et tegime \u00f5igesti, kui otsustasime k\u00f5ik lihtsustada ja viia arendajate harjumustele l\u00e4hemale.<\/p>\n<p>Allikas: <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.1.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\/et\/blog\/administrirovanie\/razvertyvanie-prilozhenij-na-neskolkih-klasterah-kubernetes-s-helm\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\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\/et\/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\udd47Rakenduste juurutamine mitme Kubernetes klastriga Helm | ProHoster","description":"Kuidas Dailymotion kasutab Kubernetes: rakenduste juurutamine. Me Dailymotionis hakkasime Kubernetes esmakordselt kasutama.","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/razvertyvanie-prilozhenij-na-neskolkih-klasterah-kubernetes-s-helm","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","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\/et\/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\/et\/wp-json\/wp\/v2\/posts\/35955","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=35955"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/35955\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=35955"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=35955"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=35955"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}