{"id":53120,"date":"2019-11-24T00:00:00","date_gmt":"2019-11-23T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/3-way-merge-v-werf-deploj-v-kubernetes-s-helm-na-steroidah"},"modified":"2020-02-18T14:00:59","modified_gmt":"2020-02-18T11:00:59","slug":"3-way-merge-v-werf-deploj-v-kubernetes-s-helm-na-steroidah","status":"publish","type":"post","link":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/3-way-merge-v-werf-deploj-v-kubernetes-s-helm-na-steroidah","title":{"rendered":"3-way merge a werf: telep\u00edt\u00e9s Kubernetesbe Helm 'szteroidokon'","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Megval\u00f3sult az, amire mi (\u00e9s nem csak mi) r\u00e9g\u00f3ta v\u00e1rtunk: <noindex><a rel=\"nofollow\" href=\"https:\/\/werf.io\/\">werf<\/a><\/noindex>, az Open Source alkalmaz\u00e1sgy\u0171jt\u0151 \u00e9s Kubernetes-be val\u00f3 telep\u00edt\u0151 eszk\u00f6z\u00fcnk most m\u00e1r t\u00e1mogatja a v\u00e1ltoztat\u00e1sok alkalmaz\u00e1s\u00e1t 3-way-merge patch-ekkel! Ezen k\u00edv\u00fcl lehet\u0151s\u00e9g ny\u00edlt a megl\u00e9v\u0151 K8s-erd\u0151k adopci\u00f3j\u00e1ra Helm-kiad\u00e1sokba an\u00e9lk\u00fcl, hogy ezeket \u00fajra l\u00e9trehozn\u00e1nk.<\/p>\n<p><img decoding=\"async\" alt=\"3-way merge a werf: telep\u00edt\u00e9s Kubernetesbe Helm &#039;szteroidokon&#039;\" src=\"\/wp-content\/uploads\/2019\/11\/e5be3544c201f7b2c97fba216a49506d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nR\u00f6viden: \u00e1ll\u00edtsuk be <code>WERF_THREE_WAY_MERGE=enabled<\/code> \u2014 \u00e9s megkapjuk a m\u00e1r megl\u00e9v\u0151 Helm 2 telep\u00edt\u00e9sekkel kompatibilis \u201edeploy\u201d-t, s\u0151t egy kicsit t\u00f6bbet is. <code>kubectl apply<\/code>De kezdj\u00fck a te\u00f3ri\u00e1val: mi is az a 3-way-merge patch, hogyan jutottak el az emberek ehhez a megold\u00e1shoz, \u00e9s mi\u00e9rt fontosak a CI\/CD folyamatokban, amelyeket Kubernetes-alap\u00fa infrastrukt\u00far\u00e1val kezel\u00fcnk? Azt\u00e1n n\u00e9zz\u00fck meg, hogy mit is jelent a 3-way-merge a werf-ben, milyen alap\u00e9rtelmezett m\u00f3dszerek \u00e1llnak rendelkez\u00e9sre, \u00e9s hogyan tudjuk ezeket kezelni.<\/p>\n<p>Mi az a 3-way-merge patch?<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Teh\u00e1t kezdj\u00fck azzal, hogy a Kubernetes-ben YAML-manifesztumokban le\u00edrt er\u0151forr\u00e1sokat kiadunk.<\/h2>\n<p>\nA Kubernetes API a k\u00f6vetkez\u0151 alapvet\u0151 m\u0171veleteket k\u00edn\u00e1lja az er\u0151forr\u00e1sokkal val\u00f3 munk\u00e1hoz: create, patch, replace \u00e9s delete. Ezek seg\u00edts\u00e9g\u00e9vel egy k\u00e9nyelmes folyamatos er\u0151forr\u00e1skiad\u00e1st kell megval\u00f3s\u00edtani a klaszterben. Hogyan?<\/p>\n<p>Imperat\u00edv kubectl parancsok<\/p>\n<h3>Az els\u0151 megk\u00f6zel\u00edt\u00e9s az objektumok kezel\u00e9s\u00e9re a Kubernetes-ben a kubectl imperat\u00edv parancsainak haszn\u00e1lata az objektumok l\u00e9trehoz\u00e1s\u00e1ra, m\u00f3dos\u00edt\u00e1s\u00e1ra \u00e9s t\u00f6rl\u00e9s\u00e9re. Egyszer\u0171en fogalmazva:<\/h3>\n<p>\nkubectl run<\/p>\n<ul>\n<li> parancsot <code>egy Deployment vagy Job ind\u00edt\u00e1s\u00e1ra haszn\u00e1lhat\u00f3:<\/code> kubectl run --generator=deployment\/apps.v1 DEPLOYMENT_NAME --image=IMAGE\n<pre><code class=\"bash\">kubectl scale<\/code><\/pre>\n<\/li>\n<li> parancsot <code>\u2014 a replik\u00e1k sz\u00e1m\u00e1nak m\u00f3dos\u00edt\u00e1sa:<\/code> kubectl scale --replicas=3 deployment\/mysql\n<pre><code class=\"bash\">Ez a megk\u00f6zel\u00edt\u00e9s els\u0151re k\u00e9nyelmesnek t\u0171nhet. Azonban vannak probl\u00e9m\u00e1k:<\/code><\/pre>\n<\/li>\n<li>stb.<\/li>\n<\/ul>\n<p>\nNeh\u00e9z <\/p>\n<ol>\n<li> automatiz\u00e1lni <b>a konfigur\u00e1ci\u00f3t<\/b>.<\/li>\n<li> Mint <b>Git-ben? Hogyan lehet \u00e1tn\u00e9zni a klaszteren bek\u00f6vetkez\u0151 v\u00e1ltoz\u00e1sokat?<\/b> Hogyan biztos\u00edtsuk<\/li>\n<li> a reproduk\u00e1lhat\u00f3s\u00e1got <b>az \u00fajraind\u00edt\u00e1sok sor\u00e1n?<\/b> Nyilv\u00e1nval\u00f3, hogy ez a megk\u00f6zel\u00edt\u00e9s nem illeszkedik j\u00f3l a k\u00f3d mellett t\u00e1rolt alkalmaz\u00e1sokhoz \u00e9s az infrastrukt\u00fara k\u00f3d form\u00e1j\u00e1ban (IaC; vagy ak\u00e1r a Kubernetes \u00f6kosziszt\u00e9m\u00e1ban n\u00e9pszer\u0171bb\u00e9 v\u00e1l\u00f3 modernebb v\u00e1ltozata). Ez\u00e9rt a kubectl parancsoknak nem volt tov\u00e1bbi fejl\u0151d\u00e9s\u00fck.<\/li>\n<li>\u2026<\/li>\n<\/ol>\n<p>\nA create, get, replace \u00e9s delete m\u0171veletek <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/458878\/\">GitOps<\/a><\/noindex> Az els\u0151dleges<\/p>\n<h3>l\u00e9trehoz\u00e1s<\/h3>\n<p>\nnagyon egyszer\u0171: egy manifesztet k\u00fcld\u00fcnk a <b>create<\/b> m\u0171veletnek a kube API-n, \u00e9s az er\u0151forr\u00e1s l\u00e9trej\u00f6n. A manifeszt YAML-reprezent\u00e1ci\u00f3j\u00e1t t\u00e1rolhatjuk a Git-ben, a l\u00e9trehoz\u00e1shoz pedig a k\u00f6vetkez\u0151 parancsot haszn\u00e1lhatjuk: <code>kubectl create -f manifest.yaml<\/code> A t\u00f6rl\u00e9s <code>is egyszer\u0171: ugyanazt a<\/code>.<\/p>\n<p>K\u00e9sleltetett streaming replik\u00e1ci\u00f3t is be\u00e1ll\u00edthatunk, de van n\u00e9h\u00e1ny csapda, amelyek a replik\u00e1ci\u00f3s slotokkal, a forr\u00f3 tartal\u00e9k visszajelz\u00e9s\u00e9vel stb. kapcsolatosak. A WAL arch\u00edvum lehet\u0151v\u00e9 teszi, hogy elker\u00fclj\u00fck ezeket. <b>manifest.yaml<\/b> f\u00e1jlt \u00e1ll\u00edtjuk be a parancsban: <code>kubectl delete -f manifest.yaml<\/code> replace <code>kubectl delete -f manifest.yaml<\/code>.<\/p>\n<p>M\u0171velet <b><code>kicser\u00e9l<\/code><\/b> teljes m\u00e9rt\u00e9kben helyettes\u00edti az er\u0151forr\u00e1s konfigur\u00e1ci\u00f3j\u00e1t egy \u00fajjal, an\u00e9lk\u00fcl hogy \u00fajat kellene l\u00e9trehozni. Ez azt jelenti, hogy miel\u0151tt m\u00f3dos\u00edtan\u00e1nk az er\u0151forr\u00e1st, \u00e9sszer\u0171 el\u0151sz\u00f6r lek\u00e9rdezni a jelenlegi verzi\u00f3t egy m\u0171velettel <code>get<\/code>, m\u00f3dos\u00edtani azt, majd friss\u00edteni a m\u0171velettel <code>kicser\u00e9l<\/code>. A kube apiserverbe be\u00e9p\u00edtett <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Optimistic_concurrency_control\">optimista z\u00e1rol\u00e1s<\/a><\/noindex> \u00e9s ha a m\u0171velet ut\u00e1n <code>get<\/code> az objektum megv\u00e1ltozott, akkor a m\u0171velet <code>kicser\u00e9l<\/code> nem fog v\u00e9grehajt\u00f3dni.<\/p>\n<p>Ahhoz, hogy a konfigur\u00e1ci\u00f3t Git-ben t\u00e1roljuk \u00e9s replace seg\u00edts\u00e9g\u00e9vel friss\u00edts\u00fck, el kell v\u00e9gezni a m\u0171veletet <code>get<\/code>, \u00f6ssze kell olvasztani a konfigur\u00e1ci\u00f3t a Git-b\u0151l azzal, amit kaptunk, \u00e9s v\u00e9grehajtani a <code>kicser\u00e9l<\/code>. Alap\u00e9rtelmezetten a kubectl csak a parancs haszn\u00e1lat\u00e1t teszi lehet\u0151v\u00e9 <code>kubectl replace -f manifest.yaml<\/code>, ahol <code>kubectl delete -f manifest.yaml<\/code> \u2014 m\u00e1r teljesen el\u0151k\u00e9sz\u00edtett (eset\u00fcnkben - egyes\u00edtett) manifeszt, amelyet telep\u00edteni kell. Teh\u00e1t a felhaszn\u00e1l\u00f3nak meg kell val\u00f3s\u00edtania a manifeszt-\u00f6sszevon\u00e1st, ami nem trivi\u00e1lis feladat\u2026<\/p>\n<p>\u00c9rdemes megjegyezni, hogy b\u00e1r <code>kubectl delete -f manifest.yaml<\/code> Git-ben t\u00e1roljuk, nem tudhatjuk el\u0151re, hogy l\u00e9tre kell-e hoznunk egy objektumot vagy friss\u00edteni azt \u2014 ezt a felhaszn\u00e1l\u00f3i szoftvernek kell megtennie.<\/p>\n<p>\u00d6sszesen: <b>megval\u00f3s\u00edthatjuk-e a folyamatos telep\u00edt\u00e9st<\/b> csak a create, replace \u00e9s delete parancsok seg\u00edts\u00e9g\u00e9vel, biztos\u00edtva az infrastrukt\u00fara konfigur\u00e1ci\u00f3j\u00e1nak Git-ben t\u00f6rt\u00e9n\u0151 t\u00e1rol\u00e1s\u00e1t a k\u00f3ddal egy\u00fctt \u00e9s k\u00e9nyelmes CI\/CD-t?<\/p>\n<p>Elvben megtehetj\u00fck\u2026 Ehhez <b>meg kell val\u00f3s\u00edtani a manifeszt-\u00f6sszevon\u00e1st<\/b> \u00e9s egy olyan keretrendszert, amely:<\/p>\n<ul>\n<li> ellen\u0151rzi az objektum jelenl\u00e9t\u00e9t a klaszterben,<\/li>\n<li> v\u00e9grehajtja az er\u0151forr\u00e1s els\u0151dleges l\u00e9trehoz\u00e1s\u00e1t,<\/li>\n<li> friss\u00edti vagy t\u00f6rli azt.<\/li>\n<\/ul>\n<p>\nFriss\u00edt\u00e9skor figyelembe kell venni, hogy <i>az er\u0151forr\u00e1s megv\u00e1ltozhatott<\/i> az utols\u00f3 alkalom \u00f3ta <code>get<\/code> \u00e9s automatikusan kezelni kell az optimista z\u00e1rol\u00e1s eset\u00e9t \u2014 meg kell pr\u00f3b\u00e1lni a friss\u00edt\u00e9st \u00fajra.<\/p>\n<p>De mi\u00e9rt tal\u00e1ljunk fel a bikalit, amikor a kube-apiserver m\u00e1s m\u00f3dot k\u00edn\u00e1l az er\u0151forr\u00e1sok friss\u00edt\u00e9s\u00e9re: a <code>patch<\/code>, amely r\u00e9szben leveszi a terhet a felhaszn\u00e1l\u00f3r\u00f3l?<\/p>\n<h3>Patch<\/h3>\n<p>\n\u00cdme, el\u00e9rkezt\u00fcnk a jav\u00edt\u00e1sokhoz.<\/p>\n<p>A jav\u00edt\u00e1sok a Kubernetes-ben l\u00e9tez\u0151 objektumok m\u00f3dos\u00edt\u00e1s\u00e1nak f\u0151 m\u00f3dj\u00e1t jelentik. A m\u0171velet <code>patch<\/code> \u00fagy m\u0171k\u00f6dik, hogy a felhaszn\u00e1l\u00f3nak a kube-apiserverhez kell k\u00fcldenie a jav\u00edt\u00e1st JSON form\u00e1tumban, \u00e9s meg kell adnia az objektumot,<\/p>\n<ul>\n<li> m\u00edg az apiserver automatikusan kezeli az objektum aktu\u00e1lis \u00e1llapot\u00e1t, \u00e9s az sz\u00fcks\u00e9ges form\u00e1ra \u00e1ll\u00edtja.<\/li>\n<li> Ebben az esetben az optimista z\u00e1rol\u00e1s nem sz\u00fcks\u00e9ges. Ez a m\u0171velet deklarat\u00edvabb a replacehez k\u00e9pest, b\u00e1r kezdetben ellentmond\u00e1sosnak t\u0171nhet.<\/li>\n<\/ul>\n<p>\nEz\u00e9rt:<\/p>\n<p>a m\u0171velet seg\u00edts\u00e9g\u00e9vel<\/p>\n<ul>\n<li> l\u00e9trehozzuk az objektumot a Git-b\u0151l sz\u00e1rmaz\u00f3 manifeszt alapj\u00e1n, <code>kubectl create -f manifest.yaml<\/code> \u2014 elt\u00e1vol\u00edtjuk, ha az objektum m\u00e1r nem sz\u00fcks\u00e9ges,<\/li>\n<li> seg\u00edts\u00e9g\u00e9vel <code>t\u00f6rl\u00e9s<\/code> \u2014 m\u00f3dos\u00edtjuk az objektumot, hogy megfeleljen a Git-ben le\u00edrtaknak.<\/li>\n<li> seg\u00edts\u00e9g\u00e9vel <code>patch<\/code> \u2014 m\u00f3dos\u00edtjuk az objektumot, hogy megfeleljen a Git-ben le\u00edrt form\u00e1nak.<\/li>\n<\/ul>\n<p>\nAhhoz, hogy ezt megtegy\u00fck, l\u00e9tre kell hozni <i>a megfelel\u0151 jav\u00edt\u00e1st<\/i>!<\/p>\n<h3>Hogyan m\u0171k\u00f6dnek a jav\u00edt\u00e1sok a Helm 2-ben: 2-way-merge<\/h3>\n<p>\nA Helm kiad\u00e1s\u00e1nak els\u0151 telep\u00edt\u00e9sekor v\u00e9grehajtja a m\u0171veletet <code>kubectl create -f manifest.yaml<\/code> a chart er\u0151forr\u00e1saival.<\/p>\n<p>A Helm kiad\u00e1s\u00e1nak friss\u00edt\u00e9sekor minden er\u0151forr\u00e1shoz:<\/p>\n<ul>\n<li> megsz\u00e1molja a jav\u00edt\u00e1st a kor\u00e1bbi chart verzi\u00f3j\u00e1nak er\u0151forr\u00e1sa \u00e9s a jelenlegi chart verzi\u00f3 k\u00f6z\u00f6tt,<\/li>\n<li> alkalmazza ezt a jav\u00edt\u00e1st.<\/li>\n<\/ul>\n<p>\nEzt a jav\u00edt\u00e1st nevezz\u00fck <b>2-way-merge patch-nek<\/b>, mert a l\u00e9trehoz\u00e1s\u00e1ban 2 manifeszt r\u00e9szt vesz:<\/p>\n<ul>\n<li> a kor\u00e1bbi kiad\u00e1s er\u0151forr\u00e1s\u00e1nak manifesztje,<\/li>\n<li> a jelenlegi er\u0151forr\u00e1s manifesztje.<\/li>\n<\/ul>\n<p>\nA t\u00f6rl\u00e9s sor\u00e1n a m\u0171velet <code>t\u00f6rl\u00e9s<\/code> a kube apiserverben a m\u00faltban bejelentett, de a jelenlegi kiad\u00e1sban nem bejelentett er\u0151forr\u00e1sok sz\u00e1m\u00e1ra t\u00f6rt\u00e9nik.<\/p>\n<p>A 2-way-merge patch megk\u00f6zel\u00edt\u00e9snek van egy probl\u00e9m\u00e1ja: ez ahhoz vezet, hogy <b>az er\u0151forr\u00e1s t\u00e9nyleges \u00e1llapota a klaszterben \u00e9s a manifeszt a Git-ben elt\u00e9r.<\/b>.<\/p>\n<h3>A probl\u00e9ma illusztr\u00e1l\u00e1sa p\u00e9ld\u00e1val<\/h3>\n<p><\/p>\n<ul>\n<li> A Git-ben a chartban tal\u00e1lhat\u00f3 manifesztben a k\u00f6vetkez\u0151 mez\u0151 <code>k\u00e9p<\/code> a Deployment-ben \u00e9rt\u00e9ket kap: <code>ubuntu:18.04<\/code>.<\/li>\n<li> A felhaszn\u00e1l\u00f3 a <code>kubectl edit<\/code> mez\u0151 \u00e9rt\u00e9k\u00e9t megv\u00e1ltoztatta <code>ubuntu:19.04-ra.<\/code>.<\/li>\n<li> A chart Helm \u00fajratelep\u00edt\u00e9sekor <i>nem gener\u00e1l jav\u00edt\u00e1st<\/i>, mert a mez\u0151 <code>k\u00e9p<\/code> a kiad\u00e1s kor\u00e1bbi verzi\u00f3j\u00e1ban \u00e9s a jelenlegi chartban azonos.<\/li>\n<li> Az \u00fajratelep\u00edt\u00e9s ut\u00e1n <code>k\u00e9p<\/code> marad <code>ubuntu:19.04-ra.<\/code>, b\u00e1r a chartban az szerepel, hogy <code>ubuntu:18.04<\/code>.<\/li>\n<\/ul>\n<p>\nEl\u00e9rt\u00fck az elt\u00e9r\u00e9st \u00e9s elvesztett\u00fck a deklarativit\u00e1st.<\/p>\n<h3>Mi az a szinkroniz\u00e1lt er\u0151forr\u00e1s?<\/h3>\n<p>\n\u00c1ltal\u00e1noss\u00e1gban elmondhat\u00f3, <i>a teljes<\/i> k\u00e9pviselete a m\u0171k\u00f6d\u0151 klaszterben tal\u00e1lhat\u00f3 er\u0151forr\u00e1s manifesztj\u00e9nek \u00e9s a Git-b\u0151l sz\u00e1rmaz\u00f3 manifesztnek nem lehets\u00e9ges. Mert a val\u00f3di manifesztben lehetnek szolg\u00e1ltat\u00f3i annot\u00e1ci\u00f3k\/c\u00edmk\u00e9k, tov\u00e1bbi kont\u00e9nerek \u00e9s m\u00e1s adatok, amelyeket a vez\u00e9rl\u0151k dinamikusan adnak hozz\u00e1 vagy t\u00e1vol\u00edtanak el az er\u0151forr\u00e1st\u00f3l. Ezeket az adatokat nem tudjuk \u00e9s nem is akarjuk a Git-ben tartani. Azonban azt akarjuk, hogy a kiad\u00e1s sor\u00e1n azok a mez\u0151k, amelyeket egy\u00e9rtelm\u0171en megadtunk a Git-ben, a megfelel\u0151 \u00e9rt\u00e9keket vegy\u00e9k fel.<\/p>\n<p>Teh\u00e1t van egy \u00e1ltal\u00e1nos <b>szab\u00e1ly a szinkroniz\u00e1lt er\u0151forr\u00e1sra vonatkoz\u00f3an<\/b>: az er\u0151forr\u00e1s kiad\u00e1sa sor\u00e1n csak azokat a mez\u0151ket lehet m\u00f3dos\u00edtani vagy t\u00f6r\u00f6lni, amelyeket kifejezetten a Git-b\u0151l sz\u00e1rmaz\u00f3 manifesztben \u00edrtak el\u0151 (vagy amelyeket az el\u0151z\u0151 verzi\u00f3ban \u00edrtak, de most t\u00f6r\u00f6ltek).<\/p>\n<h3>3-way-merge patch<\/h3>\n<p>\nA f\u0151 \u00f6tlet <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Merge_(version_control)#Three-way_merge\">3-way-merge patch<\/a><\/noindex>: jav\u00edt\u00e1st gener\u00e1lunk a Git-ben alkalmazott legutols\u00f3 verzi\u00f3 \u00e9s a c\u00e9lzott verzi\u00f3 k\u00f6z\u00f6tt, figyelembe v\u00e9ve a jelenlegi verzi\u00f3t a m\u0171k\u00f6d\u0151 klaszterben. Az v\u00e9gs\u0151 jav\u00edt\u00e1snak meg kell felelnie a szinkroniz\u00e1lt er\u0151forr\u00e1s szab\u00e1ly\u00e1nak:<\/p>\n<ul>\n<li> az \u00faj mez\u0151k, amelyek a c\u00e9lzott verzi\u00f3ba ker\u00fcltek, jav\u00edt\u00e1son kereszt\u00fcl ker\u00fclnek hozz\u00e1ad\u00e1sra;<\/li>\n<li> A kor\u00e1bbi, az utolj\u00e1ra alkalmazott verzi\u00f3ban l\u00e9v\u0151, \u00e9s a c\u00e9lzott verzi\u00f3ban nem l\u00e9tez\u0151 mez\u0151k null\u00e1z\u00f3dnak a patch seg\u00edts\u00e9g\u00e9vel;<\/li>\n<li> A c\u00e9lzott verzi\u00f3t\u00f3l elt\u00e9r\u0151 mez\u0151k a jelenlegi objektum verzi\u00f3j\u00e1ban patch seg\u00edts\u00e9g\u00e9vel friss\u00fclnek.<\/li>\n<\/ul>\n<p>\n\u00c9ppen ilyen elv szerint gener\u00e1l patch-eket <code>kubectl apply<\/code>:<\/p>\n<ul>\n<li> Az utols\u00f3 alkalmazott verzi\u00f3 megmarad az objektum saj\u00e1t annot\u00e1ci\u00f3j\u00e1ban, <\/li>\n<li> a c\u00e9lzott verzi\u00f3t pedig a megadott YAML-f\u00e1jlb\u00f3l vessz\u00fck,<\/li>\n<li> a jelenlegi verzi\u00f3 pedig a m\u0171k\u00f6d\u0151 klaszterb\u0151l sz\u00e1rmazik.<\/li>\n<\/ul>\n<p>\nMost, hogy megtanultuk az elm\u00e9letet, ideje elmondani, mit is tett\u00fcnk a werf-ben.<\/p>\n<h2>V\u00e1ltoztat\u00e1sok alkalmaz\u00e1sa a werf-ben<\/h2>\n<p>\nKor\u00e1bban a werf, ak\u00e1rcsak a Helm 2, 2-way-merge patch-eket haszn\u00e1lt.<\/p>\n<h3>Repair patch<\/h3>\n<p>\nAhhoz, hogy \u00e1tt\u00e9rj\u00fcnk az \u00faj patch t\u00edpusra \u2014 3-way-merge \u2014, els\u0151 l\u00e9p\u00e9sk\u00e9nt bevezett\u00fck az \u00fagynevezett <b>repair patch-eket<\/b>.<\/p>\n<p>A telep\u00edt\u00e9s sor\u00e1n a standard 2-way-merge patch-et haszn\u00e1ljuk, de a werf tov\u00e1bbi patch-et gener\u00e1l, amely szinkroniz\u00e1lja a t\u00e9nyleges er\u0151forr\u00e1s \u00e1llapot\u00e1t azzal, ami a Git-ben tal\u00e1lhat\u00f3 (ez a patch ugyanazzal a szinkroniz\u00e1lt er\u0151forr\u00e1s szab\u00e1llyal k\u00e9sz\u00fcl, amelyet fentebb \u00edrtunk le).<\/p>\n<p>Ha szinkroniz\u00e1l\u00e1si probl\u00e9ma mer\u00fcl fel, a telep\u00edt\u00e9s v\u00e9g\u00e9n a felhaszn\u00e1l\u00f3 WARNING \u00fczenetet kap a megfelel\u0151 \u00fczenettel \u00e9s patch-el, amelyet alkalmazni kell az er\u0151forr\u00e1s szinkroniz\u00e1lt \u00e1llapotba hozatal\u00e1hoz. Ezt a patch-et egy speci\u00e1lis annot\u00e1ci\u00f3ba is r\u00f6gz\u00edtj\u00fck <code>werf.io\/repair-patch<\/code>. Azt felt\u00e9telezz\u00fck, hogy a felhaszn\u00e1l\u00f3 manu\u00e1lisan <b>maga<\/b> alkalmazza ezt a patch-et: a werf ezt elvileg nem fogja automatikusan elv\u00e9gezni.<\/p>\n<p>A repair patch-ek gener\u00e1l\u00e1sa \u00e1tmeneti int\u00e9zked\u00e9s, amely lehet\u0151v\u00e9 teszi a 3-way-merge elv\u00e9n alapul\u00f3 patch-ek l\u00e9trehoz\u00e1s\u00e1nak tesztel\u00e9s\u00e9t, de ezeket automatikusan nem alkalmazzuk. Jelenleg ez a m\u0171k\u00f6d\u00e9si m\u00f3d alap\u00e9rtelmez\u00e9s szerint be van kapcsolva.<\/p>\n<h3>3-way-merge patch csak \u00faj kiad\u00e1sokhoz<\/h3>\n<p>\n2019. december 1-j\u00e9t\u0151l a werf beta- \u00e9s alpha-verzi\u00f3i elkezdik <b>alap\u00e9rtelmezett<\/b> teljes \u00e9rt\u00e9k\u0171 3-way-merge patch-eket haszn\u00e1lni a v\u00e1ltoztat\u00e1sok alkalmaz\u00e1s\u00e1ra, de csak az \u00faj Helm kiad\u00e1sokhoz, amelyeket a werf-en kereszt\u00fcl hoznak l\u00e9tre. A m\u00e1r l\u00e9tez\u0151 kiad\u00e1sok tov\u00e1bbra is a 2-way-merge + repair patch megk\u00f6zel\u00edt\u00e9st fogj\u00e1k haszn\u00e1lni.<\/p>\n<p>Ezt a m\u0171k\u00f6d\u00e9si m\u00f3dot kifejezetten be lehet kapcsolni a <code>WERF_THREE_WAY_MERGE_MODE=onlyNewReleases<\/code> be\u00e1ll\u00edt\u00e1ssal,<\/p>\n<p><i><b>Megjegyz\u00e9s<\/b>: ez a funkci\u00f3 a werf-ban t\u00f6bb kiad\u00e1s sor\u00e1n jelent meg: az alpha csatorn\u00e1n az <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\/releases\/tag\/v1.0.5-alpha.19\">v1.0.5-alpha.19<\/a><\/noindex>verzi\u00f3t\u00f3l kezdve k\u00e9sz\u00fclt el, m\u00edg a beta csatorn\u00e1n \u2014 a <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\/releases\/tag\/v1.0.4-beta.20\">v1.0.4-beta.20<\/a><\/noindex>.<\/i><\/p>\n<h3>3-way-merge patch minden kiad\u00e1s sz\u00e1m\u00e1ra<\/h3>\n<p>\n2019. december 15-t\u0151l a werf beta \u00e9s alpha verzi\u00f3i alap\u00e9rtelmez\u00e9s szerint teljes \u00e9rt\u00e9k\u0171 3-way-merge jav\u00edt\u00e1sokat kezdenek alkalmazni a v\u00e1ltoztat\u00e1sok \u00e9rv\u00e9nyes\u00edt\u00e9s\u00e9re minden kiad\u00e1sn\u00e1l.<\/p>\n<p>Ezt a m\u0171k\u00f6d\u00e9si m\u00f3dot kifejezetten be lehet kapcsolni a <code>WERF_THREE_WAY_MERGE_MODE=enabled<\/code> be\u00e1ll\u00edt\u00e1ssal,<\/p>\n<h3>Hogyan kezelj\u00fck az er\u0151forr\u00e1sok automatikus sk\u00e1l\u00e1z\u00e1s\u00e1t?<\/h3>\n<p>\nA Kubernetesben k\u00e9tf\u00e9le automatikus sk\u00e1l\u00e1z\u00e1s l\u00e9tezik: HPA (horizont\u00e1lis) \u00e9s VPA (f\u00fcgg\u0151leges).<\/p>\n<p>A horizont\u00e1lis automatikusan meghat\u00e1rozza a p\u00e9ld\u00e1nyok sz\u00e1m\u00e1t, m\u00edg a f\u00fcgg\u0151leges az er\u0151forr\u00e1sok mennyis\u00e9g\u00e9t. Mind a p\u00e9ld\u00e1nyok sz\u00e1m\u00e1t, mind az er\u0151forr\u00e1sok k\u00f6vetelm\u00e9nyeit a forr\u00e1sm\u00e1nifestumban kell megadni (l\u00e1sd. <code>spec.replicas<\/code> vagy <code>spec.containers[].resources.limits.cpu<\/code>, <code>spec.containers[].resources.limits.memory<\/code> \u00e9s <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/configuration\/manage-compute-resources-container\/#resource-requests-and-limits-of-pod-and-container\">egy\u00e9b<\/a><\/noindex>).<\/p>\n<p>Probl\u00e9ma: ha a felhaszn\u00e1l\u00f3 \u00fagy konfigur\u00e1l egy er\u0151forr\u00e1st a chartban, hogy az er\u0151forr\u00e1sokra vagy p\u00e9ld\u00e1nyokra vonatkoz\u00f3 konkr\u00e9t \u00e9rt\u00e9kek szerepelnek, \u00e9s az adott er\u0151forr\u00e1shoz automatikus sk\u00e1l\u00e1z\u00f3k vannak enged\u00e9lyezve, akkor a werf minden telep\u00edt\u00e9skor vissza\u00e1ll\u00edtja ezeket az \u00e9rt\u00e9keket arra, ami a chart \u00e1rumanifesztj\u00e9ben szerepel.<\/p>\n<p>A probl\u00e9m\u00e1nak k\u00e9t megold\u00e1sa van. El\u0151sz\u00f6r is a legjobb, ha elker\u00fclj\u00fck az automatikusan sk\u00e1l\u00e1zhat\u00f3 \u00e9rt\u00e9kek kifejezett megad\u00e1s\u00e1t a chart \u00e1rumanifesztj\u00e9ben. Ha azonban ez valamilyen okb\u00f3l nem megoldhat\u00f3 (p\u00e9ld\u00e1ul, mert a chartban k\u00e9nyelmes megadni a kezdeti er\u0151forr\u00e1skorl\u00e1tokat \u00e9s a p\u00e9ld\u00e1nyok sz\u00e1m\u00e1t), akkor a werf a k\u00f6vetkez\u0151 annot\u00e1ci\u00f3kat javasolja:<\/p>\n<ul>\n<li> <code>werf.io\/set-replicas-only-on-creation=true<\/code><\/li>\n<li> <code>werf.io\/set-resources-only-on-creation=true<\/code><\/li>\n<\/ul>\n<p>\nHa van ilyen annot\u00e1ci\u00f3, a werf nem \u00e1ll\u00edtja vissza a megfelel\u0151 \u00e9rt\u00e9keket minden telep\u00edt\u00e9skor, hanem csak az er\u0151forr\u00e1s els\u0151 l\u00e9trehoz\u00e1sakor \u00e1ll\u00edtja be \u0151ket.<\/p>\n<p>Tov\u00e1bbi r\u00e9szletek\u00e9rt l\u00e1sd a projekt dokument\u00e1ci\u00f3j\u00e1ban a <noindex><a rel=\"nofollow\" href=\"https:\/\/werf.io\/documentation\/reference\/deploy_process\/resources_update_methods_and_adoption.html#deal-with-hpa\">HPA<\/a><\/noindex> \u00e9s <noindex><a rel=\"nofollow\" href=\"https:\/\/werf.io\/documentation\/reference\/deploy_process\/resources_update_methods_and_adoption.html#deal-with-vpa\">VPA<\/a><\/noindex>.<\/p>\n<h3>A 3-way-merge patch haszn\u00e1lat\u00e1nak tilt\u00e1sa<\/h3>\n<p>\nA felhaszn\u00e1l\u00f3 egyel\u0151re megtilthatja az \u00faj jav\u00edt\u00e1sok haszn\u00e1lat\u00e1t a werf-n\u00e9l a k\u00f6rnyezeti v\u00e1ltoz\u00f3 seg\u00edts\u00e9g\u00e9vel <code>WERF_THREE_WAY_MERGE_MODE=disabled<\/code>. Azonban 2020. m\u00e1rcius 1-j\u00e9t\u0151l ez a tilalom megsz\u0171nik <b>\u00e9s csak a 3-way-merge jav\u00edt\u00e1sok haszn\u00e1lata lesz lehets\u00e9ges.<\/b> A werf er\u0151forr\u00e1sainak \u00e1tv\u00e9tele<\/p>\n<h2>A 3-way-merge jav\u00edt\u00e1sokkal t\u00f6rt\u00e9n\u0151 v\u00e1ltoz\u00e1salkalmaz\u00e1s m\u00f3dszer\u00e9nek elsaj\u00e1t\u00edt\u00e1sa lehet\u0151v\u00e9 tette sz\u00e1munkra egy olyan funkci\u00f3 azonnali bevezet\u00e9s\u00e9t, mint a megl\u00e9v\u0151 er\u0151forr\u00e1sok \u00e1tv\u00e9tele a klaszterben a Helm-kiad\u00e1sban.<\/h2>\n<p>\nA Helm 2-nek van egy probl\u00e9m\u00e1ja: nem lehet olyan er\u0151forr\u00e1st hozz\u00e1adni a chart manifesztumaihoz, amely m\u00e1r l\u00e9tezik a klaszterben, an\u00e9lk\u00fcl, hogy azt null\u00e1r\u00f3l \u00fajra l\u00e9trehozn\u00e1nk (l\u00e1sd.<\/p>\n<p>). A werf-et megtan\u00edtottuk arra, hogy fogadja el a megl\u00e9v\u0151 er\u0151forr\u00e1sokat a kiad\u00e1sban. Ehhez az aktu\u00e1lis er\u0151forr\u00e1s verzi\u00f3j\u00e1ra a m\u0171k\u00f6d\u0151 klaszterb\u0151l annot\u00e1ci\u00f3t kell be\u00e1ll\u00edtani (p\u00e9ld\u00e1ul a k\u00f6vetkez\u0151 seg\u00edts\u00e9g\u00e9vel: <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/helm\/helm\/issues\/6031#issuecomment-531579500\">#6031<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/helm\/helm\/issues\/3275\">#3275<\/a><\/noindex>\"werf.io\/allow-adoption-by-release\": RELEASE_NAME <code>kubectl edit<\/code>):<\/p>\n<pre><code class=\"plaintext\">\"werf.io\/allow-adoption-by-release\": RELEASE_NAME<\/code><\/pre>\n<p>\nMost m\u00e1r a forr\u00e1st le kell \u00edrni a chartban, \u00e9s a k\u00f6vetkez\u0151 telep\u00edt\u00e9s sor\u00e1n a werf \u00e1ltal az adott n\u00e9ven megjel\u00f6lt kiad\u00e1sban a megl\u00e9v\u0151 forr\u00e1s be fog ker\u00fclni, \u00e9s a kiad\u00e1s ir\u00e1ny\u00edt\u00e1sa alatt marad. R\u00e1ad\u00e1sul a forr\u00e1s kiad\u00e1si folyamat\u00e1ban a werf a m\u0171k\u00f6d\u0151 klaszter aktu\u00e1lis \u00e1llapot\u00e1t a chartban le\u00edrt \u00e1llapotra \u00e1ll\u00edtja, a 3-way-merge jav\u00edt\u00e1sok \u00e9s a szinkroniz\u00e1lt forr\u00e1s szab\u00e1lya seg\u00edts\u00e9g\u00e9vel.<\/p>\n<p><i><b>Megjegyz\u00e9s<\/b>: be\u00e1ll\u00edt\u00e1s <code>WERF_THREE_WAY_MERGE_MODE<\/code> nincs hat\u00e1ssal a forr\u00e1sok elfogad\u00e1s\u00e1ra \u2014 az elfogad\u00e1s sor\u00e1n mindig 3-way-merge jav\u00edt\u00e1st haszn\u00e1lnak.<\/i><\/p>\n<p>Tov\u00e1bbi r\u00e9szletek itt tal\u00e1lhat\u00f3k <noindex><a rel=\"nofollow\" href=\"https:\/\/werf.io\/documentation\/reference\/deploy_process\/resources_update_methods_and_adoption.html#resources-adoption\">dokument\u00e1ci\u00f3<\/a><\/noindex>.<\/p>\n<h2>K\u00f6vetkeztet\u00e9sek \u00e9s tov\u00e1bbi tervek<\/h2>\n<p>\nRem\u00e9lem, hogy ez a cikk vil\u00e1gosabb\u00e1 tette, mi az a 3-way-merge jav\u00edt\u00e1s, \u00e9s mi\u00e9rt hozt\u00e1k l\u00e9tre. A werf projekt fejleszt\u00e9s\u00e9nek szempontj\u00e1b\u00f3l a megval\u00f3s\u00edt\u00e1suk egy \u00fajabb l\u00e9p\u00e9s a Helm-szer\u0171 telep\u00edt\u00e9sek fejleszt\u00e9s\u00e9ben. Mostant\u00f3l elfelejthetj\u00fck a konfigur\u00e1ci\u00f3k szinkroniz\u00e1l\u00e1s\u00e1val kapcsolatos probl\u00e9m\u00e1kat, amelyek gyakran felmer\u00fcltek a Helm 2 haszn\u00e1lata sor\u00e1n. Ezen k\u00edv\u00fcl hozz\u00e1ad\u00f3dott egy \u00faj hasznos funkci\u00f3 az elfogadott Kubernetes forr\u00e1sok Helm kiad\u00e1sba val\u00f3 be\u00e9p\u00edt\u00e9s\u00e9re.<\/p>\n<p>A Helm-szer\u0171 telep\u00edt\u00e9sekben m\u00e9g mindig vannak bizonyos probl\u00e9m\u00e1k \u00e9s neh\u00e9zs\u00e9gek, p\u00e9ld\u00e1ul a Go sablonok haszn\u00e1lata, \u00e9s ezeket tov\u00e1bbra is meg fogjuk oldani.<\/p>\n<p>Az er\u0151forr\u00e1sok friss\u00edt\u00e9si m\u00f3dszereir\u0151l \u00e9s az elfogad\u00e1sr\u00f3l itt is tal\u00e1lhat\u00f3 inform\u00e1ci\u00f3: <noindex><a rel=\"nofollow\" href=\"https:\/\/werf.io\/documentation\/reference\/deploy_process\/resources_update_methods_and_adoption.html\">ezeken a dokument\u00e1ci\u00f3s oldalakon<\/a><\/noindex>.<\/p>\n<h3>Helm 3<\/h3>\n<p>\nK\u00fcl\u00f6n figyelmet \u00e9rdemel <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/news\/t\/475722\/\">nemr\u00e9giben megjelent<\/a><\/noindex> \u00faj f\u0151verzi\u00f3ja a Helmnek \u2014 v3, \u2014 amely szint\u00e9n 3-way-merge jav\u00edt\u00e1sokat haszn\u00e1l \u00e9s megszabadul a Tillert\u0151l. Az \u00faj Helm verzi\u00f3 <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/topics\/v2_v3_migration\/\">migr\u00e1ci\u00f3t<\/a><\/noindex> ig\u00e9nyel a m\u00e1r megl\u00e9v\u0151 telep\u00edt\u00e9sek eset\u00e9ben, hogy \u00e1tkonvert\u00e1lja \u0151ket az \u00faj kiad\u00e1si t\u00e1rol\u00e1si form\u00e1tumra.<\/p>\n<p>A werf a saj\u00e1t r\u00e9sz\u00e9r\u0151l m\u00e1r elt\u00e1vol\u00edtotta a Tiller haszn\u00e1lat\u00e1t, \u00e1t\u00e1llt a 3-way-merge-re \u00e9s hozz\u00e1jutott <noindex><a rel=\"nofollow\" href=\"https:\/\/werf.io\/documentation\/reference\/deploy_process\/differences_with_helm.html\">sok egy\u00e9b<\/a><\/noindex>, mik\u00f6zben tov\u00e1bbra is kompatibilis a m\u00e1r l\u00e9tez\u0151 Helm 2 telep\u00edt\u00e9sekkel (nincs sz\u00fcks\u00e9g migr\u00e1l\u00f3 szkriptek futtat\u00e1s\u00e1ra). Ez\u00e9rt, am\u00edg a werf nem \u00e1ll \u00e1t a Helm 3-ra, a werf felhaszn\u00e1l\u00f3i nem vesz\u00edtenek a Helm 3 f\u0151 el\u0151nyeib\u0151l a Helm 2-h\u00f6z k\u00e9pest (ezek a werfben is el\u00e9rhet\u0151k).<\/p>\n<p>Mindazon\u00e1ltal a werf \u00e1t\u00e1ll\u00e1sa a Helm 3 k\u00f3dalapj\u00e1ra elker\u00fclhetetlen, \u00e9s a k\u00f6zelj\u00f6v\u0151ben bek\u00f6vetkezik. Val\u00f3sz\u00edn\u0171leg a werf 1.1 vagy werf 1.2 verzi\u00f3ban fog megt\u00f6rt\u00e9nni (jelenleg a werf f\u0151verzi\u00f3ja 1.0; a werf verzi\u00f3kezel\u00e9s\u00e9r\u0151l b\u0151vebben ld. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf#backward-compatibility-promise\">itt<\/a><\/noindex>). Egy\u00e9bk\u00e9nt a Helm 3 id\u0151k\u00f6zben stabiliz\u00e1l\u00f3dni fog.<\/p>\n<h2>P.S.<\/h2>\n<p>\nOlvasson tov\u00e1bbi inform\u00e1ci\u00f3kat a blogunkban:<\/p>\n<ul>\n<li> A werf \u00fajdons\u00e1gair\u00f3l sz\u00f3l\u00f3 jegyzetek ciklusa:\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/468049\/\">A werf haszn\u00e1lata komplex Helm diagramok kiad\u00e1sa sor\u00e1n<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/465131\/\">Monorepo \u00e9s multirepo t\u00e1mogat\u00e1s a werf-ben, \u00e9s mi k\u00f6ze a Docker Registryhez<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/463613\/\">Most Docker images in werf can now be built using a regular Dockerfile<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460351\/\">werf \u2014 az eszk\u00f6z\u00fcnk CI\/CD-hez Kubernetes-ben (\u00e1ttekint\u00e9s \u00e9s a besz\u00e1mol\u00f3 vide\u00f3ja)<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/469541\/\">Az egys\u00e9ges mikroszolg\u00e1ltat\u00e1sok fel\u00e9p\u00edt\u00e9se \u00e9s telep\u00edt\u00e9se werf \u00e9s GitLab CI seg\u00edts\u00e9g\u00e9vel<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/453734\/\">Ismerked\u00e9s a Helm 3-mal<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>Forr\u00e1s: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/476646\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0421\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0442\u043e, \u0447\u0435\u0433\u043e \u043c\u044b (\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u044b) \u0434\u043e\u043b\u0433\u043e \u0436\u0434\u0430\u043b\u0438: werf, \u043d\u0430\u0448\u0430 Open Source-\u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 \u0438\u0445 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0432 Kubernetes, \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e 3-way-merge-\u043f\u0430\u0442\u0447\u0435\u0439! \u0412 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a \u044d\u0442\u043e\u043c\u0443, \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c adoption\u2019\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 K8s-\u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0432 Helm-\u0440\u0435\u043b\u0438\u0437\u044b \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u0415\u0441\u043b\u0438 \u0441\u043e\u0432\u0441\u0435\u043c \u043a\u043e\u0440\u043e\u0442\u043a\u043e, \u0442\u043e \u0441\u0442\u0430\u0432\u0438\u043c WERF_THREE_WAY_MERGE=enabled \u2014 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0435\u043f\u043b\u043e\u0439 \u00ab\u043a\u0430\u043a \u0432 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":53121,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-53120","post","type-post","status-publish","format-standard","has-post-thumbnail","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=\"\u0421\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0442\u043e, \u0447\u0435\u0433\u043e \u043c\u044b (\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u044b) \u0434\u043e\u043b\u0433\u043e \u0436\u0434\u0430\u043b\u0438: werf, \u043d\u0430\u0448\u0430 Open Source-\u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 \u0438\u0445 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0432 Kubernetes, \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442.\" \/>\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\/hu\/blog\/administrirovanie\/3-way-merge-v-werf-deploj-v-kubernetes-s-helm-na-steroidah\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"hu_HU\" \/>\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\udd473-way merge \u0432 werf: \u0434\u0435\u043f\u043b\u043e\u0439 \u0432 Kubernetes \u0441 Helm \u00ab\u043d\u0430 \u0441\u0442\u0435\u0440\u043e\u0438\u0434\u0430\u0445\u00bb | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0421\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0442\u043e, \u0447\u0435\u0433\u043e \u043c\u044b (\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u044b) \u0434\u043e\u043b\u0433\u043e \u0436\u0434\u0430\u043b\u0438: werf, \u043d\u0430\u0448\u0430 Open Source-\u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 \u0438\u0445 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0432 Kubernetes, \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/3-way-merge-v-werf-deploj-v-kubernetes-s-helm-na-steroidah\" \/>\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-11-23T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:00:59+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\udd473-way merge a werfben: telep\u00edt\u00e9s Kubernetesbe Helm \"szteroidokon\" | ProHoster","description":"Megval\u00f3sult az, amire mi (\u00e9s nem csak mi) hossz\u00fa ideje v\u00e1runk: a werf, az Open Source alkalmaz\u00e1s\u00e9p\u00edt\u0151 \u00e9s Kubernetes-be\u00e1ll\u00edt\u00f3 eszk\u00f6z\u00fcnk mostant\u00f3l t\u00e1mogat\u00e1st ny\u00fajt.","canonical_url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/3-way-merge-v-werf-deploj-v-kubernetes-s-helm-na-steroidah","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hu_HU","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\udd473-way merge \u0432 werf: \u0434\u0435\u043f\u043b\u043e\u0439 \u0432 Kubernetes \u0441 Helm \u00ab\u043d\u0430 \u0441\u0442\u0435\u0440\u043e\u0438\u0434\u0430\u0445\u00bb | ProHoster","og:description":"\u0421\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0442\u043e, \u0447\u0435\u0433\u043e \u043c\u044b (\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u044b) \u0434\u043e\u043b\u0433\u043e \u0436\u0434\u0430\u043b\u0438: werf, \u043d\u0430\u0448\u0430 Open Source-\u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 \u0438\u0445 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0432 Kubernetes, \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442.","og:url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/3-way-merge-v-werf-deploj-v-kubernetes-s-helm-na-steroidah","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-11-23T21:00:00+00:00","article:modified_time":"2020-02-18T11:00:59+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"53120","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-24 06:11:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:31:28","updated":"2026-01-24 06:11:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/53120","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/comments?post=53120"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/53120\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media\/53121"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=53120"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=53120"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=53120"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}