{"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\/sv\/blog\/administrirovanie\/razvertyvanie-prilozhenij-na-neskolkih-klasterah-kubernetes-s-helm","title":{"rendered":"Distribution av applikationer \u00f6ver flera Kubernetes-kluster med Helm","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<\/p>\n<p><\/p>\n<h2 id=\"kak-dailymotion-ispolzuet-kubernetes-razvertyvanie-prilozheniy\">Hur Dailymotion anv\u00e4nder Kubernetes: distribution av applikationer<\/h2>\n<p><\/p>\n<p>Vi p\u00e5 Dailymotion b\u00f6rjade anv\u00e4nda Kubernetes i produktion f\u00f6r tre \u00e5r sedan. Men att distribuera applikationer p\u00e5 flera kluster \u00e4r en utmaning, s\u00e5 under de senaste \u00e5ren har vi f\u00f6rs\u00f6kt f\u00f6rb\u00e4ttra v\u00e5ra verktyg och arbetsfl\u00f6den.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"s-chego-nachalos\">Hur det b\u00f6rjade<\/h3>\n<p><\/p>\n<p>H\u00e4r ber\u00e4ttar vi hur vi distribuerar v\u00e5ra applikationer p\u00e5 flera Kubernetes-kluster runt om i v\u00e4rlden.<\/p>\n<p><\/p>\n<p>F\u00f6r att distribuera flera Kubernetes-objekt samtidigt anv\u00e4nder vi <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/\">Helm<\/a><\/noindex>, och alla v\u00e5ra chartar lagras i ett enda git-repositorium. F\u00f6r att distribuera en fullst\u00e4ndig applikationsstack best\u00e5ende av flera tj\u00e4nster, anv\u00e4nder vi en s\u00e5 kallad \u00f6vergripande chart. I grund och botten \u00e4r det en chart som deklarerar beroenden och g\u00f6r det m\u00f6jligt att initiera API:er och deras tj\u00e4nster med ett enda kommando.<\/p>\n<p><\/p>\n<p>Vi har ocks\u00e5 skrivit ett litet Python-skript ovanp\u00e5 Helm f\u00f6r att g\u00f6ra kontroller, skapa chartar, l\u00e4gga till hemligheter och distribuera applikationer. Alla dessa uppgifter utf\u00f6rs p\u00e5 en central CI-plattform med hj\u00e4lp av en docker-image.<\/p>\n<p><\/p>\n<p>L\u00e5t oss g\u00e5 till k\u00e4rnan.<\/p>\n<p><\/p>\n<blockquote><p>Obs. N\u00e4r du l\u00e4ser detta har den f\u00f6rsta releasekandidaten f\u00f6r Helm 3 redan tillk\u00e4nnagivits. Huvudversionen inneh\u00e5ller en hel upps\u00e4ttning f\u00f6rb\u00e4ttringar som syftar till att l\u00f6sa vissa problem vi har st\u00f6tt p\u00e5 tidigare.<\/p><\/blockquote>\n<p><\/p>\n<h3 id=\"rabochiy-process-razrabotki-chartov\">Utvecklingsarbetsfl\u00f6de f\u00f6r chartar<\/h3>\n<p><\/p>\n<p>F\u00f6r applikationer anv\u00e4nder vi grenar, och vi best\u00e4mde oss f\u00f6r att till\u00e4mpa denna metod \u00e4ven p\u00e5 chartarna.<\/p>\n<p><\/p>\n<ul>\n<li>Grenen <strong>dev<\/strong> anv\u00e4nds f\u00f6r att skapa chartar som kommer att testas p\u00e5 utvecklingskluster.<\/li>\n<li>N\u00e4r en pull-beg\u00e4ran \u00f6verf\u00f6rs till <strong>master<\/strong>, de testas i staging.<\/li>\n<li>Slutligen skapar vi en pull-beg\u00e4ran f\u00f6r att \u00f6verf\u00f6ra \u00e4ndringar till grenen <strong>prod<\/strong> och till\u00e4mpa dem i produktion.<\/li>\n<\/ul>\n<p><\/p>\n<p>Varje milj\u00f6 har sitt eget privata repositorium som lagrar v\u00e5ra chartar, och vi anv\u00e4nder <noindex><a rel=\"nofollow\" href=\"https:\/\/chartmuseum.com\/\">Chartmuseum<\/a><\/noindex> med mycket anv\u00e4ndbara API:er. P\u00e5 s\u00e5 s\u00e4tt s\u00e4kerst\u00e4ller vi strikt isolering mellan milj\u00f6erna och testning av chartarna under verkliga f\u00f6rh\u00e5llanden innan vi anv\u00e4nder 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>Repositorier f\u00f6r chartar i olika milj\u00f6er<\/em><\/p>\n<p><\/p>\n<p>Det \u00e4r v\u00e4rt att notera att n\u00e4r utvecklare skickar en dev-gren, skickas versionen av deras chart automatiskt till dev Chartmuseum. S\u00e5ledes anv\u00e4nder alla utvecklare ett gemensamt dev-repositorium, och det \u00e4r viktigt att noggrant ange sin chart-version f\u00f6r att inte av misstag anv\u00e4nda n\u00e5gon annans \u00e4ndringar.<\/p>\n<p><\/p>\n<p>Dessutom kontrollerar v\u00e5rt lilla Python-skript Kubernetes-objekt mot specifikationerna f\u00f6r Kubernetes OpenAPI med hj\u00e4lp av <noindex><a rel=\"nofollow\" href=\"https:\/\/kubeval.instrumenta.dev\/\">Kubeval<\/a><\/noindex>, innan de publiceras i Chartmuseum.<\/p>\n<p><\/p>\n<h3 id=\"obschee-opisanie-rabochego-processa-razrabotki-charta\">\u00d6versikt \u00f6ver arbetsfl\u00f6det f\u00f6r chartutveckling<\/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>Inst\u00e4llning av pipeline-uppgifter enligt specifikationen <noindex><a rel=\"nofollow\" href=\"https:\/\/gazr.io\/\">gazr.io<\/a><\/noindex> f\u00f6r kvalitetskontroll (lint, enhetstest).<\/li>\n<li>Skicka dockerbilden med Python-verktyg som distribuerar v\u00e5ra applikationer.<\/li>\n<li>Konfigurera milj\u00f6n efter grenens namn.<\/li>\n<li>Kontrollera Kubernetes yaml-filer med hj\u00e4lp av Kubeval.<\/li>\n<li>Automatisk \u00f6kning av versionen p\u00e5 chartet och dess f\u00f6r\u00e4ldrarchart (de chart som beror p\u00e5 det \u00e4ndrade chartet).<\/li>\n<li>Skicka chartet till Chartmuseum som motsvarar dess milj\u00f6<\/li>\n<\/ol>\n<p><\/p>\n<h2 id=\"upravlenie-razlichiyami-v-klasterah\">Hantera skillnader mellan kluster<\/h2>\n<p><\/p>\n<h3 id=\"federaciya-klasterov\">Federering av kluster<\/h3>\n<p><\/p>\n<p>Det var en tid n\u00e4r vi anv\u00e4nde <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/cluster-administration\/federation\/\">federering av Kubernetes-kluster<\/a><\/noindex>, d\u00e4r man kunde deklarera Kubernetes-objekt fr\u00e5n en API-slutpunkt. Men det uppstod problem. Till exempel kunde vissa Kubernetes-objekt inte skapas vid federationsslutpunkten, vilket gjorde det sv\u00e5rt att underh\u00e5lla sammanst\u00e4llda objekt och andra objekt f\u00f6r individuella kluster.<\/p>\n<p><\/p>\n<p>F\u00f6r att l\u00f6sa problemet b\u00f6rjade vi hantera kluster oberoende, vilket avsev\u00e4rt f\u00f6renklade processen (vi anv\u00e4nde den f\u00f6rsta versionen av federation; i den andra kunde n\u00e5got ha \u00e4ndrats).<\/p>\n<p><\/p>\n<h3 id=\"georaspredelennaya-platforma\">Geodistribuerad plattform<\/h3>\n<p><\/p>\n<p>Nu \u00e4r v\u00e5r plattform distribuerad \u00f6ver 6 regioner \u2014 3 lokalt och 3 i molnet.<\/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>Distribuerad distribution<\/em><\/p>\n<p><\/p>\n<h3 id=\"globalnye-znacheniya-helm\">Globala v\u00e4rden f\u00f6r Helm<\/h3>\n<p><\/p>\n<p>4 globala v\u00e4rden f\u00f6r Helm g\u00f6r det m\u00f6jligt att definiera skillnader mellan kluster. F\u00f6r alla v\u00e5ra chart finns det minimiv\u00e4rden som standard.<\/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>Globala v\u00e4rden<\/em><\/p>\n<p><\/p>\n<p>Dessa v\u00e4rden hj\u00e4lper till att definiera kontexten f\u00f6r v\u00e5ra applikationer och anv\u00e4nds f\u00f6r olika uppgifter: \u00f6vervakning, sp\u00e5rning, loggning, externa anrop, automatisering och s\u00e5 vidare.<\/p>\n<p><\/p>\n<ul>\n<li>\"cloud\": vi har en hybrid Kubernetes-plattform. Till exempel distribueras v\u00e5rt API i GCP-zoner och i v\u00e5ra datacenter.<\/li>\n<li>\"env\": vissa v\u00e4rden kan variera f\u00f6r icke-produktionsmilj\u00f6er. Till exempel resursdefinitioner och konfigurationer f\u00f6r automatisk skalning.<\/li>\n<li>\"region\": denna information hj\u00e4lper till att definiera klustrets l\u00e4ge och kan anv\u00e4ndas f\u00f6r att fastst\u00e4lla n\u00e4rmaste slutpunkter f\u00f6r externa tj\u00e4nster.<\/li>\n<li>\"clusterName\": om och n\u00e4r vi vill definiera ett v\u00e4rde f\u00f6r ett enskilt kluster.<\/li>\n<\/ul>\n<p><\/p>\n<p>H\u00e4r \u00e4r ett konkret exempel:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">{{\n\/* Returnerar Horizontal Pod Autoscaler-replikat f\u00f6r GraphQL*\/}}\n{{- definiera \"graphql.hpaReplicas\" -}}\n{{- om eq .Values.global.env \"prod\" }}\n{{- om eq .Values.global.region \"europe-west1\" }}\nminReplicas: 40\n{{- annars }}\nminReplicas: 150\n{{- slut }}\nmaxReplicas: 1400\n{{- annars }}\nminReplicas: 4\nmaxReplicas: 20\n{{- slut }}\n{{- slut -}}<\/code><\/pre>\n<p><\/p>\n<p><em>Exempel p\u00e5 en Helm-mall<\/em><\/p>\n<p><\/p>\n<p>Denna logik definieras i en hj\u00e4lpmall f\u00f6r att inte \u00f6verbelasta Kubernetes YAML.<\/p>\n<p><\/p>\n<h3 id=\"obyavlenie-prilozheniya\">Applikationsdeklaration<\/h3>\n<p><\/p>\n<p>V\u00e5ra distributionsverktyg baseras p\u00e5 flera YAML-filer. Nedan \u00e4r ett exempel p\u00e5 hur vi deklarerar en tj\u00e4nst och dess skalningstopologi (antal replikat) i klustret.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">releases:\n  - foo.world\n\nfoo.world:                # Namn p\u00e5 releasen\n  services:               # Lista \u00f6ver dailymotion's appar\/projekt\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>Tj\u00e4nstedeklaration<\/em><\/p>\n<p><\/p>\n<p>Detta \u00e4r en \u00f6versikt av alla steg som definierar v\u00e5r distributionsarbetsfl\u00f6de. Det sista steget distribuerar applikationen samtidigt i flera arbetskluster.<\/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>Distributionssteg i Jenkins<\/em><\/p>\n<p><\/p>\n<h3 id=\"a-sekrety\">Och hemligheterna?<\/h3>\n<p><\/p>\n<p>Vad g\u00e4ller s\u00e4kerhet s\u00e5 f\u00f6ljer vi alla hemligheter fr\u00e5n olika platser och lagrar dem i ett unikt f\u00f6rr\u00e5d <noindex><a rel=\"nofollow\" href=\"https:\/\/www.vaultproject.io\/\">Vault<\/a><\/noindex> i Paris.<\/p>\n<p><\/p>\n<p>V\u00e5ra distributionsverktyg h\u00e4mtar hemligheternas v\u00e4rden fr\u00e5n Vault och, n\u00e4r det \u00e4r dags f\u00f6r distribution, infogar dem i Helm.<\/p>\n<p><\/p>\n<p>F\u00f6r detta har vi definierat en mappning mellan hemligheterna i Vault och de hemligheter som v\u00e5ra applikationer beh\u00f6ver:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">hemligheter:                                                                                                                                                                                                        \n     - secret_id: \"stack1-app1-password\"                                                                                                                                                                                  \n       kontexter:                                                                                                                                                                                                   \n         - namn: \"default\"                                                                                                                                                                                         \n           vaultPath: \"\\\/kv\\\/dev\\\/stack1\\\/app1\\\/test\"                                                                                                                                                               \n           vaultKey: \"password\"                                                                                                                                                                                    \n         - namn: \"cluster1\"                                                                                                                                                                           \n           vaultPath: \"\\\/kv\\\/dev\\\/stack1\\\/app1\\\/test\"                                                                                                                                                               \n           vaultKey: \"password\"<\/code><\/pre>\n<p><\/p>\n<ul>\n<li>Vi har fastst\u00e4llt allm\u00e4nna regler som m\u00e5ste f\u00f6ljas vid inspelning av hemligheter i Vault.<\/li>\n<li>Om hemligheten h\u00f6r till <strong>en viss kontext eller kluster<\/strong>, m\u00e5ste en specifik post l\u00e4ggas till. (H\u00e4r har kontexten cluster1 sitt eget v\u00e4rde f\u00f6r hemligheten stack-app1-password).<\/li>\n<li>Annars anv\u00e4nds v\u00e4rdet <strong>standard<\/strong>.<\/li>\n<li>F\u00f6r varje punkt i denna lista i <strong>Kubernetes-hemligheten<\/strong> infogas ett nyckel-v\u00e4rde-par. D\u00e4rf\u00f6r \u00e4r mallen f\u00f6r hemligheten i v\u00e5ra diagram mycket enkel.<\/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 }}\"\ntyp: Opaque<\/code><\/pre>\n<p><\/p>\n<h2 id=\"problemy-i-ogranicheniya\">Problem och begr\u00e4nsningar<\/h2>\n<p><\/p>\n<h3 id=\"rabota-s-neskolkimi-repozitoriyami\">Arbeta med flera lager<\/h3>\n<p><\/p>\n<p>Just nu delar vi utvecklingen av diagram och applikationer. Det inneb\u00e4r att utvecklarna m\u00e5ste arbeta i tv\u00e5 git-repositorier: ett f\u00f6r applikationen och ett annat f\u00f6r att definiera dess distribution i Kubernetes. 2 git-repositorier inneb\u00e4r 2 arbetsfl\u00f6den, och det \u00e4r l\u00e4tt f\u00f6r en nyb\u00f6rjare att bli f\u00f6rvirrad.<\/p>\n<p><\/p>\n<h3 id=\"upravlyat-obobschennymi-chartami-hlopotno\">Att hantera generiska diagram \u00e4r besv\u00e4rligt<\/h3>\n<p><\/p>\n<p>Som redan n\u00e4mnts \u00e4r generiska diagram mycket anv\u00e4ndbara f\u00f6r att definiera beroenden och snabbt distribuera flera applikationer. Men vi anv\u00e4nder <code>--reuse-values<\/code>, f\u00f6r att undvika att skicka vidare alla v\u00e4rden varje g\u00e5ng vi distribuerar en applikation som ing\u00e5r i det generiska diagrammet.<\/p>\n<p><\/p>\n<p>I den kontinuerliga leveransprocessen har vi bara tv\u00e5 v\u00e4rden som \u00e4ndras regelbundet: antalet repliker och bildtaggen (version). Andra, mer stabila v\u00e4rden \u00e4ndras manuellt, vilket \u00e4r ganska sv\u00e5rt. Dessutom kan ett enda fel i distributionen av en generell chart leda till allvarliga fel, som vi har sett av egen erfarenhet.<\/p>\n<p><\/p>\n<h3 id=\"obnovlenie-neskolkih-faylov-konfiguracii\">Uppdatering av flera konfigurationsfiler<\/h3>\n<p><\/p>\n<p>N\u00e4r en utvecklare l\u00e4gger till en ny applikation m\u00e5ste han \u00e4ndra flera filer: applikationsdeklarationen, listan \u00f6ver hemligheter och l\u00e4gga till applikationen i beroendena om den ing\u00e5r i den generella charten.<\/p>\n<p><\/p>\n<h3 id=\"razresheniya-jenkins-slishkom-rasshireny-v-vault\">Jenkins-beh\u00f6righeter \u00e4r f\u00f6r omfattande i Vault<\/h3>\n<p><\/p>\n<p>Nu har vi en <noindex><a rel=\"nofollow\" href=\"https:\/\/www.vaultproject.io\/docs\/auth\/approle.html\">AppRole<\/a><\/noindex>, som l\u00e4ser alla hemligheter fr\u00e5n Vault.<\/p>\n<p><\/p>\n<h3 id=\"process-otkata-ne-avtomatizirovan\">Rollback-processen \u00e4r inte automatiserad<\/h3>\n<p><\/p>\n<p>F\u00f6r rollback m\u00e5ste man k\u00f6ra kommandot p\u00e5 flera kluster, vilket kan leda till fel. Vi utf\u00f6r denna operation manuellt f\u00f6r att s\u00e4kerst\u00e4lla att r\u00e4tt versionsidentifierare anges.<\/p>\n<p><\/p>\n<h2 id=\"my-dvizhemsya-v-storonu-gitops\">Vi r\u00f6r oss mot GitOps<\/h2>\n<p><\/p>\n<h3 id=\"nasha-cel\">V\u00e5rt m\u00e5l<\/h3>\n<p><\/p>\n<p>Vi vill f\u00f6ra tillbaka charten till applikationsrepositoryt som den distribuerar.<\/p>\n<p><\/p>\n<p>Arbetsfl\u00f6det kommer att vara detsamma som f\u00f6r utveckling. Till exempel, n\u00e4r en gren skickas till master, kommer distributionen att starta automatiskt. Den huvudsakliga skillnaden mellan detta tillv\u00e4gag\u00e5ngss\u00e4tt och det nuvarande arbetsfl\u00f6det \u00e4r att <strong>allt kommer att hanteras i git<\/strong> (sj\u00e4lva applikationen och hur den distribueras i Kubernetes).<\/p>\n<p><\/p>\n<p>Det finns flera f\u00f6rdelar:<\/p>\n<p><\/p>\n<ul>\n<li>Mycket <strong>mer begripligt<\/strong> f\u00f6r utvecklaren. Det \u00e4r enklare att l\u00e4ra sig till\u00e4mpa \u00e4ndringar i den lokala charten.<\/li>\n<li>Definitionen av distributionen av tj\u00e4nsten kan anges <strong>d\u00e4r d\u00e4r koden<\/strong> f\u00f6r tj\u00e4nsten.<\/li>\n<li><strong>Hantering av borttagning av generella charts<\/strong>. Tj\u00e4nsten kommer att ha sin egen Helm-release. Detta kommer att m\u00f6jligg\u00f6ra hantering av applikationens livscykel (rollback, uppgradering) p\u00e5 den minsta niv\u00e5n, s\u00e5 att andra tj\u00e4nster inte p\u00e5verkas.<\/li>\n<li><strong>F\u00f6rdelar med git<\/strong> f\u00f6r hantering av charts: \u00e4ndrings\u00e5terkallelse, revisionslogg osv. Om en \u00e4ndring av charten m\u00e5ste \u00e5terkallas kan detta g\u00f6ras med hj\u00e4lp av git. Distributionen startar automatiskt.<\/li>\n<li>Man kan \u00f6verv\u00e4ga att f\u00f6rb\u00e4ttra utvecklingsarbetsfl\u00f6det med hj\u00e4lp av s\u00e5dana verktyg som <strong>Skaffold<\/strong>, d\u00e4r utvecklare kan testa \u00e4ndringar i en kontext som liknar produktionsmilj\u00f6n.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"dvuhetapnaya-migraciya\">Tv\u00e5stegs migrering<\/h3>\n<p><\/p>\n<p>V\u00e5ra utvecklare har anv\u00e4nt denna arbetsprocess i 2 \u00e5r, s\u00e5 vi beh\u00f6ver en s\u00e5 smidig migrering som m\u00f6jligt. D\u00e4rf\u00f6r beslutade vi att l\u00e4gga till ett mellanliggande steg p\u00e5 v\u00e4gen mot m\u00e5let.<br \/>\nDet f\u00f6rsta steget \u00e4r enkelt:<\/p>\n<p><\/p>\n<ul>\n<li>Vi beh\u00e5ller en liknande struktur f\u00f6r att konfigurera distributionen av applikationer, men i ett objekt med namnet 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 (utan allm\u00e4nna diagram).<\/li>\n<li>Diagram i applikations Git-f\u00f6rvaret.<\/li>\n<\/ul>\n<p><\/p>\n<p>Vi har pratat med alla utvecklare, s\u00e5 migrationsprocessen har redan p\u00e5b\u00f6rjats. Det f\u00f6rsta steget kontrolleras fortfarande med hj\u00e4lp av CI-plattformen. Snart kommer jag att skriva ett inl\u00e4gg om det andra steget: hur vi gick \u00f6ver till arbetsprocessen GitOps med <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/weaveworks\/flux\">Flux<\/a><\/noindex>. Jag kommer att ber\u00e4tta hur vi konfigurerade allt och vilka sv\u00e5righeter vi st\u00f6tte p\u00e5 (flera f\u00f6rvar, hemligheter osv.). H\u00e5ll dig uppdaterad.<\/p>\n<p><\/p>\n<p>H\u00e4r har vi f\u00f6rs\u00f6kt beskriva v\u00e5ra framsteg inom distributionsprocessen av applikationer de senaste \u00e5ren, vilket har lett till tankar om GitOps-ansatsen. Vi har \u00e4nnu inte n\u00e5tt m\u00e5let och kommer att rapportera om resultaten, men vi \u00e4r nu \u00f6vertygade om att vi gjorde r\u00e4tt n\u00e4r vi beslutade att f\u00f6renkla allt och anpassa det till utvecklarnas vanor.<\/p>\n<p>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/razvertyvanie-prilozhenij-na-neskolkih-klasterah-kubernetes-s-helm\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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\udd47Distribution av applikationer p\u00e5 flera Kubernetes-kluster med Helm | ProHoster","description":"Hur Dailymotion anv\u00e4nder Kubernetes: distribution av applikationer. Vi p\u00e5 Dailymotion b\u00f6rjade anv\u00e4nda Kubernetes i.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/razvertyvanie-prilozhenij-na-neskolkih-klasterah-kubernetes-s-helm","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/35955","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=35955"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/35955\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=35955"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=35955"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=35955"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}