{"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\/da\/blog\/administrirovanie\/razvertyvanie-prilozhenij-na-neskolkih-klasterah-kubernetes-s-helm","title":{"rendered":"Udrulning af applikationer p\u00e5 flere Kubernetes-klynger med Helm","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<\/p>\n<p><\/p>\n<h2 id=\"kak-dailymotion-ispolzuet-kubernetes-razvertyvanie-prilozheniy\">Hvordan Dailymotion bruger Kubernetes: implementering af applikationer<\/h2>\n<p><\/p>\n<p>Vi i Dailymotion begyndte at bruge Kubernetes i produktion for 3 \u00e5r siden. Men at implementere applikationer p\u00e5 flere klynger er en udfordring, s\u00e5 i l\u00f8bet af de seneste par \u00e5r har vi arbejdet p\u00e5 at forbedre vores v\u00e6rkt\u00f8jer og arbejdsprocesser.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"s-chego-nachalos\">Hvordan det hele startede<\/h3>\n<p><\/p>\n<p>Her vil vi fort\u00e6lle, hvordan vi implementerer vores applikationer p\u00e5 flere Kubernetes-klynger rundt omkring i verden.<\/p>\n<p><\/p>\n<p>For at implementere flere Kubernetes-objekter samtidig bruger vi <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/\">Helm<\/a><\/noindex>, og alle vores charts opbevares i et enkelt git-repository. For at implementere en fuld applikationsstak fra flere tjenester bruger vi s\u00e5kaldte overordnede charts. I bund og grund er det et chart, der erkl\u00e6rer afh\u00e6ngigheder og g\u00f8r det muligt at initialisere API'et og dets tjenester med en enkelt kommando.<\/p>\n<p><\/p>\n<p>Derudover har vi skrevet et lille Python-script oven p\u00e5 Helm for at udf\u00f8re kontroller, oprette charts, tilf\u00f8je hemmeligheder og implementere applikationer. Alle disse opgaver udf\u00f8res p\u00e5 en central CI-platform ved hj\u00e6lp af et docker-image.<\/p>\n<p><\/p>\n<p>Lad os komme til sagen.<\/p>\n<p><\/p>\n<blockquote><p>Bem\u00e6rk. N\u00e5r du l\u00e6ser dette, er den f\u00f8rste release-kandidat for Helm 3 allerede blevet annonceret. Hovedversionen indeholder en r\u00e6kke forbedringer, der sigter mod at l\u00f8se nogle af de problemer, vi har st\u00f8dt p\u00e5 f\u00f8r.<\/p><\/blockquote>\n<p><\/p>\n<h3 id=\"rabochiy-process-razrabotki-chartov\">Udviklingsworkflow for charts<\/h3>\n<p><\/p>\n<p>Til applikationer bruger vi branching, og den samme tilgang besluttede vi at anvende p\u00e5 charts.<\/p>\n<p><\/p>\n<ul>\n<li>Branch <strong>dev<\/strong> brugs til at oprette charts, der skal testes p\u00e5 udviklingsklynger.<\/li>\n<li>N\u00e5r en pull-request sendes til <strong>master<\/strong>, bliver de kontrolleret i staging.<\/li>\n<li>Endelig opretter vi en pull-request for at overf\u00f8re \u00e6ndringerne til branch <strong>prod<\/strong> og anvende dem i produktion.<\/li>\n<\/ul>\n<p><\/p>\n<p>Hvert milj\u00f8 har sit eget private repository, som opbevarer vores charts, og vi bruger <noindex><a rel=\"nofollow\" href=\"https:\/\/chartmuseum.com\/\">Chartmuseum<\/a><\/noindex> med meget nyttige API'er. P\u00e5 den m\u00e5de sikrer vi streng isolation mellem milj\u00f8erne og testning af charts under reelle forhold, f\u00f8r vi bruger dem i produktion.<\/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>Repository for charts i forskellige milj\u00f8er<\/em><\/p>\n<p><\/p>\n<p>Det er v\u00e6rd at bem\u00e6rke, at n\u00e5r udviklere sender en dev-branch, sendes versionen af deres chart automatisk til dev Chartmuseum. P\u00e5 den m\u00e5de bruger alle udviklere \u00e9t dev-repository, og det er vigtigt at angive sin chart-version n\u00f8je for at undg\u00e5 utilsigtet at bruge andres \u00e6ndringer.<\/p>\n<p><\/p>\n<p>Desuden tjekker vores lille Python-script Kubernetes-objekterne mod Kubernetes OpenAPI-specifikationerne ved hj\u00e6lp af <noindex><a rel=\"nofollow\" href=\"https:\/\/kubeval.instrumenta.dev\/\">Kubeval<\/a><\/noindex>, f\u00f8r de offentligg\u00f8res i Chartmuseum.<\/p>\n<p><\/p>\n<h3 id=\"obschee-opisanie-rabochego-processa-razrabotki-charta\">Generel beskrivelse af workflowet for chart-udvikling<\/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>Ops\u00e6tning af pipeline-opgaver i henhold til specifikationen <noindex><a rel=\"nofollow\" href=\"https:\/\/gazr.io\/\">gazr.io<\/a><\/noindex> til kvalitetskontrol (lint, enhedstest).<\/li>\n<li>Send docker-billedet med de Python-v\u00e6rkt\u00f8jer, der implementerer vores applikationer.<\/li>\n<li>Ops\u00e6tning af milj\u00f8et ved navn gren.<\/li>\n<li>Validering af Kubernetes yaml-filer ved hj\u00e6lp af Kubeval.<\/li>\n<li>Automatisk opgradering af versionen p\u00e5 chartet og dets overordnede charts (charts, der afh\u00e6nger af det \u00e6ndrede chart).<\/li>\n<li>Send chartet til Chartmuseum, som svarer til dets milj\u00f8<\/li>\n<\/ol>\n<p><\/p>\n<h2 id=\"upravlenie-razlichiyami-v-klasterah\">H\u00e5ndtering af forskelle mellem klynger<\/h2>\n<p><\/p>\n<h3 id=\"federaciya-klasterov\">Klyngef\u00f8deration<\/h3>\n<p><\/p>\n<p>Der var en tid, hvor vi brugte <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/cluster-administration\/federation\/\">Kubernetes-klyngef\u00f8deration<\/a><\/noindex>, hvor vi kunne erkl\u00e6re Kubernetes-objekter fra \u00e9t API-endepunkt. Men der opstod problemer. For eksempel kunne nogle Kubernetes-objekter ikke oprettes i f\u00f8derationens endepunkt, s\u00e5 det var sv\u00e6rt at vedligeholde sammenlagte objekter og andre objekter for individuelle klynger.<\/p>\n<p><\/p>\n<p>For at l\u00f8se problemet begyndte vi at administrere klyngerne uafh\u00e6ngigt, hvilket betydeligt forenklede processen (vi brugte den f\u00f8rste version af f\u00f8deration; i den anden kunne noget have \u00e6ndret sig).<\/p>\n<p><\/p>\n<h3 id=\"georaspredelennaya-platforma\">Geodistribueret platform<\/h3>\n<p><\/p>\n<p>Nu er vores platform distribueret p\u00e5 6 regioner \u2014 3 lokalt og 3 i skyen.<\/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>Distribueret udrulning<\/em><\/p>\n<p><\/p>\n<h3 id=\"globalnye-znacheniya-helm\">Globale Helm-v\u00e6rdier<\/h3>\n<p><\/p>\n<p>4 globale Helm-v\u00e6rdier g\u00f8r det muligt at bestemme forskelle mellem klyngerne. Alle vores charts har minimale standardv\u00e6rdier.<\/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>Globale v\u00e6rdier<\/em><\/p>\n<p><\/p>\n<p>Disse v\u00e6rdier hj\u00e6lper med at definere konteksten for vores applikationer og bruges til forskellige opgaver: overv\u00e5gning, sporing, logning, eksterne opkald, skalerings osv.<\/p>\n<p><\/p>\n<ul>\n<li>\"cloud\": vi har en hybrid Kubernetes-platform. For eksempel implementeres vores API i GCP-zoner og i vores datacentre.<\/li>\n<li>\"env\": nogle v\u00e6rdier kan \u00e6ndre sig for ikke-produktionsmilj\u00f8er. For eksempel ressource- og autoskaleringens konfiguration.<\/li>\n<li>\"region\": disse oplysninger hj\u00e6lper med at bestemme klyngens placering og kan bruges til at bestemme de n\u00e6rmeste endepunkter for eksterne tjenester.<\/li>\n<li>\"clusterName\": hvis og n\u00e5r vi \u00f8nsker at bestemme en v\u00e6rdi for en individuel klynge.<\/li>\n<\/ul>\n<p><\/p>\n<p>Her er et konkret eksempel:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">{{\n\/* Returnerer Horizontal Pod Autoscaler replikaer for GraphQL*\/}}\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>Eksempel p\u00e5 en Helm-skabelon<\/em><\/p>\n<p><\/p>\n<p>Denne logik er defineret i en hj\u00e6lpe-skabelon for ikke at overbelaste Kubernetes YAML.<\/p>\n<p><\/p>\n<h3 id=\"obyavlenie-prilozheniya\">Applikationsdeklaration<\/h3>\n<p><\/p>\n<p>Vore implementeringsv\u00e6rkt\u00f8jer er baseret p\u00e5 flere YAML-filer. Nedenfor er et eksempel p\u00e5, hvordan vi deklarerer en service og dens skalerings-topologi (antal replikaer) i klyngen.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">releases:\n  - foo.world\n\nfoo.world:                # Release navn\n  services:               # Liste over dailymotion's apps\/projekter\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>Servicedeklaration<\/em><\/p>\n<p><\/p>\n<p>Dette er et skema over alle de trin, der definerer vores implementeringsworkflow. Det sidste trin implementerer applikationen samtidigt p\u00e5 flere arbejds-klynger.<\/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>Implementeringstrin i Jenkins<\/em><\/p>\n<p><\/p>\n<h3 id=\"a-sekrety\">Hvad med hemmeligheder?<\/h3>\n<p><\/p>\n<p>Hvad ang\u00e5r sikkerhed, holder vi styr p\u00e5 alle hemmeligheder fra forskellige steder og opbevarer dem i et unikt lager <noindex><a rel=\"nofollow\" href=\"https:\/\/www.vaultproject.io\/\">Vault<\/a><\/noindex> i Paris.<\/p>\n<p><\/p>\n<p>Vore implementeringsv\u00e6rkt\u00f8jer henter v\u00e6rdierne af hemmelighederne fra Vault og, n\u00e5r det er tid til implementering, inds\u00e6tter dem i Helm.<\/p>\n<p><\/p>\n<p>Til dette har vi defineret en mapping mellem hemmelighederne i Vault og de hemmeligheder, som vores applikationer har brug for:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">hemmeligheder:                                                                                                                                                                                                        \n     - secret_id: \"stack1-app1-password\"                                                                                                                                                                                  \n       kontekster:                                                                                                                                                                                                   \n         - navn: \"default\"                                                                                                                                                                                         \n           vaultPath: \"\\\/kv\\\/dev\\\/stack1\\\/app1\\\/test\"                                                                                                                                                               \n           vaultKey: \"password\"                                                                                                                                                                                    \n         - navn: \"cluster1\"                                                                                                                                                                           \n           vaultPath: \"\\\/kv\\\/dev\\\/stack1\\\/app1\\\/test\"                                                                                                                                                               \n           vaultKey: \"password\"<\/code><\/pre>\n<p><\/p>\n<ul>\n<li>Vi har defineret generelle regler, der skal f\u00f8lges, n\u00e5r man optager hemmeligheder i Vault.<\/li>\n<li>Hvis hemmeligheden h\u00f8rer til <strong>en bestemt kontekst eller klynge<\/strong>, skal der tilf\u00f8jes en specifik post. (Her har konteksten cluster1 sin egen v\u00e6rdi for hemmeligheden stack-app1-password).<\/li>\n<li>Ellers bruges v\u00e6rdien <strong>som standard<\/strong>.<\/li>\n<li>For hvert punkt p\u00e5 denne liste i <strong>Kubernetes hemmelighed<\/strong> inds\u00e6ttes et n\u00f8gle-v\u00e6rdi-par. S\u00e5 skabelonen for hemmeligheden i vores charts er meget simpel.<\/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\">Problemer og begr\u00e6nsninger<\/h2>\n<p><\/p>\n<h3 id=\"rabota-s-neskolkimi-repozitoriyami\">Arbejder med flere repositories<\/h3>\n<p><\/p>\n<p>I \u00f8jeblikket adskiller vi udvikling af charts og applikationer. Det betyder, at udviklerne skal arbejde i to git-repositories: en til applikationen og en anden for at definere dens implementering i Kubernetes. 2 git-repositories betyder 2 arbejdsprocesser, og det er let for nybegyndere at blive forvirrede.<\/p>\n<p><\/p>\n<h3 id=\"upravlyat-obobschennymi-chartami-hlopotno\">At h\u00e5ndtere generiske charts er besv\u00e6rligt<\/h3>\n<p><\/p>\n<p>Som n\u00e6vnt tidligere er generiske charts meget nyttige til at definere afh\u00e6ngigheder og hurtigt implementere flere applikationer. Men vi bruger <code>--reuse-values<\/code>, for at undg\u00e5 at overf\u00f8re alle v\u00e6rdier hver gang, vi implementerer en applikation, der er en del af dette generiske chart.<\/p>\n<p><\/p>\n<p>I en kontinuerlig leveringsproces har vi kun to v\u00e6rdier, der \u00e6ndrer sig regelm\u00e6ssigt: antal replikaer og billedtag (version). Andre, mere stabile v\u00e6rdier, \u00e6ndres manuelt, og det er ret kompliceret. Desuden kan en fejl i implementeringen af et generelt chart f\u00f8re til alvorlige nedbrud, som vi har erfaret p\u00e5 egen h\u00e5nd.<\/p>\n<p><\/p>\n<h3 id=\"obnovlenie-neskolkih-faylov-konfiguracii\">Opdatering af flere konfigurationsfiler<\/h3>\n<p><\/p>\n<p>N\u00e5r en udvikler tilf\u00f8jer en ny applikation, skal han \u00e6ndre flere filer: applikationsdeklaration, hemmelighedsliste, tilf\u00f8jelse af applikationen til afh\u00e6ngigheder, hvis den er en del af det generelle chart.<\/p>\n<p><\/p>\n<h3 id=\"razresheniya-jenkins-slishkom-rasshireny-v-vault\">Jenkins-tilladelser er for brede i Vault<\/h3>\n<p><\/p>\n<p>Vi har nu \u00e9n <noindex><a rel=\"nofollow\" href=\"https:\/\/www.vaultproject.io\/docs\/auth\/approle.html\">AppRole<\/a><\/noindex>, som kan l\u00e6se alle hemmeligheder fra Vault.<\/p>\n<p><\/p>\n<h3 id=\"process-otkata-ne-avtomatizirovan\">Rollback-processen er ikke automatiseret<\/h3>\n<p><\/p>\n<p>For at rulle tilbage skal en kommando udf\u00f8res p\u00e5 flere klynger, hvilket kan f\u00f8re til fejl. Vi udf\u00f8rer denne operation manuelt for at sikre, at den rigtige version identificeres.<\/p>\n<p><\/p>\n<h2 id=\"my-dvizhemsya-v-storonu-gitops\">Vi bev\u00e6ger os mod GitOps<\/h2>\n<p><\/p>\n<h3 id=\"nasha-cel\">Vores m\u00e5l<\/h3>\n<p><\/p>\n<p>Vi \u00f8nsker at returnere chartet til applikationsrepositoriet, som det implementerer.<\/p>\n<p><\/p>\n<p>Arbejdsprocessen vil v\u00e6re den samme som for udvikling. For eksempel, n\u00e5r en gren sendes til master, vil implementeringen blive startet automatisk. Den v\u00e6sentligste forskel mellem denne tilgang og den nuv\u00e6rende arbejdsproces vil v\u00e6re, at <strong>alt vil blive styret i git<\/strong> (selve applikationen og m\u00e5den, den implementeres i Kubernetes).<\/p>\n<p><\/p>\n<p>Der er flere fordele:<\/p>\n<p><\/p>\n<ul>\n<li>Mere <strong>forst\u00e5eligt<\/strong> for udvikleren. Det er lettere at l\u00e6re at anvende \u00e6ndringer i det lokale chart.<\/li>\n<li>Definitionen af serviceimplementeringen kan angives <strong>lige d\u00e9r, hvor koden<\/strong> til tjenesten.<\/li>\n<li><strong>H\u00e5ndtering af sletning af generelle charts<\/strong>. Tjenesten vil have sin egen Helm-udgave. Dette vil muligg\u00f8re styring af applikationens livscyklus (rollback, opgradering) p\u00e5 et meget fint niveau, s\u00e5 andre tjenester ikke ber\u00f8res.<\/li>\n<li><strong>Fordele ved git<\/strong> til chart-styring: fortryd \u00e6ndringer, revisionslog osv. Hvis der skal fortrydes en \u00e6ndring af chartet, kan det g\u00f8res med git. Implementeringen startes automatisk.<\/li>\n<li>Man kan overveje at forbedre udviklingsarbejdsgangen ved hj\u00e6lp af v\u00e6rkt\u00f8jer som <strong>Skaffold<\/strong>, hvor udviklere kan teste \u00e6ndringer i en kontekst, der ligner produktion.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"dvuhetapnaya-migraciya\">To-trins migration<\/h3>\n<p><\/p>\n<p>Vores udviklere har brugt denne arbejdsgang i 2 \u00e5r, s\u00e5 vi har brug for en s\u00e5 smertefri migration som muligt. Derfor har vi besluttet at tilf\u00f8je et mellemtrin p\u00e5 vejen mod m\u00e5let.<br \/>\nDet f\u00f8rste trin er enkelt:<\/p>\n<p><\/p>\n<ul>\n<li>Vi bevarer en lignende struktur til indstillingerne for udrulning af applikationer, men i \u00e9t objekt kaldet 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 release per applikation (uden generiske charts).<\/li>\n<li>Charts i applikationens Git-repository.<\/li>\n<\/ul>\n<p><\/p>\n<p>Vi har talt med alle udviklerne, s\u00e5 migrationsprocessen er allerede startet. Det f\u00f8rste trin bliver stadig kontrolleret ved hj\u00e6lp af CI-platformen. Snart skriver jeg et indl\u00e6g om det andet trin: hvordan vi gik over til GitOps-arbejdsgangen med <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/weaveworks\/flux\">Flux<\/a><\/noindex>. Jeg vil fort\u00e6lle, hvordan vi satte det hele op, og hvilke udfordringer vi st\u00f8dte p\u00e5 (flere repositories, hemmeligheder osv.). F\u00f8lg med for nyheder.<\/p>\n<p><\/p>\n<p>Her har vi fors\u00f8gt at beskrive vores fremskridt i arbejdsgangen for udrulning af applikationer over de seneste \u00e5r, der har f\u00f8rt til tanker om GitOps-tilgangen. Vi har endnu ikke n\u00e5et m\u00e5let, og vi vil rapportere om resultaterne, men vi er i \u00f8jeblikket overbeviste om, at vi gjorde det rigtige ved at forenkle alt og n\u00e6rme os udviklernes vaner.<\/p>\n<p>Kilde: <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.3 - 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\/da\/blog\/administrirovanie\/razvertyvanie-prilozhenij-na-neskolkih-klasterah-kubernetes-s-helm\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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\udd47Udrulning af applikationer p\u00e5 flere Kubernetes-klynger med Helm | ProHoster","description":"Hvordan Dailymotion bruger Kubernetes: Udrulning af applikationer Vi i Dailymotion begyndte at bruge Kubernetes i.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/razvertyvanie-prilozhenij-na-neskolkih-klasterah-kubernetes-s-helm","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/35955","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=35955"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/35955\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=35955"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=35955"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=35955"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}