{"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 Dailymotionis oleme hakanud Kubernetes't tootmises kasutama kolm aastat tagasi. Ent rakenduste juurutamine mitmel klastril on olnud paras v\u00e4ljakutse, seet\u00f5ttu oleme viimastel aastatel p\u00fc\u00fcdnud oma t\u00f6\u00f6riistu ja t\u00f6\u00f6vooge t\u00e4iustada.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"s-chego-nachalos\">Kust k\u00f5ik algas<\/h3>\n<p><\/p>\n<p>Siin r\u00e4\u00e4gime, kuidas me juurutame oma rakendusi mitmel Kubernetes klastril \u00fcle kogu maailma.<\/p>\n<p><\/p>\n<p>K\u00fcsimuseks, kuidas korraga mitut Kubernetes objekti juurutada, me kasutame <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/\">Helm<\/a><\/noindex>, ja k\u00f5ik meie chart'id on hoitud \u00fches git-repos. T\u00e4ieliku rakenduste virna juurutamiseks mitmest teenusest kasutame nii nimetatud koondchart'i. Essentsiaalselt on see chart, mis kuulutab v\u00e4lja s\u00f5ltuvused ja v\u00f5imaldab initsialiseerida API-d ja selle teenuseid \u00fche k\u00e4suga.<\/p>\n<p><\/p>\n<p>Oleme ka kirjutanud v\u00e4ikese Python skripti Helm'i kohale, et teostada kontrollid, luua chart'e, lisada salajaid ja juurutada rakendusi. K\u00f5ik need \u00fclesanded t\u00e4idetakse keskses CI platvormis docker'i abil.<\/p>\n<p><\/p>\n<p>Liigume oluliste asjade juurde.<\/p>\n<p><\/p>\n<blockquote><p>M\u00e4rge. Kui te seda loete, on Helm 3 esimene versioonkandidaat juba v\u00e4lja kuulutatud. Peamine versioon sisaldab mitmeid t\u00e4iustusi, mis on suunatud varasemate probleemide lahendamisele.<\/p><\/blockquote>\n<p><\/p>\n<h3 id=\"rabochiy-process-razrabotki-chartov\">Chartide arendamise t\u00f6\u00f6voog<\/h3>\n<p><\/p>\n<p>Rakenduste jaoks kasutame haru loomist ja otsustasime selle l\u00e4henemise rakendada ka chartide puhul.<\/p>\n<p><\/p>\n<ul>\n<li>Haru <strong>dev<\/strong> kasutatakse chartide loomiseks, mida testitakse arendusklastrites.<\/li>\n<li>Kui pull-ettepanek esitatakse <strong>master<\/strong>, kontrollitakse neid stendis.<\/li>\n<li>L\u00f5puks loome pull-ettepaneku, et edastada muudatused harusse <strong>prod<\/strong> ja rakendada neid tootmises.<\/li>\n<\/ul>\n<p><\/p>\n<p>Igal keskkonnal on oma privaatne hoidla, mis salvestab meie chartid, ja kasutame <noindex><a rel=\"nofollow\" href=\"https:\/\/chartmuseum.com\/\">Chartmuseum<\/a><\/noindex> kuna see pakub v\u00e4ga kasulikke API-sid. Nii garantii, et keskkondade vahel on range isoleeritus ja chartide testimine reaalses olukorras enne nende tootmisesse rakendamist.<\/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>Chartide hoidlad erinevates keskkondades<\/em><\/p>\n<p><\/p>\n<p>Oluline on m\u00e4rkida, et kui arendajad saadavad dev haru, saadetakse nende charti versioon automaatselt dev Chartmuseumisse. Seel\u00e4bi kasutavad k\u00f5ik arendajad \u00fchte dev hoidlat ja on oluline t\u00e4pselt n\u00e4idata oma charti versioon, et mitte kasutada kellegi teise muudatusi.<\/p>\n<p><\/p>\n<p>Lisaks kontrollib meie v\u00e4ike Python skript Kubernetes objekti nende Kubernetes OpenAPI spetsifikatsioonide j\u00e4rgi. <noindex><a rel=\"nofollow\" href=\"https:\/\/kubeval.instrumenta.dev\/\">Kubeval<\/a><\/noindex>, enne nende avaldamist Chartmuseumis.<\/p>\n<p><\/p>\n<h3 id=\"obschee-opisanie-rabochego-processa-razrabotki-charta\">Charti arendusprotsessi \u00fcldine kirjeldus<\/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>T\u00f6\u00f6vooprotsessi \u00fclesannete seadmine spetsifikatsiooni j\u00e4rgi <noindex><a rel=\"nofollow\" href=\"https:\/\/gazr.io\/\">gazr.io<\/a><\/noindex> kvaliteedikontrolli (lint, unit-test) jaoks.<\/li>\n<li>Docker pildi saatmine koos Python t\u00f6\u00f6riistadega, mis k\u00e4ivitavad meie rakendusi.<\/li>\n<li>Keskkonna seadistamine haru nime j\u00e4rgi.<\/li>\n<li>Kubernetes yaml failide kontrollimine Kubeval abil.<\/li>\n<li>Charti ja selle vanemate chartide (chartide, mis s\u00f5ltuvad muudetavast chartist) automaatne versiooni t\u00f5stmine.<\/li>\n<li>Charti saatmine Chartmuseumisse, mis vastab tema keskkonnale.<\/li>\n<\/ol>\n<p><\/p>\n<h2 id=\"upravlenie-razlichiyami-v-klasterah\">Klastrite erinevuste haldamine<\/h2>\n<p><\/p>\n<h3 id=\"federaciya-klasterov\">Klastrite f\u00f6deratsioon<\/h3>\n<p><\/p>\n<p>Oli aeg, mil me kasutasime <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/cluster-administration\/federation\/\">Kubernetesi klastrite f\u00f6deratsiooni.<\/a><\/noindex>, kus Kubernetes objektide v\u00e4ljakuulutamiseks oli \u00fcks API l\u00f5pp-punkt. Kuid tekkisid probleemid. N\u00e4iteks ei olnud m\u00f5ningaid Kubernetes objekte v\u00f5imalik liidus\u00f5lmes luua, seet\u00f5ttu oli keeruline hallata \u00fchendatud objekte ja teisi objekte eraldi klastrite jaoks.<\/p>\n<p><\/p>\n<p>Probleemi lahendamiseks hakkasime haldama klasse iseseisvalt, mis lihtsustas protsessi oluliselt (kasutasime 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 6 regiooni \u2014 3 kohalikku ja 3 pilve.<\/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 kasutuselev\u00f5tt<\/em><\/p>\n<p><\/p>\n<h3 id=\"globalnye-znacheniya-helm\">Globaalne Helm v\u00e4\u00e4rtused<\/h3>\n<p><\/p>\n<p>4 globaalse v\u00e4\u00e4rtuse Helm abil on v\u00f5imalik m\u00e4\u00e4ratleda erinevusi klastrite vahel. K\u00f5ikide meie graafikute jaoks on minimaalsed vaikimisi v\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>Globaalsed v\u00e4\u00e4rtused<\/em><\/p>\n<p><\/p>\n<p>Need v\u00e4\u00e4rtused aitavad m\u00e4\u00e4ratleda meie rakenduste konteksti ja neid kasutatakse erinevate \u00fclesannete jaoks: j\u00e4lgimine, j\u00e4litus, logimine, v\u00e4liste kutsungite tegemine, skaleerimine jne.<\/p>\n<p><\/p>\n<ul>\n<li>\u00abcloud\u00bb: meil on h\u00fcbri Kubernetes platvorm. N\u00e4iteks meie API paigaldatakse GCP piirkondadesse ja meie andmekeskustesse.<\/li>\n<li>\u00abenv\u00bb: m\u00f5ned v\u00e4\u00e4rtused v\u00f5ivad muutuda mitte-toimivates keskkondades. N\u00e4iteks ressursi m\u00e4\u00e4ratlused ja automaatse skaleerimise konfiguratsioon.<\/li>\n<li>\u00abregion\u00bb: see teave aitab m\u00e4\u00e4rata klastrite asukohta ja v\u00f5ib olla kasulik l\u00e4himate l\u00f5pp-punktide m\u00e4\u00e4ramisel v\u00e4listest teenustest.<\/li>\n<li>\u00abclusterName\u00bb: kui ja millal me soovime m\u00e4\u00e4rata v\u00e4\u00e4rtuse konkreetse klastrile.<\/li>\n<\/ul>\n<p><\/p>\n<p>Siin on konkreetne n\u00e4ide:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">{{\/* Tagastab horisontaalse podi automaat skaalastamise replikad GraphQL jaoks *\/}}\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 segada Kubernetes YAML faili.<\/p>\n<p><\/p>\n<h3 id=\"obyavlenie-prilozheniya\">Rakenduse kuulutamine<\/h3>\n<p><\/p>\n<p>Meie paigaldust\u00f6\u00f6riistad p\u00f5hinevad mitmetel YAML failidel. Allpool on n\u00e4ide, kuidas me kuulutame teenuse ja selle skaleerimise topoloogia (replikate arv) klastris.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">v\u00e4ljalaset:\n  - foo.world\n\nfoo.world:                # V\u00e4ljalase nimi\n  teenused:               # Dailymotioni rakenduste\/projektide nimekiri\n    foobar:\n      chart_name: foo-foobar\n      repo: git@github.com:dailymotion\/foobar\n      kontekstid:\n        prod-europe-west1:\n          juurutamised:\n            - nimi: foo-bar-baz\n              koopiad: 18\n            - nimi: another-deployment\n              koopiad: 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 juurutamisprotsessi. Viimane samm juurutab rakenduse korraga mitmes t\u00f6\u00f6klastris.<\/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>Jenkins'i juurutamise sammud<\/em><\/p>\n<p><\/p>\n<h3 id=\"a-sekrety\">Aga saladused?<\/h3>\n<p><\/p>\n<p>Mis puudutab turvalisust, siis j\u00e4lgime k\u00f5iki saladusi erinevates kohtades ja hoiame neid unikaalses salvestuses <noindex><a rel=\"nofollow\" href=\"https:\/\/www.vaultproject.io\/\">Vault<\/a><\/noindex> Pariis.<\/p>\n<p><\/p>\n<p>Meie juurutamisriistad v\u00f5tavad saladuste v\u00e4\u00e4rtused Vaultist ja kui on juurutamise aeg, sisestavad need Helm'i.<\/p>\n<p><\/p>\n<p>Selle jaoks oleme m\u00e4\u00e4ratlenud vastenduse Vaultis olevate saladuste ja meie rakendustes vajalike saladuste vahel:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">saladused:                                                                                                                                                                                                        \n     - secret_id: \"stack1-app1-password\"                                                                                                                                                                                  \n       kontekstid:                                                                                                                                                                                                   \n         - nimi: \"vaikimisi\"                                                                                                                                                                                         \n           vaultPath: \"\/kv\/dev\/stack1\/app1\/test\"                                                                                                                                                               \n           vaultKey: \"salas\u00f5na\"                                                                                                                                                                                    \n         - nimi: \"cluster1\"                                                                                                                                                                           \n           vaultPath: \"\/kv\/dev\/stack1\/app1\/test\"                                                                                                                                                               \n           vaultKey: \"salas\u00f5na\"<\/code><\/pre>\n<p><\/p>\n<ul>\n<li>Oleme m\u00e4\u00e4ratlenud \u00fcldised reeglid, mida tuleb j\u00e4rgida saladuste salvestamisel Vaulti.<\/li>\n<li>Kui saladus kuulub <strong>teatud konteksti v\u00f5i klastri juurde<\/strong>, tuleb lisada konkreetne kirje. (Siin kontekstis cluster1 on stack-app1-password-i saladusel oma t\u00e4hendus).<\/li>\n<li>Muudel juhtudel kasutatakse v\u00e4\u00e4rtust <strong>vaikimisi<\/strong>.<\/li>\n<li>Iga punkti jaoks selles loendis <strong>Kubernetes'i saladuses<\/strong> sisestatakse v\u00f5tme-v\u00e4\u00e4rtuse paar. Seet\u00f5ttu on meie chartide saladuse mall 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 hoidla jaoks<\/h3>\n<p><\/p>\n<p>Praegu eristame chartide ja rakenduste arendamist. See t\u00e4hendab, et arendajad peavad t\u00f6\u00f6tama kahes git-hoidlas: \u00fcks rakenduse jaoks ja teine selle Kubernetes'i juurutamise m\u00e4\u00e4ratlemiseks. 2 git-hoidlat t\u00e4hendab 2 t\u00f6\u00f6protsessi ja uue inimese on lihtne segadusse ajada.<\/p>\n<p><\/p>\n<h3 id=\"upravlyat-obobschennymi-chartami-hlopotno\">\u00dcldiste chartide haldamine on t\u00fclikas<\/h3>\n<p><\/p>\n<p>Nagu juba mainitud, 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 iga kord k\u00f5igi v\u00e4\u00e4rtuste edastamist, kui me juurutame rakendust, mis kuulub sellesse \u00fcldisse charti.<\/p>\n<p><\/p>\n<p>J\u00e4tkuva tarneprotsessis on meil vaid kaks v\u00e4\u00e4rtust, mis pidevalt muutuvad: koopiate arv ja pildim\u00e4rgis (versioon). Teised, stabiilsemad v\u00e4\u00e4rtused, muutuvad k\u00e4sitsi, mis on \u00fcsna keeruline. Veelgi enam, \u00fcks viga \u00fcldise chart'i juurutamises v\u00f5ib p\u00f5hjustada t\u00f5siseid t\u00f5rkeid, nagu oleme oma kogemustest \u00f5ppinud.<\/p>\n<p><\/p>\n<h3 id=\"obnovlenie-neskolkih-faylov-konfiguracii\">Mitme konfiguratsioonifaili v\u00e4rskendamine<\/h3>\n<p><\/p>\n<p>Kui arendaja lisab uue rakenduse, peab ta muutma mitmeid faile: rakenduse kuulutamine, saladuste loetelu, rakenduse lisamine s\u00f5ltuvustesse, kui see kuulub \u00fcldisse chart'i.<\/p>\n<p><\/p>\n<h3 id=\"razresheniya-jenkins-slishkom-rasshireny-v-vault\">Jenkinsi load on Vaultis 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 Vaultist.<\/p>\n<p><\/p>\n<h3 id=\"process-otkata-ne-avtomatizirovan\">Tagasip\u00f6\u00f6rdumise protsess ei ole automatiseeritud<\/h3>\n<p><\/p>\n<p>Tagasip\u00f6\u00f6rdumiseks tuleb k\u00e4ivitada k\u00e4sk mitmes klastris, mis on vigadele avatud. Sooritatav toiming on k\u00e4sitsi, et tagada \u00f5ige versioonitunnuse m\u00e4\u00e4ramine.<\/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 rakenduse reposse, mida see juurutab.<\/p>\n<p><\/p>\n<p>T\u00f6\u00f6p\u00f5him\u00f5te j\u00e4\u00e4b samaks kui arenduses. N\u00e4iteks, kui haru saadetakse masteri, k\u00e4ivitub juurutamine automaatselt. Peamine erinevus sellise l\u00e4henemise ja praeguse t\u00f6\u00f6protsessi vahel on see, et <strong>k\u00f5ike hallatakse git'is<\/strong> (rakendus ise ja selle juurutamise viis Kuberneteses).<\/p>\n<p><\/p>\n<p>Eeliseid on mitu:<\/p>\n<p><\/p>\n<ul>\n<li>Palju <strong>selgem<\/strong> arendajale. Lihtsam on \u00f5ppida rakendama muudatusi kohalikus chartis.<\/li>\n<li>Teenuse juurutamise m\u00e4\u00e4ratlemine saab toimuda <strong>seal, kus on kood<\/strong> teenusest.<\/li>\n<li><strong>\u00dcldiste chartide eemaldamise haldamine<\/strong>. Teenusel on oma Helm'i v\u00e4ljaanne. See v\u00f5imaldab hallata rakenduse eluts\u00fcklit (tagasip\u00f6\u00f6ramine, uuendamine) k\u00f5ige v\u00e4iksemal tasandil, et mitte h\u00e4irida teisi teenuseid.<\/li>\n<li><strong>Git'i eelised<\/strong> chartide haldamisel: muudatuste t\u00fchistamine, auditilogid jne. Kui charti muudatust on vaja t\u00fchistada, saab seda teha git'i abiga. Juurutamine k\u00e4ivitub automaatselt.<\/li>\n<li>Saab m\u00f5elda arendusprotsessi t\u00e4iustamisele selliste t\u00f6\u00f6riistadega nagu <strong>Skaffold<\/strong>, millega arendajad saavad teste teha muutustes, mis on l\u00e4hedased tootmisprotsessile.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"dvuhetapnaya-migraciya\">Kahe-etapiline migratsioon<\/h3>\n<p><\/p>\n<p>Meie arendajad on seda t\u00f6\u00f6voogu kasutanud juba 2 aastat, seega vajame maksimaalselt sujuvat migratsiooni. Seet\u00f5ttu otsustasime lisada vaheetapi teele.<br \/>\nEsimene etapp on lihtne:<\/p>\n<p><\/p>\n<ul>\n<li>Hoidame sarnast struktuuri rakenduste v\u00e4lja t\u00f5stmise 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\u00e4ljalase rakenduse kohta (ilma \u00fcldistatud chartideta).<\/li>\n<li>Chartid rakenduse git-repositooriumis.<\/li>\n<\/ul>\n<p><\/p>\n<p>R\u00e4\u00e4kisime k\u00f5igi arendajatega, seega on migratsiooniprotsess juba alanud. Esimene etapp on endiselt kontrolli all CI platvormi kaudu. Peagi kirjutan veel \u00fche postituse teise etapi kohta: 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 seisisime (mitmed ladustamised, saladused jne). J\u00e4lgige meie uudiseid.<\/p>\n<p><\/p>\n<p>Siin \u00fcritasime kirjeldada meie edusamme rakenduste juurutamise t\u00f6\u00f6protsessis viimase paari aasta jooksul, mis viis meid m\u00f5tetele GitOps l\u00e4henemisviisi kohta. Me pole veel eesm\u00e4rgini j\u00f5udnud ja anname tulemuste kohta teada, kuid oleme n\u00fc\u00fcd 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.0.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.0.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 mitmes Kubernetes klastris Helm | ProHoster","description":"Kuidas Dailymotion kasutab Kuberneteset: rakenduste juurutamine. Me Dailymotionis alustasime Kubernetes'e kasutamist.","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}]}}