{"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\/az\/blog\/administrirovanie\/3-way-merge-v-werf-deploj-v-kubernetes-s-helm-na-steroidah","title":{"rendered":"3-way merge in werf: Kubernetes \u00fc\u00e7\u00fcn Helm il\u0259 \"steroidl\u0259rd\u0259\" yerl\u0259\u015fdirm\u0259","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>N\u0259hay\u0259t, \u00e7ox g\u00f6zl\u0259diyimiz bir \u015fey ba\u015f verdi: <noindex><a rel=\"nofollow\" href=\"https:\/\/werf.io\/\">werf<\/a><\/noindex>, a\u00e7\u0131q m\u0259nb\u0259 kodlu t\u0259tbiq qurma v\u0259 Kubernetes-d\u0259 \u00e7atd\u0131rma \u00fc\u00e7\u00fcn proqram\u0131m\u0131z indi 3-way-merge-patch-larla d\u0259yi\u015fikl\u0259rin t\u0259tbiqini d\u0259st\u0259kl\u0259yir! Bununla yana\u015f\u0131, m\u00f6vcud K8s resurslar\u0131n\u0131 Helm burax\u0131l\u0131\u015flar\u0131na q\u0259bul etm\u0259k imkan\u0131 da var, bu resurslar\u0131n yenid\u0259n yarad\u0131lmas\u0131 olmadan.<\/p>\n<p><img decoding=\"async\" alt=\"3-way merge in werf: Kubernetes \u00fc\u00e7\u00fcn Helm il\u0259 &quot;steroidl\u0259rd\u0259&quot; yerl\u0259\u015fdirm\u0259\" src=\"\/wp-content\/uploads\/2019\/11\/e5be3544c201f7b2c97fba216a49506d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nQ\u0131sa des\u0259k, <code>WERF_THREE_WAY_MERGE=enabled<\/code> qoyuruq \u2014 \" <code>kubectl apply<\/code>kimi\", Helm 2-y\u0259 uy\u011fun m\u00f6vcud qura\u015fd\u0131rmalara uy\u011fun bir \"deploy\" \u0259ld\u0259 edirik, h\u0259tta bir az daha \u00e7ox.<\/p>\n<p>Amma g\u0259lin n\u0259z\u0259riyy\u0259d\u0259n ba\u015flayaq: 3-way-merge-patch-lar n\u0259dir, insanlar onlar\u0131n yarad\u0131lmas\u0131na nec\u0259 g\u0259libl\u0259r v\u0259 niy\u0259 bunlar Kubernetes-in CI\/CD prosesl\u0259rind\u0259 vacibdir? Sonra da jam-lar n\u0259dir, ad\u0259t\u0259n hans\u0131 rejiml\u0259rin istifad\u0259 edildiyini v\u0259 bunun nec\u0259 idar\u0259 olunaca\u011f\u0131n\u0131 n\u0259z\u0259rd\u0259n ke\u00e7ir\u0259c\u0259yik.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>3-way-merge-patch n\u0259dir?<\/h2>\n<p>\nBel\u0259likl\u0259, YAML manifestl\u0259rind\u0259 t\u0259svir olunan resurslar\u0131 Kubernetes-d\u0259 yaymaq m\u0259s\u0259l\u0259sin\u0259 ba\u015flay\u0131r\u0131q.<\/p>\n<p>Kubernetes API il\u0259 i\u015fl\u0259m\u0259k \u00fc\u00e7\u00fcn \u0259sas \u0259m\u0259liyyatlar: create, patch, replace v\u0259 delete. Onlar\u0131n k\u00f6m\u0259yi il\u0259 klasterd\u0259 rahat davaml\u0131 resurs yay\u0131m\u0131n\u0131 nec\u0259 qurmaq olar?<\/p>\n<h3>\u0130mperativ kubectl \u0259mr\u0259l\u0259ri<\/h3>\n<p>\nKubernetes-d\u0259 obyektl\u0259ri idar\u0259 etm\u0259yin birinci yana\u015fmas\u0131 \u2014 bu obyektl\u0259rin yarad\u0131lmas\u0131, d\u0259yi\u015fdirilm\u0259si v\u0259 silinm\u0259si \u00fc\u00e7\u00fcn imperativ kubectl \u0259mr\u0259l\u0259rind\u0259n istifad\u0259 etm\u0259kdir. Ba\u015fqa dild\u0259 des\u0259k:<\/p>\n<ul>\n<li> \u0259mri il\u0259 <code>kubectl run<\/code> Deployment v\u0259 ya Job ba\u015flada bil\u0259r:\n<pre><code class=\"bash\">kubectl run --generator=deployment\/apps.v1 DEPLOYMENT_NAME --image=IMAGE<\/code><\/pre>\n<\/li>\n<li> \u0259mri il\u0259 <code>kubectl scale<\/code> replika say\u0131n\u0131 d\u0259yi\u015fdirir:\n<pre><code class=\"bash\">kubectl scale --replicas=3 deployment\/mysql<\/code><\/pre>\n<\/li>\n<li>v\u0259 s.<\/li>\n<\/ul>\n<p>\nBu yana\u015fma ilk bax\u0131\u015fda rahat g\u00f6r\u00fcn\u0259 bil\u0259r. Ancaq probleml\u0259ri vard\u0131r: <\/p>\n<ol>\n<li> Onu <b>avtomatla\u015fd\u0131rmaq \u00e7\u0259tindir<\/b>.<\/li>\n<li> Nec\u0259 <b>konfiqurasiyan\u0131<\/b> Git-d\u0259 \u0259ks etdirm\u0259k? Klasterd\u0259 ba\u015f ver\u0259n d\u0259yi\u015fikl\u0259ri nec\u0259 n\u0259z\u0259rd\u0259n ke\u00e7irm\u0259k olar?<\/li>\n<li> Konfiqurasiyan\u0131n <b>t\u0259krarlanmas\u0131n\u0131<\/b> yenid\u0259n ba\u015flatmalarda nec\u0259 t\u0259min ed\u0259k?<\/li>\n<li>\u2026<\/li>\n<\/ol>\n<p>\nBu yana\u015fman\u0131n kodla birl\u0259\u015fdirm\u0259k v\u0259 infrastruktur kodu (IaC; v\u0259 ya daha m\u00fcasir bir variant kimi, Kubernetes ekosistemind\u0259 populyarl\u0131q qazanan) il\u0259 pis \u0259laq\u0259l\u0259rl\u0259 oldu\u011fu a\u00e7\u0131qd\u0131r. Buna g\u00f6r\u0259 d\u0259, bu \u0259mrlar\u0131n kubectl-d\u0259 daha da inki\u015faf\u0131 olmadi. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/458878\/\">GitOps<\/a><\/noindex> Create, get, replace v\u0259 delete \u0259m\u0259liyyatlar\u0131<\/p>\n<h3>\u0130lkin<\/h3>\n<p>\nyaratmada <b>h\u0259r \u015fey sad\u0259dir: manifesti kube API-ya g\u00f6nd\u0259r\u0259r\u0259k resursu yarad\u0131r\u0131q. Manifestin YAML t\u0259rtibi Git-d\u0259 saxlan\u0131la bil\u0259r, yarad\u0131lmaq \u00fc\u00e7\u00fcn is\u0259<\/b> kubectl create -f manifest.yaml <code>B\u00f6y\u00fck disk obraz\u0131n\u0131 yaradan bu \u0259mr 40 GB \u00f6l\u00e7\u00fcs\u00fcnd\u0259 test \u015f\u0259kilini yaradacaq. \u0130ndi bu, h\u0259r hans\u0131 bir virtual ma\u015f\u0131nla qo\u015fulma\u011fa uy\u011fundur.<\/code> silinm\u0259si <code>d\u0259 sad\u0259dir: eyni<\/code>.<\/p>\n<p>olarq <b>manifest.yaml<\/b> Git-d\u0259n g\u00f6t\u00fcr\u0259r\u0259k <code>kubectl delete -f manifest.yaml<\/code> replace <code>resursun konfiqurasiyas\u0131n\u0131 tamamil\u0259 yeni il\u0259 \u0259v\u0259z etm\u0259y\u0259 imkan verir, resursu yenid\u0259n yaratmadan. Bu, resursda d\u0259yi\u015fiklik etm\u0259d\u0259n \u0259vv\u0259l cari versiyan\u0131 soru\u015fma\u011f\u0131n, onu d\u0259yi\u015fdir\u0259r\u0259k v\u0259 sonra yenil\u0259m\u0259k \u00fc\u00e7\u00fcn<\/code>.<\/p>\n<p>Operasyon <b><code>bizim \u00fc\u00e7\u00fcn m\u0259ntiqli oldu\u011funu g\u00f6st\u0259rir.<\/code><\/b> kube apiserver-d\u0259 <code>get<\/code>optimistic locking <code>bizim \u00fc\u00e7\u00fcn m\u0259ntiqli oldu\u011funu g\u00f6st\u0259rir.<\/code>var v\u0259, \u0259g\u0259r \u0259mrd\u0259n sonra obyekt d\u0259yi\u015f\u0259rs\u0259, \u0259m\u0259liyyat <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Optimistic_concurrency_control\">ba\u015f tutmayacaq.<\/a><\/noindex> Konfiqurasiyan\u0131 Git-d\u0259 saxlamaq v\u0259 replace il\u0259 yenil\u0259m\u0259k \u00fc\u00e7\u00fcn \u0259m\u0259liyyat\u0131 yerin\u0259 yetirm\u0259k laz\u0131md\u0131r. <code>get<\/code> obyekt d\u0259yi\u015fikliy\u0259 u\u011frad\u0131, ona g\u00f6r\u0259 \u0259m\u0259liyyat <code>bizim \u00fc\u00e7\u00fcn m\u0259ntiqli oldu\u011funu g\u00f6st\u0259rir.<\/code> ke\u00e7m\u0259y\u0259c\u0259k.<\/p>\n<p>Konfiqurasiyan\u0131 Git-d\u0259 saxlamaq v\u0259 replace il\u0259 yenil\u0259m\u0259k \u00fc\u00e7\u00fcn \u0259m\u0259liyyat aparmaq laz\u0131md\u0131r. <code>get<\/code>, Git-dan ald\u0131\u011f\u0131m\u0131zla konfiqurasiyan\u0131 birl\u0259\u015fdirir v\u0259 icra edirik <code>bizim \u00fc\u00e7\u00fcn m\u0259ntiqli oldu\u011funu g\u00f6st\u0259rir.<\/code>. Normalda, kubectl yaln\u0131z <code>kubectl replace -f manifest.yaml<\/code>, burada <code>kubectl delete -f manifest.yaml<\/code> \u2014 art\u0131q tam haz\u0131rlanm\u0131\u015f (bizim hal\u0131m\u0131zda \u2014 birl\u0259\u015fdirilmi\u015f) manifestdir, onu qura\u015fd\u0131rmaq laz\u0131md\u0131r. Bel\u0259likl\u0259, istifad\u0259\u00e7i manifestl\u0259ri birl\u0259\u015fdirm\u0259lidir ki, bu da asan i\u015f deyil...<\/p>\n<p>H\u0259m\u00e7inin qeyd etm\u0259k laz\u0131md\u0131r ki, <code>kubectl delete -f manifest.yaml<\/code> Git-d\u0259 saxlanmas\u0131na baxmayaraq, biz \u0259vv\u0259lc\u0259d\u0259n bilmirik, obyekt yaratmaq laz\u0131md\u0131r, yoxsa onu yenil\u0259m\u0259k \u2014 bunu istifad\u0259\u00e7i proqram\u0131 etm\u0259lidir.<\/p>\n<p>Sonu\u00e7 olarak: <b>davaml\u0131 yay\u0131mlamaq<\/b> yaln\u0131z create, replace v\u0259 delete il\u0259 m\u00fcmk\u00fcnd\u00fcrm\u00fc, infrastruktura konfiqurasiyas\u0131n\u0131 Git-d\u0259 kodla birlikd\u0259 saxlayaraq, rahat CI\/CD t\u0259min ed\u0259r\u0259k?<\/p>\n<p>\u018fslind\u0259, m\u00fcmk\u00fcnd\u00fcr... Bunun \u00fc\u00e7\u00fcn <b>manifestl\u0259rin birl\u0259\u015fdirilm\u0259si<\/b> v\u0259 bir n\u00f6v ab\u015flama realla\u015fd\u0131r\u0131lmal\u0131d\u0131r ki, bu da:<\/p>\n<ul>\n<li> klasterd\u0259 obyekti yoxlay\u0131r,<\/li>\n<li> resursun ilkin yarad\u0131lmas\u0131n\u0131 h\u0259yata ke\u00e7irir,<\/li>\n<li> onu yenil\u0259yir v\u0259 ya silir.<\/li>\n<\/ul>\n<p>\nYenil\u0259m\u0259 zaman\u0131 n\u0259z\u0259r\u0259 al\u0131nmal\u0131d\u0131r ki, <i>resurs sonuncu d\u0259f\u0259<\/i> d\u00f6n\u0259n\u0259 q\u0259d\u0259r d\u0259yi\u015fmi\u015f ola bil\u0259r <code>get<\/code> v\u0259 optimistik kilidl\u0259m\u0259 hal\u0131n\u0131 avtomatik olaraq emal edir \u2014 yenil\u0259m\u0259yi t\u0259krarlama\u011fa \u00e7al\u0131\u015f\u0131r.<\/p>\n<p>Amma niy\u0259 t\u0259k\u0259r ixtira etm\u0259liyik ki, kube-apiserver resurslar\u0131 yenil\u0259m\u0259yin ba\u015fqa bir yolunu t\u0259klif edir: <code>patch<\/code>, bu da istifad\u0259\u00e7inin b\u0259zi probleml\u0259rini aradan qald\u0131r\u0131r?<\/p>\n<h3>Patch<\/h3>\n<p>\nBudur, biz patch-l\u0259r\u0259 g\u0259ldik.<\/p>\n<p>Patch-l\u0259r \u2014 Kubernetes-d\u0259 m\u00f6vcud obyektl\u0259r\u0259 d\u0259yi\u015fiklikl\u0259rin t\u0259tbiqinin \u0259sas \u00fcsuludur. Bu \u0259m\u0259liyyat <code>patch<\/code> bel\u0259 i\u015fl\u0259yir ki:<\/p>\n<ul>\n<li> kube-apiserver istifad\u0259\u00e7id\u0259n JSON format\u0131nda patch g\u00f6nd\u0259rm\u0259sini t\u0259l\u0259b edir v\u0259 obyekti g\u00f6st\u0259rm\u0259sini,<\/li>\n<li> apiserver is\u0259 cari obyekt v\u0259ziyy\u0259tini ba\u015fa d\u00fc\u015f\u0259r\u0259k onu t\u0259l\u0259b olunan formada t\u0259nziml\u0259yir.<\/li>\n<\/ul>\n<p>\nBu halda optimistik kilidl\u0259m\u0259 laz\u0131m deyil. Bu \u0259m\u0259liyyat replace il\u0259 m\u00fcqayis\u0259d\u0259 daha deklarativdir, baxmayaraq ki, \u0259vv\u0259lc\u0259 \u0259ksin\u0259 g\u00f6r\u00fcn\u0259 bil\u0259r.<\/p>\n<p>Bel\u0259likl\u0259:<\/p>\n<ul>\n<li> patch \u0259m\u0259liyyat\u0131 vasit\u0259sil\u0259 <code>B\u00f6y\u00fck disk obraz\u0131n\u0131 yaradan bu \u0259mr 40 GB \u00f6l\u00e7\u00fcs\u00fcnd\u0259 test \u015f\u0259kilini yaradacaq. \u0130ndi bu, h\u0259r hans\u0131 bir virtual ma\u015f\u0131nla qo\u015fulma\u011fa uy\u011fundur.<\/code> biz Git-d\u0259n manifest \u00fczr\u0259 obyekt yarad\u0131r\u0131q,<\/li>\n<li> il\u0259 <code>delete<\/code> \u2014 obyekti silirik, \u0259g\u0259r art\u0131q laz\u0131m deyils\u0259,<\/li>\n<li> il\u0259 <code>patch<\/code> \u2014 obyekti d\u0259yi\u015fdiririk, onu Git-d\u0259 t\u0259svir olunan formada g\u0259tiririk.<\/li>\n<\/ul>\n<p>\nAmma bunu etm\u0259k \u00fc\u00e7\u00fcn d\u00fczg\u00fcn <i>patch yaratmaq laz\u0131md\u0131r.<\/i>!<\/p>\n<h3>Helm 2-d\u0259 patch-l\u0259rin i\u015fl\u0259m\u0259 prinsipi: 2-yolda birl\u0259\u015fdirm\u0259<\/h3>\n<p>\nHelm ilk burax\u0131l\u0131\u015f\u0131 qura\u015fd\u0131rark\u0259n <code>B\u00f6y\u00fck disk obraz\u0131n\u0131 yaradan bu \u0259mr 40 GB \u00f6l\u00e7\u00fcs\u00fcnd\u0259 test \u015f\u0259kilini yaradacaq. \u0130ndi bu, h\u0259r hans\u0131 bir virtual ma\u015f\u0131nla qo\u015fulma\u011fa uy\u011fundur.<\/code> \u00e7art resurslar\u0131 \u00fc\u00e7\u00fcn \u0259m\u0259liyyat edir.<\/p>\n<p>Burax\u0131l\u0131\u015f\u0131 yenil\u0259dikd\u0259, Helm h\u0259r bir resurs \u00fc\u00e7\u00fcn:<\/p>\n<ul>\n<li> ke\u00e7mi\u015f \u00e7artdan resurs versiyas\u0131 il\u0259 cari \u00e7art versiyas\u0131 aras\u0131nda patch hesablay\u0131r<\/li>\n<li> v\u0259 bu patch-i t\u0259tbiq edir.<\/li>\n<\/ul>\n<p>\nBiz bu patch-i <b>2-yolda birl\u0259\u015fm\u0259 patch-i<\/b>, \u00e7\u00fcnki onun yarad\u0131lmas\u0131nda 2 manifest i\u015ftirak edir:<\/p>\n<ul>\n<li> ke\u00e7mi\u015f burax\u0131l\u0131\u015fdan resurs manifesti,<\/li>\n<li> cari resursun manifesti.<\/li>\n<\/ul>\n<p>\nSilinm\u0259 zaman\u0131 <code>delete<\/code> kube-apiserver-in \u0259m\u0259liyyat\u0131, ke\u00e7mi\u015f burax\u0131l\u0131\u015fda elan edilmi\u015f, lakin cari burax\u0131l\u0131\u015fda elan edilm\u0259mi\u015f resurslar \u00fc\u00e7\u00fcn \u00e7a\u011f\u0131r\u0131l\u0131r.<\/p>\n<p>2 yol birl\u0259\u015fm\u0259 patch yana\u015fmas\u0131n\u0131n bir problemi var: bu, klasterd\u0259 real resurs v\u0259ziyy\u0259ti il\u0259 Git-d\u0259ki manifest aras\u0131nda <b>qar\u0131\u015f\u0131ql\u0131\u011fa s\u0259b\u0259b olur.<\/b>.<\/p>\n<h3>Problemin t\u0259sviri n\u00fcmun\u0259si<\/h3>\n<p><\/p>\n<ul>\n<li> Git-d\u0259, \u00e7artda bir manifest var, onun sah\u0259si <code>image<\/code> Deployment-da d\u0259y\u0259ri <code>ubuntu:18.04<\/code>.<\/li>\n<li> \u0130stifad\u0259\u00e7i vasit\u0259sil\u0259 <code>kubectl edit<\/code> bu sah\u0259nin d\u0259y\u0259rini d\u0259yi\u015fdirdi <code>ubuntu:19.04<\/code>.<\/li>\n<li> Helm chart-\u0131n t\u0259krar yerl\u0259\u015fdirm\u0259sind\u0259 <i>patch yaratm\u0131r<\/i>, \u00e7\u00fcnki <code>image<\/code> ke\u00e7mi\u015f versiyas\u0131nda v\u0259 cari chart-da eynidir.<\/li>\n<li> T\u0259krar yerl\u0259\u015fdirdikd\u0259n sonra <code>image<\/code> qal\u0131q <code>ubuntu:19.04<\/code>, halbuki chart-da yaz\u0131l\u0131b ki, <code>ubuntu:18.04<\/code>.<\/li>\n<\/ul>\n<p>\nBiz asimmetriya ya\u015fad\u0131q v\u0259 deklarativliyi itirdik.<\/p>\n<h3>Senkronizasiya olunmu\u015f resurs n\u0259dir?<\/h3>\n<p>\n\u00dcmumiyy\u0259tl\u0259, <i>resursun manifesti il\u0259 i\u015fl\u0259y\u0259n klasterd\u0259ki manifest aras\u0131nda tam<\/i> uy\u011funluq \u0259ld\u0259 etm\u0259k m\u00fcmk\u00fcn deyil. \u00c7\u00fcnki real manifestd\u0259 m\u00fcvafiq annotasiyalar\/etiketl\u0259r, \u0259lav\u0259 konteynerl\u0259r v\u0259 dig\u0259r dinamik olaraq idar\u0259\u00e7il\u0259r t\u0259r\u0259find\u0259n \u0259lav\u0259 olunan v\u0259 silin\u0259n m\u0259lumatlar ola bil\u0259r. Bu m\u0259lumatlar\u0131 biz Git-d\u0259 saxlamaq ist\u0259mirik v\u0259 ist\u0259mirik. Ancaq, yerl\u0259\u015fdirdikd\u0259, Git-d\u0259 a\u00e7\u0131q \u015f\u0259kild\u0259 g\u00f6st\u0259rdiyimiz sah\u0259l\u0259rin m\u00fcvafiq d\u0259y\u0259rl\u0259ri almas\u0131n\u0131 ist\u0259yirik.<\/p>\n<p>Bel\u0259likl\u0259, <b>senkronizasiya olunmu\u015f resursun<\/b>\u00fcmumi qaydas\u0131d\u0131r: resurs yerl\u0259\u015fdiril\u0259n zaman yaln\u0131z Git manifestind\u0259 a\u00e7\u0131q \u015f\u0259kild\u0259 g\u00f6st\u0259ril\u0259n sah\u0259l\u0259ri d\u0259yi\u015fm\u0259k v\u0259 ya silm\u0259k olar (v\u0259 ya \u0259vv\u0259lki versiyas\u0131nda g\u00f6st\u0259rilmi\u015f diskin sah\u0259l\u0259ri).<\/p>\n<h3>3-yolda birl\u0259\u015fdirm\u0259 patch<\/h3>\n<p>\n\u018fsas fikir <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Merge_(version_control)#Three-way_merge\">3-yolda birl\u0259\u015fdirm\u0259 patch<\/a><\/noindex>: Git-in t\u0259tbiq edil\u0259n \u0259n son versiyas\u0131 il\u0259 Git-d\u0259ki h\u0259d\u0259f versiyas\u0131 aras\u0131nda patch yarad\u0131l\u0131r, i\u015fl\u0259y\u0259n klasterd\u0259ki cari versiya da n\u0259z\u0259r\u0259 al\u0131n\u0131r. N\u0259tic\u0259 patch senkronizasiya olunmu\u015f resursun qaydas\u0131na uy\u011fun olmal\u0131d\u0131r:<\/p>\n<ul>\n<li> h\u0259d\u0259f versiyaya \u0259lav\u0259 edilmi\u015f yeni sah\u0259l\u0259r patch vasitas\u0131 il\u0259 \u0259lav\u0259 olunur;<\/li>\n<li> son t\u0259tbiq olunan versiyadak\u0131 m\u00f6vcud sah\u0259l\u0259r v\u0259 h\u0259d\u0259fd\u0259 olmayanlar patch vasitas\u0131 il\u0259 s\u0131f\u0131rlan\u0131r;<\/li>\n<li> m\u00f6vcud versiyadak\u0131 h\u0259d\u0259f versiyadan f\u0259rql\u0259n\u0259n sah\u0259l\u0259r patch vasit\u0259sil\u0259 yenil\u0259nir.<\/li>\n<\/ul>\n<p>\nPatch-lar m\u0259hz bu prinsip\u0259 g\u00f6r\u0259 yarad\u0131l\u0131r <code>kubectl apply<\/code>:<\/p>\n<ul>\n<li> t\u0259tbiq olunan \u0259n son versiya obyektin annotasiyas\u0131nda saxlan\u0131l\u0131r, <\/li>\n<li> h\u0259d\u0259f - g\u00f6st\u0259rilmi\u015f YAML fayl\u0131ndan g\u00f6t\u00fcr\u00fcl\u00fcr,<\/li>\n<li> m\u00f6vcud - i\u015fl\u0259y\u0259n klasterd\u0259n.<\/li>\n<\/ul>\n<p>\n\u0130ndi, n\u0259z\u0259riyy\u0259 il\u0259 tan\u0131\u015f olduqdan sonra, werf-d\u0259 n\u0259 etdiyimizi izah etm\u0259y\u0259 vaxt\u0131d\u0131r.<\/p>\n<h2>werf-d\u0259 d\u0259yi\u015fiklikl\u0259rin t\u0259tbiqi<\/h2>\n<p>\n\u018fvv\u0259ll\u0259r werf, Helm 2 kimi, 2-yolda birl\u0259\u015fdirm\u0259 patch-l\u0259rind\u0259n istifad\u0259 edirdi.<\/p>\n<h3>Repair patch<\/h3>\n<p>\nYeni patch tipin\u0259 - 3-yolda birl\u0259\u015fdirm\u0259y\u0259 ke\u00e7m\u0259k \u00fc\u00e7\u00fcn ilk add\u0131m, bel\u0259 adland\u0131r\u0131lan <b>repair-patch-l\u0259ri daxil etdik<\/b>.<\/p>\n<p>Yerl\u0259\u015fdirm\u0259 zaman\u0131 standart 2-yolda birl\u0259\u015fdirm\u0259 patch-\u0131 istifad\u0259 edilir, lakin werf \u0259lav\u0259 olaraq resursun real v\u0259ziyy\u0259tini Git-d\u0259 yaz\u0131lm\u0131\u015fa uy\u011funla\u015fd\u0131ran bir patch yarad\u0131r (bu patch evvelki sekronizasiya qaydas\u0131n\u0131 t\u0259tbiq ed\u0259r\u0259k yarad\u0131l\u0131r, yuxar\u0131da izah edilib).<\/p>\n<p>Asimmetriya ba\u015f ver\u0259rs\u0259, yerl\u0259\u015fdirm\u0259nin sonunda istifad\u0259\u00e7i m\u00fcvafiq mesajla WARNING al\u0131r v\u0259 resursu senkronizasiya olunmu\u015f v\u0259ziyy\u0259t\u0259 g\u0259tirm\u0259k \u00fc\u00e7\u00fcn t\u0259tbiq edilm\u0259si g\u0259r\u0259k\u0259n patch t\u0259qdim olunur. Bu patch eyni zamanda x\u00fcsusi bir annotasiyaya yaz\u0131l\u0131r <code>werf.io\/repair-patch<\/code>. \u0130stifad\u0259\u00e7inin \u00f6z\u00fc <b>\u00f6z<\/b> bu patch t\u0259tbiq edin: werf bunu t\u0259tbiq etm\u0259kd\u0259 \u0259sas\u0259n maraql\u0131 olmayacaq.<\/p>\n<p>Repair patch-l\u0259rin yarad\u0131lmas\u0131 m\u00fcv\u0259qq\u0259ti bir t\u0259dbirdir ki, bu da 3-way-merge prinsipin\u0259 uy\u011fun olaraq patch-l\u0259rin yarad\u0131lmas\u0131n\u0131 praktiki olaraq yoxlama\u011fa imkan verir; lakin avtomatik olaraq bu patch-l\u0259ri t\u0259tbiq etmir. Haz\u0131rda bu i\u015f rejimi standart olaraq aktivdir.<\/p>\n<h3>3-way-merge patch yaln\u0131z yeni burax\u0131l\u0131\u015flar \u00fc\u00e7\u00fcn<\/h3>\n<p>\n1 dekabr 2019-cu ild\u0259n etibar\u0259n beta v\u0259 alpha versiyalar\u0131 werf ba\u015flay\u0131r <b>ba\u015flan\u011f\u0131c olaraq<\/b> tam 3-way-merge-patch-l\u0259rd\u0259n istifad\u0259 etm\u0259y\u0259 yaln\u0131z yeni Helm burax\u0131l\u0131\u015flar\u0131na d\u0259yi\u015fiklikl\u0259ri t\u0259tbiq etm\u0259k \u00fc\u00e7\u00fcn, werf vasit\u0259sil\u0259 yay\u0131mlan\u0131r. Art\u0131q m\u00f6vcud burax\u0131l\u0131\u015flar 2-way-merge + repair patch yana\u015fmas\u0131n\u0131 istifad\u0259 etm\u0259y\u0259 davam ed\u0259c\u0259k.<\/p>\n<p>Bu i\u015f rejimini a\u00e7\u0131q \u015f\u0259kild\u0259 aktivl\u0259\u015fdirm\u0259k m\u00fcmk\u00fcnd\u00fcr <code>WERF_THREE_WAY_MERGE_MODE=onlyNewReleases<\/code> indid\u0259n.<\/p>\n<p><i><b>Qeyd<\/b>: bu x\u00fcsusiyy\u0259t werf-d\u0259 bir ne\u00e7\u0259 versiyadan etibar\u0259n gen\u0259ldilmi\u015fdir: alpha kanal\u0131nda version <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\/releases\/tag\/v1.0.5-alpha.19\">v1.0.5-alpha.19<\/a><\/noindex>, beta kanal\u0131nda - il\u0259 <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 b\u00fct\u00fcn burax\u0131l\u0131\u015flar \u00fc\u00e7\u00fcn<\/h3>\n<p>\n15 dekabr 2019-cu ild\u0259n etibar\u0259n beta v\u0259 alpha versiyalar\u0131 werf standart olaraq b\u00fct\u00fcn burax\u0131l\u0131\u015flar \u00fc\u00e7\u00fcn tam 3-way-merge-patch-l\u0259rd\u0259n istifad\u0259 etm\u0259y\u0259 ba\u015flay\u0131r.<\/p>\n<p>Bu i\u015f rejimini a\u00e7\u0131q \u015f\u0259kild\u0259 aktivl\u0259\u015fdirm\u0259k m\u00fcmk\u00fcnd\u00fcr <code>WERF_THREE_WAY_MERGE_MODE=enabled<\/code> indid\u0259n.<\/p>\n<h3>Resurslar\u0131n avtomatik miqyas\u0131 nec\u0259 olmaq laz\u0131md\u0131r?<\/h3>\n<p>\nKubernetes-d\u0259 2 n\u00f6v avtomatik miqyaslama var: HPA (\u00fcf\u00fcqi) v\u0259 VPA (\u015faquli).<\/p>\n<p>\u00dcf\u00fcqi avtomatik olaraq replikalar\u0131n say\u0131n\u0131 se\u00e7ir, \u015faquli is\u0259 resurslar\u0131n miqdar\u0131n\u0131. H\u0259m replikalar\u0131n, h\u0259m d\u0259 resurslar \u00fc\u00e7\u00fcn t\u0259l\u0259bl\u0259r resurs manifestind\u0259 g\u00f6st\u0259rilir (bax\u0131n. <code>spec.replicas<\/code> v\u0259 <code>spec.containers[].resources.limits.cpu<\/code>, <code>spec.containers[].resources.limits.memory<\/code> v\u0259 <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/configuration\/manage-compute-resources-container\/#resource-requests-and-limits-of-pod-and-container\">dig\u0259r<\/a><\/noindex>).<\/p>\n<p>Problem: \u0259g\u0259r istifad\u0259\u00e7i resursu \u00e7artda konfiqurasiya ed\u0259rs\u0259 ki, orada resurslar v\u0259 replikalar \u00fc\u00e7\u00fcn m\u00fc\u0259yy\u0259n d\u0259y\u0259rl\u0259r qeyd olunubsa v\u0259 bu resurs \u00fc\u00e7\u00fcn avtomatik miqyaslay\u0131c\u0131lar aktivdirs\u0259, werf h\u0259r d\u0259f\u0259 yerl\u0259\u015fdirm\u0259d\u0259 bu d\u0259y\u0259rl\u0259ri \u00e7art manifestind\u0259 qeyd olunanlara s\u0131f\u0131rlayacaq.<\/p>\n<p>Problemin iki h\u0259lli var. \u0130lk n\u00f6vb\u0259d\u0259, \u00e7art manifestind\u0259 avtomatik miqyasa bil\u0259n d\u0259y\u0259rl\u0259rin a\u00e7\u0131q g\u00f6st\u0259rilm\u0259sind\u0259n imtina etm\u0259k daha yax\u015f\u0131d\u0131r. \u018fg\u0259r bu variant hans\u0131sa s\u0259b\u0259bl\u0259rd\u0259n uy\u011fun deyils\u0259 (m\u0259s\u0259l\u0259n, \u00e7artda ilkin resurs limitl\u0259rini v\u0259 replikalar\u0131n say\u0131n\u0131 t\u0259yin etm\u0259k rahat olduqda), o zaman werf a\u015fa\u011f\u0131dak\u0131 annotasiyalar\u0131 t\u0259klif edir:<\/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>\nBel\u0259 bir annotasiya varsa werf h\u0259r d\u0259f\u0259 yerl\u0259\u015fdirm\u0259d\u0259 m\u00fcvafiq d\u0259y\u0259rl\u0259ri s\u0131f\u0131rlamayacaq, yaln\u0131z resursun ilkin yarad\u0131lmas\u0131 zaman\u0131 onlar\u0131 t\u0259yin ed\u0259c\u0259k.<\/p>\n<p>Daha \u0259trafl\u0131 - layih\u0259nin dokumentasiyas\u0131nda bax\u0131n <noindex><a rel=\"nofollow\" href=\"https:\/\/werf.io\/documentation\/reference\/deploy_process\/resources_update_methods_and_adoption.html#deal-with-hpa\">HPA<\/a><\/noindex> v\u0259 <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>3-way-merge patch istifad\u0259sini qada\u011fan etm\u0259k<\/h3>\n<p>\n\u0130stifad\u0259\u00e7i h\u0259l\u0259 d\u0259 werf-d\u0259 yeni patchl\u0259rin istifad\u0259sini \u0259traf m\u00fchit d\u0259yi\u015f\u0259ni vasit\u0259sil\u0259 qada\u011fan ed\u0259 bil\u0259r <code>WERF_THREE_WAY_MERGE_MODE=disabled<\/code>. Lakin, 1 mart 2020-ci ild\u0259n etibar\u0259n bu qada\u011fa q\u00fcvv\u0259d\u0259n d\u00fc\u015f\u0259c\u0259k <b>v\u0259 yaln\u0131z 3-way-merge-patch-l\u0259rin istifad\u0259si m\u00fcmk\u00fcn olacaq.<\/b> werf-d\u0259 resurslar\u0131n q\u0259bul edilm\u0259si<\/p>\n<h2>3-way-merge-patch-l\u0259rl\u0259 d\u0259yi\u015fiklikl\u0259rin t\u0259tbiqind\u0259 yeni metodun \u0259ld\u0259 edilm\u0259si, biz\u0259 klasterd\u0259 m\u00f6vcud resurslar\u0131n Helm burax\u0131l\u0131\u015f\u0131na adoption edil\u0259 bil\u0259n bel\u0259 bir x\u00fcsusiyy\u0259ti d\u0259rhal h\u0259yata ke\u00e7irm\u0259y\u0259 imkan verdi.<\/h2>\n<p>\n3-way-merge-patch-l\u0259rl\u0259 d\u0259yi\u015fiklikl\u0259rin t\u0259tbiqi metodunu m\u0259nims\u0259dikd\u0259n sonra, biz\u0259 klasterd\u0259 m\u00f6vcud resurslar\u0131n Helm burax\u0131l\u0131\u015f\u0131na adoption etm\u0259y\u0259 imkan ver\u0259n bel\u0259 bir x\u00fcsusiyy\u0259ti d\u0259rhal h\u0259yata ke\u00e7irm\u0259y\u0259 imkan verdi.<\/p>\n<p>Helm 2-d\u0259 bir problem var: art\u0131q klasterd\u0259 olan resursu manifestl\u0259r\u0259 \u0259lav\u0259 etm\u0259k m\u00fcmk\u00fcn deyil, bu resursu s\u0131f\u0131rdan yenid\u0259n yaratmadan (bax. <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>). Biz werfi m\u00f6vcud resurslar\u0131 burax\u0131l\u0131\u015fa q\u0259bul etm\u0259y\u0259 \u00f6yr\u0259tdik. Bunun \u00fc\u00e7\u00fcn i\u015fl\u0259mi\u015f klasterd\u0259ki resursun cari versiyas\u0131na annotasiya \u0259lav\u0259 etm\u0259k laz\u0131md\u0131r (m\u0259s\u0259l\u0259n, <code>kubectl edit<\/code>):<\/p>\n<pre><code class=\"plaintext\">\"werf.io\/allow-adoption-by-release\": RELEASE_NAME<\/code><\/pre>\n<p>\n\u0130ndi resursu \u00e7artda t\u0259svir etm\u0259k laz\u0131md\u0131r v\u0259 werf burax\u0131l\u0131\u015f\u0131 m\u00fcvafiq adla n\u00f6vb\u0259ti yerl\u0259\u015fdirm\u0259d\u0259 m\u00f6vcud resursu bu burax\u0131l\u0131\u015fa q\u0259bul ed\u0259c\u0259k v\u0259 onun idar\u0259sind\u0259n \u00e7\u0131xmayacaq. \u00dcst\u0259lik, resurs burax\u0131l\u0131\u015fa q\u0259bul edil\u0259rk\u0259n, werf i\u015fl\u0259mi\u015f klasterd\u0259ki resursun cari v\u0259ziyy\u0259tini \u00e7artda t\u0259svir olunan v\u0259ziyy\u0259t\u0259 g\u0259tir\u0259c\u0259k, eyni 3-way-merge-patch-l\u0259rd\u0259n v\u0259 sinxronizasiya edilmi\u015f resurs qaydas\u0131ndan istifad\u0259 ed\u0259c\u0259k.<\/p>\n<p><i><b>Qeyd<\/b>: konfiqurasiya <code>WERF_THREE_WAY_MERGE_MODE<\/code> resurslar\u0131n q\u0259buluna t\u0259sir etmir \u2014 q\u0259bul hal\u0131nda h\u0259mi\u015f\u0259 3-way-merge-patch istifad\u0259 olunur.<\/i><\/p>\n<p>T\u0259f\u0259rr\u00fcatlar \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/werf.io\/documentation\/reference\/deploy_process\/resources_update_methods_and_adoption.html#resources-adoption\">s\u0259n\u0259d<\/a><\/noindex>.<\/p>\n<h2>N\u0259tic\u0259l\u0259r v\u0259 g\u0259l\u0259c\u0259k planlar<\/h2>\n<p>\n\u00dcmid edir\u0259m ki, bu yaz\u0131dan sonra 3-way-merge-patch-l\u0259rin n\u0259 oldu\u011fu v\u0259 niy\u0259 bunlara g\u0259ldiyimiz daha ayd\u0131n oldu. Praktik bax\u0131mdan werf layih\u0259sinin inki\u015faf\u0131nda bunlar\u0131n t\u0259tbiqi, Helm-\u0259 b\u0259nz\u0259r yerl\u0259\u015fdirilm\u0259nin yax\u015f\u0131la\u015fd\u0131r\u0131lmas\u0131 yolunda daha bir add\u0131m oldu. \u0130ndi Helm 2 istifad\u0259 ed\u0259rk\u0259n tez-tez ba\u015f ver\u0259n konfiqurasiya sinxronizasiyas\u0131 probleml\u0259rini unutmaq olar. Eyni zamanda, art\u0131q y\u00fckl\u0259nmi\u015f Kubernetes resurslar\u0131n\u0131n Helm burax\u0131l\u0131\u015flar\u0131na q\u0259bul edilm\u0259si il\u0259 ba\u011fl\u0131 yeni faydal\u0131 bir x\u00fcsusiyy\u0259t \u0259lav\u0259 edildi.<\/p>\n<p>Helm-\u0259 b\u0259nz\u0259r yerl\u0259\u015fdirm\u0259d\u0259 h\u0259l\u0259 d\u0259 b\u0259zi probleml\u0259r v\u0259 \u00e7\u0259tinlikl\u0259r qal\u0131r, m\u0259s\u0259l\u0259n, Go \u015fablonlar\u0131n\u0131n istifad\u0259si v\u0259 biz bu m\u0259s\u0259l\u0259l\u0259ri h\u0259ll etm\u0259y\u0259 davam ed\u0259c\u0259yik.<\/p>\n<p>Resurslar\u0131n yenil\u0259m\u0259 metodlar\u0131 v\u0259 q\u0259bul prosesi haqq\u0131nda m\u0259lumat\u0131 da <noindex><a rel=\"nofollow\" href=\"https:\/\/werf.io\/documentation\/reference\/deploy_process\/resources_update_methods_and_adoption.html\">bu s\u0259n\u0259d s\u0259hif\u0259sind\u0259 tapa bil\u0259rsiniz<\/a><\/noindex>.<\/p>\n<h3>Helm 3<\/h3>\n<p>\nX\u00fcsusi qeyd edilm\u0259y\u0259 layiqdir ki, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/news\/t\/475722\/\">bir ne\u00e7\u0259 g\u00fcn \u0259vv\u0259l \u00e7\u0131xan<\/a><\/noindex> yeni \u0259sas versiya Helm \u2014 v3, \u2014 3-way-merge-patch-l\u0259ri istifad\u0259 edir v\u0259 Tilleri aradan qald\u0131r\u0131r. Yeni Helm versiyas\u0131 <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/topics\/v2_v3_migration\/\">miqrasiya<\/a><\/noindex> art\u0131q m\u00f6vcud qura\u015fd\u0131rmalar\u0131 yenilik v\u0259zif\u0259siyl\u0259 yeni burax\u0131l\u0131\u015f format\u0131na \u00e7evirm\u0259k \u00fc\u00e7\u00fcn t\u0259l\u0259b edir.<\/p>\n<p>Werf, \u00f6z t\u0259r\u0259find\u0259n, hal-haz\u0131rda Tilleri istifad\u0259 etm\u0259mi\u015fdir, 3-way-merge sistemin\u0259 ke\u00e7di v\u0259 <noindex><a rel=\"nofollow\" href=\"https:\/\/werf.io\/documentation\/reference\/deploy_process\/differences_with_helm.html\">d\u0259f\u0259l\u0259rl\u0259 dig\u0259r<\/a><\/noindex>, eyni zamanda, \u0259vv\u0259ll\u0259r yarad\u0131lm\u0131\u015f Helm 2 qura\u015fd\u0131rmalar\u0131 il\u0259 uy\u011fun qald\u0131 (miqrasiya skriptl\u0259ri yerin\u0259 yetirm\u0259k laz\u0131m deyil). Buna g\u00f6r\u0259, werf h\u0259l\u0259 Helm 3-\u0259 ke\u00e7irilm\u0259diyi m\u00fcdd\u0259tc\u0259, werf istifad\u0259\u00e7il\u0259ri Helm 3-\u00fcn Helm 2-y\u0259 nisb\u0259t\u0259n \u0259sas \u00fcst\u00fcnl\u00fckl\u0259rini itirmirl\u0259r (werf-d\u0259 bunlar da m\u00f6vcuddur).<\/p>\n<p>Buna baxmayaraq, werf-in Helm 3 kod bazas\u0131na ke\u00e7idi qa\u00e7\u0131lmazd\u0131r v\u0259 yax\u0131n g\u0259l\u0259c\u0259kd\u0259 ba\u015f verm\u0259lidir. T\u0259xmin\u0259n bu, werf 1.1 v\u0259 ya werf 1.2 olacaq (haz\u0131rda, werf-in ba\u015f versiyas\u0131 1.0-d\u0131r; werf versiya strukturu haqq\u0131nda daha \u0259trafl\u0131 bax\u0131n.) <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf#backward-compatibility-promise\">burada<\/a><\/noindex>). Bu d\u00f6vr \u0259rzind\u0259 Helm 3 stabil hala g\u0259l\u0259c\u0259k.<\/p>\n<h2>P.S.<\/h2>\n<p>\nBlogumuzda oxuyun:<\/p>\n<ul>\n<li> werf-d\u0259 yenilikl\u0259r\u0259 dair qeydl\u0259r d\u00f6vr\u00fc:\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/468049\/\">Kompleks Helm \u00e7artlar\u0131n\u0131n burax\u0131lmas\u0131 \u00fc\u00e7\u00fcn werf-in istifad\u0259si<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/465131\/\">werf-d\u0259 monorepo v\u0259 multirepo d\u0259st\u0259yi v\u0259 bunun Docker Registry il\u0259 \u0259laq\u0259si<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/463613\/\">\u0130ndi werf-d\u0259 Docker obrazlar\u0131n\u0131 adi Dockerfile \u0259sas\u0131nda toplamaq m\u00fcmk\u00fcnd\u00fcr<\/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 Kubernetes-d\u0259 CI\/CD \u00fc\u00e7\u00fcn al\u0259timiz (icmal v\u0259 t\u0259qdimat videosu)<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/469541\/\">Werf v\u0259 GitLab CI il\u0259 eyni tipli mikrosisteml\u0259rin qurulmas\u0131 v\u0259 yerl\u0259\u015fdirilm\u0259si<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/453734\/\">Helm 3-\u0259 tan\u0131\u015fl\u0131q<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>M\u0259nb\u0259: <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.0.1 - 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\/az\/blog\/administrirovanie\/3-way-merge-v-werf-deploj-v-kubernetes-s-helm-na-steroidah\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"az_AZ\" \/>\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\/az\/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-yolda birl\u0259\u015fm\u0259 werf-d\u0259: Kubernetes-d\u0259 Helm il\u0259 \"steroyd\" il\u0259 yerl\u0259\u015fdirm\u0259 | ProHoster","description":"Bu bizim (v\u0259 yaln\u0131z bizim) uzun m\u00fcdd\u0259tdir g\u00f6zl\u0259diyimiz bir \u015fey ba\u015f verdi: werf, Kubernetes-d\u0259 t\u0259tbiqetm\u0259l\u0259ri y\u0131\u011fmaq v\u0259 \u00e7atd\u0131rmaq \u00fc\u00e7\u00fcn a\u00e7\u0131q m\u0259nb\u0259li bir vasit\u0259dir v\u0259 indi d\u0259st\u0259kl\u0259yir.","canonical_url":"https:\/\/prohoster.info\/az\/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":"az_AZ","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\/az\/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\/az\/wp-json\/wp\/v2\/posts\/53120","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/comments?post=53120"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/posts\/53120\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/media\/53121"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/media?parent=53120"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/categories?post=53120"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/tags?post=53120"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}