{"id":36754,"date":"2019-10-31T22:13:37","date_gmt":"2019-10-31T19:13:37","guid":{"rendered":"https:\/\/prohoster.info\/blog\/werf-nash-instrument-dlya-ci-cd-v-kubernetes-obzor-i-video-doklada\/"},"modified":"2019-10-31T22:13:37","modified_gmt":"2019-10-31T19:13:37","slug":"werf-nash-instrument-dlya-ci-cd-v-kubernetes-obzor-i-video-doklada","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/werf-nash-instrument-dlya-ci-cd-v-kubernetes-obzor-i-video-doklada","title":{"rendered":"werf \u2014 meie CI\/CD t\u00f6\u00f6riist Kubernetesis (\u00fclevaade ja videoettekanne)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>27. mai DevOpsConf 2019 peamiseks saalis, mis toimub festivali raames <noindex><a rel=\"nofollow\" href=\"http:\/\/ritfest.ru\/2019\/\">RIT++ 2019<\/a><\/noindex>, sektsioonis \u201eJ\u00e4tkuv tarnimine\u201c k\u00f5las ettekand \u201ewerf \u2014 meie t\u00f6\u00f6riist CI\/CD jaoks Kuberneteses\u201c. Selles r\u00e4\u00e4gitakse nendest <b>probleemidest ja v\u00e4ljakutsetest, millega iga\u00fchel on silmitsi seista Kubernetesesse juurutamisel<\/b>, samuti n\u00fcanssidest, mis ei pruugi kohe silma torkata. Tutvustades v\u00f5imalikke lahendusteid, n\u00e4itame, kuidas see on rakendatud avatud l\u00e4htekoodiga t\u00f6\u00f6riistis <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\">werf<\/a><\/noindex>.<\/p>\n<p>Alates meie ettekandest on meie utiliit (varem tuntud kui dapp) \u00fcletanud ajaloolise piiri <b>1000 t\u00e4hte GitHubis<\/b> \u2014 loodame, et kasvav kasutajaskond teeb elu lihtsamaks paljudele DevOps-inseneridele.<\/p>\n<p><img decoding=\"async\" alt=\"werf \u2014 meie CI\/CD t\u00f6\u00f6riist Kubernetesis (\u00fclevaade ja videoettekanne)\" src=\"\/wp-content\/uploads\/2019\/08\/c2d1ad5133c0de944b60ae37e3dbe598.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNii et tutvustame <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=cK3ackGUTLw\"><b>ettekande video vaatamiseks<\/b><\/a><\/noindex> (~47 minutit, palju informatiivsem kui artikkel) ja selle peamisi kokkuv\u00f5tteid tekstivormis. Alustame!<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Koodi tarnimine Kubernetesesse<\/h2>\n<p>\nEttekanne r\u00e4\u00e4gib enam mitte werf'ist, vaid CI\/CD-st Kuberneteses, eeldades, et meie tarkvara on pakitud Docker-konteinernitesse <i>(sellest r\u00e4\u00e4kisin ma <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/322686\/\">2016. aasta ettekandes<\/a><\/noindex>)<\/i>, ja K8s kasutatakse selle k\u00e4itamiseks tootmises <i>(sellest \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/331188\/\">2017. aastal<\/a><\/noindex>)<\/i>.<\/p>\n<p>Kuidas n\u00e4eb v\u00e4lja tarnimine Kubernetesesse?<\/p>\n<ul>\n<li> On olemas Git-repositsioon koos koodiga ja juhistega selle kogumiseks. Rakendus kogutakse Docker-pildiks ja avaldatakse Docker Registry'sse.<\/li>\n<li> Samas repositooriumis on juhised ka selle kohta, kuidas rakendust juurutada ja k\u00e4ivitada. Juhtimise etapis saadetakse need juhised Kubernetes'esse, mis toob vajaliku pildi registrist ja k\u00e4ivitab selle.<\/li>\n<li> Lisaks on tavaliselt olemas testid. M\u00f5ningaid neist saab k\u00e4ivitada pildi avaldamise ajal. Samuti saab (sama juhiste abil) juurutada rakenduse koopia (erinevas K8s-nimruumis v\u00f5i eraldi klastris) ja k\u00e4ivitada seal testid.<\/li>\n<li> \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043d\u0443\u0436\u043d\u0430 CI-\u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438\u0437 Git&#8217;\u0430 (\u0438\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043d\u043e\u043f\u043e\u043a) \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0435 \u0441\u0442\u0430\u0434\u0438\u0438: build, publish, deploy, test.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"werf \u2014 meie CI\/CD t\u00f6\u00f6riist Kubernetesis (\u00fclevaade ja videoettekanne)\" src=\"\/wp-content\/uploads\/2019\/08\/ec0d1fd1bf1a68cca92badf7cf1affe1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSiin on m\u00f5ned olulised m\u00e4rkused:<\/p>\n<ol>\n<li> Kuna meil on muutumatu infrastruktuur <i>(immutable infrastructure)<\/i>, peab rakenduse pilt, mida kasutatakse k\u00f5igis etappides (staging, production jne), <b>olema \u00fchesugune.<\/b>. <i>\u00dcksikasjalikumalt sellest ja koos n\u00e4idistega r\u00e4\u00e4kisin ma <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/324274\/\">siit<\/a><\/noindex>.<\/i><\/li>\n<li> Kuna me j\u00e4rgime l\u00e4henemist infrastruktuur kui kood <i>(IaC)<\/i>, peab rakenduse kood, selle kogumise ja k\u00e4ivitamise juhised olema <b>just \u00fches repositooriumis.<\/b>. <i>Rohkem teavet selle kohta \u2014 vt <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/324274\/\">samast ettekandest.<\/a><\/noindex>.<\/i><\/li>\n<li> Tootmise ahel <i>(tootmine)<\/i> n\u00e4eme tavaliselt nii: rakendus on kokku pandud, testitud ja v\u00e4lja lastud <i>(vabastamise etapp)<\/i> ja k\u00f5ik \u2014 tarnimine toimus. Kuid tegelikult saab kasutaja seda, mida te v\u00e4lja lasite, <b>ei<\/b> just siis, kui te selle tootmisprotsessi tarnisite ja kui ta p\u00e4\u00e4ses sellele juurde ja see tootmisprotsess t\u00f6\u00f6tas. Seet\u00f5ttu arvan, et tootmise ahel l\u00f5peb <b>ainult t\u00f6\u00f6etapis<\/b> <i>(t\u00f6\u00f6)<\/i>, ja t\u00e4psemalt, isegi hetkel, kui kood eemaldati tootmisest (asendades selle uuega).<\/li>\n<\/ol>\n<p>\nNaaseme \u00fclaltoodud Kubernetes\u2019e tarnimise skeemi juurde: seda ei ole v\u00e4lja m\u00f5elnud ainult meie, vaid ka sisuliselt iga\u00fcks, kes selle probleemiga tegeleb. Tegelikult nimetatakse seda mustrit n\u00fc\u00fcd GitOps <i>(rohkem terminist ja ideedest, mis selle taga seisavad, saab lugeda <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/458878\/\">siit<\/a><\/noindex>)<\/i>). Vaatame skeemi etappe.<\/p>\n<h2>Kogumise etapp<\/h2>\n<p>\n\u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0432 2019 \u0433\u043e\u0434\u0443 \u043f\u0440\u043e \u0441\u0431\u043e\u0440\u043a\u0443 Docker-\u043e\u0431\u0440\u0430\u0437\u043e\u0432, \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0443\u043c\u0435\u044e\u0442 \u043f\u0438\u0441\u0430\u0442\u044c Dockerfile&#8217;\u044b \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c <code>docker build<\/code>?.. \u0412\u043e\u0442 \u043d\u044e\u0430\u043d\u0441\u044b, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435:<\/p>\n<ol>\n<li> <b>Pildi suurus<\/b> on oluline, seega kasutage <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/develop\/develop-images\/multistage-build\/\">multi-stage<\/a><\/noindex>, et j\u00e4tta pildile alles ainult t\u00f5eliselt vajalik rakenduse t\u00f6\u00f6ks.<\/li>\n<li> <b>Kihte<\/b> tuleb minimeerida, \u00fchendades <code>RUN<\/code>-k\u00e4sku loogiliselt.<\/li>\n<li> Kuid see toob kaasa probleeme <b>silumiseks<\/b>, kuna ehituse kokkuvarisemisel tuleb leida see \u00f5ige k\u00e4sk j\u00e4rjekorrast, mis probleemi p\u00f5hjustas.<\/li>\n<li> <b>Kogumise kiirus<\/b> on oluline, kuna soovime kiiresti muudatusi ellu viia ja nende tulemusi j\u00e4lgida. N\u00e4iteks ei taha ma iga rakenduse kogumise korral keeltes esinevaid s\u00f5ltuvusi uuesti koguda.<\/li>\n<li> Sageli vajatakse \u00fchest Git-repositooriumist <b>palju pilte<\/b>, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0438\u0437 Dockerfile&#8217;\u043e\u0432 (\u0438\u043b\u0438 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0441\u0442\u0430\u0434\u0438\u044f\u043c\u0438 \u0432 \u043e\u0434\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435) \u0438 Bash-\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c \u0441 \u0438\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u043e\u0439.<\/li>\n<\/ol>\n<p>\nSee oli vaid j\u00e4\u00e4m\u00e4e tipp, millega k\u00f5ik silmitsi seisavad. Kuid on ka teisi probleeme, sealhulgas:<\/p>\n<ol>\n<li> Sageli on meil ehitusetapis vaja midagi <b>mountida<\/b> (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0437\u0430\u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0442\u0438\u043f\u0430 apt&#8217;\u0430 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044e\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e).<\/li>\n<li> Soovime <b>Ansible<\/b> \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 shell&#8217;\u0435.<\/li>\n<li> Soovime <b>kogu ilma Dockerita<\/b> (miks peaks olema t\u00e4iendav virtuaalmasin, kuhu tuleb see k\u00f5ik seadistada, kui meil on juba Kubernetes'i klaster, kus konteinerit jooksutada?).<\/li>\n<li> <b>Paralleelne koostamine<\/b>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443: \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438\u0437 Dockerfile (\u0435\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f multi-stage), \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 \u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f, \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e Dockerfile&#8217;\u043e\u0432.<\/li>\n<li> <b>Jaotatud ehitamine<\/b>: \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0432 pod&#8217;\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u00ab\u044d\u0444\u0435\u043c\u0435\u0440\u043d\u044b\u043c\u0438\u00bb, \u0442.\u043a. \u0443 \u043d\u0438\u0445 \u043f\u0440\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u043a\u044d\u0448, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u2014 \u0435\u0433\u043e \u043d\u0430\u0434\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0433\u0434\u0435-\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e.<\/li>\n<li> L\u00f5puks, oma soovide tippu nimetasin <b>automaagiks<\/b>: oleks ideaalne siseneda repozitoriumi, sisestada m\u00f5ni k\u00e4sk ja saada valmis pilt, koostatud arusaamisega, kuidas ja mida \u00f5igesti teha. Kuigi ma isiklikult ei ole kindel, et k\u00f5ik n\u00fcansid on v\u00f5imalik ette n\u00e4ha.<\/li>\n<\/ol>\n<p>\nJa siin on projektid:<\/p>\n<ul>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/moby\/buildkit\">moby\/buildkit<\/a><\/noindex> \u2014 ehitaja Docker Inc.\u2019ilt (juba integreeritud uusimatesse Docker'i versioonidesse), mis p\u00fc\u00fcab lahendada k\u00f5iki neid probleeme;<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/GoogleContainerTools\/kaniko\">kaniko<\/a><\/noindex> \u2014 Google'i ehitaja, mis v\u00f5imaldab ehitamist ilma Dockerita;<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/buildpacks.io\/\">Buildpacks.io<\/a><\/noindex> \u2014 CNCF katse teha automaagia ja eriti huvitav lahendus rebase'iga kihtide jaoks;<\/li>\n<li> ja veel hunnik muid utiliite, nagu <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/containers\/buildah\">buildah<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/genuinetools\/img\">genuinetools\/img<\/a><\/noindex>\u2026<\/li>\n<\/ul>\n<p>\n\u2026 ja vaadake, kui palju neil on t\u00e4hti GitHub'is. See t\u00e4hendab, et \u00fchelt poolt <code>docker build<\/code> on midagi olemas ja see v\u00f5ib midagi teha, kuid tegelikult <b>k\u00fcsimus ei ole l\u00f5puni lahendatud<\/b> \u2014 selle t\u00f5estuseks on alternatiivsete kogujate paralleelne areng, millest iga\u00fchel on oma osa probleemide lahendamisel.<\/p>\n<h2>Kogumine werfis<\/h2>\n<p>\nNii j\u00f5udsime <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\">werf<\/a><\/noindex> <i>(varem <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/333682\/\">kuulsa<\/a><\/noindex> nagu dapp)<\/i> \u2014 Open Source-\u0443\u0442\u0438\u043b\u0438\u0442\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u00ab\u0424\u043b\u0430\u043d\u0442\u00bb, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u0443\u0436\u0435 \u043c\u043d\u043e\u0433\u043e \u043b\u0435\u0442. \u041d\u0430\u0447\u0438\u043d\u0430\u043b\u043e\u0441\u044c \u0432\u0441\u0451 \u043b\u0435\u0442 5 \u043d\u0430\u0437\u0430\u0434 \u0441 Bash-\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u0441\u0431\u043e\u0440\u043a\u0443 Dockerfile&#8217;\u043e\u0432, \u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 3 \u0433\u043e\u0434\u0430 \u0432\u0435\u0434\u0451\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0430\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441\u043e \u0441\u0432\u043e\u0438\u043c Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u043c <i>(esialgu Ruby\u2019s, seej\u00e4rel <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/437044\/\">\u00fcmber kirjutatud<\/a><\/noindex> Go\u2019s, ja samal ajal ka \u00fcmber nimetatud)<\/i>. Millised kogumise k\u00fcsimused on werfis lahendatud?<\/p>\n<p><img decoding=\"async\" alt=\"werf \u2014 meie CI\/CD t\u00f6\u00f6riist Kubernetesis (\u00fclevaade ja videoettekanne)\" src=\"\/wp-content\/uploads\/2019\/08\/ab6aa8831b49977a419fd4cc3543eb83.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSinisega r\u00f5hutatud probleemid on juba lahendatud, paralleelne kogumine on teostatud \u00fche hosti raames, ning kollaselt esile t\u00f5stetud k\u00fcsimusi plaanime l\u00f5pule viia suve l\u00f5puks.<\/p>\n<h2>Avaldamise staadium registry\u2019s (publish)<\/h2>\n<p>\nOleme kogunud <code>docker push<\/code>\u2026 \u2014 mis v\u00f5ib olla keerulist pildi \u00fcleslaadimises registry\u2019s? Ja siis tekib k\u00fcsimus: \u201eMillise sildi peaks pildile panema?\u201d See tekib sellest, et meil on <b>Gitflow<\/b> (\u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f Git&#8217;\u0430) \u0438 Kubernetes, \u0430 \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u044f \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u0441\u044f \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0432 Kubernetes \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043b\u043e \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0432 Git. \u0412\u0435\u0434\u044c Git \u2014 \u043d\u0430\u0448 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043f\u0440\u0430\u0432\u0434\u044b.<\/p>\n<p>Mis selles nii keerulist on? <b>Kordineeritavuse tagamine<\/b>: alates Git'i commit'ist, mis on oma olemuselt muutumatu <i>(muutumatu)<\/i>, kuni Docker'i pildini, mis peab j\u00e4\u00e4ma samaks.<\/p>\n<p>Meile on samuti oluline <b>tuvastada p\u00e4ritolu<\/b>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0438\u0437 \u043a\u0430\u043a\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u0431\u044b\u043b\u043e \u0441\u043e\u0431\u0440\u0430\u043d\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0435 \u0432 Kubernetes (\u0442\u043e\u0433\u0434\u0430 \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c diff&#8217;\u044b \u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0432\u0435\u0449\u0438).<\/p>\n<h3>Siltimistaktikad<\/h3>\n<p>\nEsimene \u2014 see on lihtne <b>git tag<\/b>. Meil on registry pildiga, mis on sildistatud kui <code>1.0<\/code>. Kuberneteses on etapp ja tootmine, kuhu see pilt on v\u00e4lja t\u00f5mmatud. Git'is teeme commit'e ja mingil hetkel m\u00e4\u00e4rame sildi <code>2.0<\/code>. Kogume selle vastavalt repole ja paigutame registry'sse sildiga <code>2.0<\/code>. Rakendame etapis ja, kui k\u00f5ik l\u00e4heb h\u00e4sti, siis tootmisse.<\/p>\n<p><img decoding=\"async\" alt=\"werf \u2014 meie CI\/CD t\u00f6\u00f6riist Kubernetesis (\u00fclevaade ja videoettekanne)\" src=\"\/wp-content\/uploads\/2019\/08\/8545b84bfa63a91773f0d7dc1c2bd49f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSelle l\u00e4henemisviisi probleem on see, et me m\u00e4\u00e4rasime esmalt sildi, ja alles siis testisime ja rakendasime. Miks? Esiteks on see lihtsalt ebaoluline: me v\u00e4ljastame versiooni tarkvarast, mida pole isegi kontrollitud (me ei saa teisiti, kuna kontrollimiseks on vajalik silt paigaldada). Teiseks, see tee ei sobi Gitflow'ga.<\/p>\n<p>Teine variant \u2014 <b>git commit + tag<\/b>. Master harul on silt <code>1.0<\/code>; tema jaoks registry's \u2014 pilt, mis on juurutatud tootmisesse. Lisaks on Kubernetes-klastris preview ja staging kontuurid. J\u00e4tkame Gitflow'd: arenduspeamises (<code>develop<\/code>) loome uusi funktsioone, mille tulemuseks on kohalik commit, mille identifikaator on <code>#c1<\/code>. Me kogume selle kokku ja avaldame registry'sse, kasutades seda identifikaatorit (<code>#c1<\/code>). Sellega sama identifikaatoriga viime l\u00e4bi preview'e. Sarnasel viisil tegutseme commitidega <code>#c2<\/code> ja <code>#c3<\/code>.<\/p>\n<p>Kui oleme aru saanud, et funktsioon on piisav, hakkame k\u00f5ike stabiliseerima. Git'is loome haru <code>release_1.1<\/code> (baasil <code>#c3<\/code> kohast <code>develop<\/code>). Selle versiooni kogumine ei ole vajalik, kuna see on tehtud eelneval etapil. Seet\u00f5ttu saame lihtsalt selle staging'isse viia. Parandame vead <code>#c4<\/code> ja viime sarnasel viisil staging'isse. Samal ajal k\u00e4ib arendus <code>develop<\/code>, kuhu vaheldumisi tuuakse muudatusi <code>release_1.1<\/code>. Mingil hetkel saame kokku pandud ja staging'isse viidud commit', millega oleme rahul (<code>#c25<\/code>).<\/p>\n<p>\u0422\u043e\u0433\u0434\u0430 \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c merge (\u0441 fast-forward&#8217;\u043e\u043c) \u0440\u0435\u043b\u0438\u0437\u043d\u043e\u0439 \u0432\u0435\u0442\u043a\u0438 (<code>release_1.1<\/code>) masterisse. Paneme selle commit'i k\u00fclge uue versiooni sildi (<code>1.1<\/code>). Kuid see pilt on juba kogutud registry's, seega, et mitte uuesti seda koguda, lisame lihtsalt teise sildi olemasolevale pildile (n\u00fc\u00fcd on tal registry's sildid <code>#c25<\/code> ja <code>1.1<\/code>). P\u00e4rast seda l\u00e4hetame selle tootmisse.<\/p>\n<p>On puudus, et staging'is on laetud \u00fcks pilt (<code>#c25<\/code>), kuid tootmises on nagu teine (<code>1.1<\/code>), kuid me teame, et \u201ef\u00fc\u00fcsiliselt\u201d on see sama pilt registrist.<\/p>\n<p><img decoding=\"async\" alt=\"werf \u2014 meie CI\/CD t\u00f6\u00f6riist Kubernetesis (\u00fclevaade ja videoettekanne)\" src=\"\/wp-content\/uploads\/2019\/08\/b3fa2c34442aa401d1e7b30eb593be9a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u041d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0436\u0435 \u043c\u0438\u043d\u0443\u0441 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 merge commit&#8217;\u043e\u0432, \u043d\u0430\u0434\u043e \u0434\u0435\u043b\u0430\u0442\u044c fast-forward.<\/p>\n<p>Saame minna edasi ja teha triki\u2026 Vaatame lihtsa Dockerfile\u2019i n\u00e4idet:<\/p>\n<pre><code class=\"plaintext\">FROM ruby:2.3 as assets\nRUN mkdir -p \/app\nWORKDIR \/app\nCOPY . .\/\nRUN gem install bundler &amp;&amp; bundle install\nRUN bundle exec rake assets:precompile\nCMD bundle exec puma -C config\/puma.rb\n\nFROM nginx:alpine\nCOPY --from=assets \/app\/public \/usr\/share\/nginx\/www\/public<\/code><\/pre>\n<p>\nLoome sellest faili sellise printsiibi alusel, et v\u00f5tame:<\/p>\n<ul>\n<li> SHA256 kasutatavate piltide identifikaatoritest (<code>ruby:2.3<\/code> ja <code>nginx:alpine<\/code>), mis on nende sisu kontrollsummad;<\/li>\n<li> k\u00f5ik k\u00e4sud (<code>RUN<\/code>, <code>CMD<\/code> jne);<\/li>\n<li> SHA256 failidest, mis on lisatud.<\/li>\n<\/ul>\n<p>\n\u2026 ja v\u00f5tame uuesti kontrollsummana (SHA256) sellise faili. See <b>allkiri<\/b> k\u00f5igest, mis m\u00e4\u00e4rab Docker-pildi sisu.<\/p>\n<p><img decoding=\"async\" alt=\"werf \u2014 meie CI\/CD t\u00f6\u00f6riist Kubernetesis (\u00fclevaade ja videoettekanne)\" src=\"\/wp-content\/uploads\/2019\/08\/b2af0b7952eefe26ddbb145955e778e8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNaaseme skeemi juurde ja <b>kasutame selliste allkirjade asemel commit\u2019e,<\/b>st. m\u00e4rgistame pildid allkirjadega.<\/p>\n<p><img decoding=\"async\" alt=\"werf \u2014 meie CI\/CD t\u00f6\u00f6riist Kubernetesis (\u00fclevaade ja videoettekanne)\" src=\"\/wp-content\/uploads\/2019\/08\/115f290bd5951614c041b3d510fae38e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441&#8217;merge&#8217;\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u0437 \u0440\u0435\u043b\u0438\u0437\u0430 \u0432 master, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 merge commit: \u0443 \u043d\u0435\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u0440\u0443\u0433\u043e\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440, \u043d\u043e \u0442\u0430 \u0436\u0435 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430. \u0421 \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0432\u044b\u043a\u0430\u0442\u0438\u043c \u043e\u0431\u0440\u0430\u0437 \u0438 \u043d\u0430 production.<\/p>\n<p>Puuduseks on see, et n\u00fc\u00fcd ei ole v\u00f5imalik m\u00e4\u00e4rata, mis commit on tootmisse viidud \u2014 kontrollsummad toimivad ainult \u00fches suunas. See probleem lahendatakse t\u00e4iendava metadata kihiga \u2014 r\u00e4\u00e4gin sellest l\u00e4hemalt hiljem.<\/p>\n<h3>M\u00e4rgistamine werf'is<\/h3>\n<p>\nwerf'is oleme l\u00e4inud veelgi kaugemale ning valmistume nendele, kes ei hoia oma cache'i \u00fchel masinal, jaotatud ehitamiseks... Nii et meil on kahe t\u00fc\u00fcpi Docker'i pildid, mida nimetame <i>etapi<\/i> ja <i>pilt<\/i>.<\/p>\n<p>Git'i hoidlas werf on s\u00e4ilitatud spetsiifilised juhised ehitamiseks, mis kirjeldavad erinevaid ehitusetappe (<i>beforeInstall<\/i>, <i>install<\/i>, <i>beforeSetup<\/i>, <i>setup<\/i>). Esimene stage- pildistame kogume signatuuriga, mis on m\u00e4\u00e4ratletud kui esimeste sammude kontrollsummana. Seej\u00e4rel lisame l\u00e4htekoodi, uue stage-pildi jaoks arvutame ka selle kontrollsummat\u2026 Need toimingud korratakse k\u00f5igi etappide jaoks, mille tulemuseks on set stage-pilte. Siis loome l\u00f5pliku image-pildi, mis sisaldab ka tema p\u00e4ritolu metaandmeid. Ja just seda pilti me m\u00e4rgistame erinevate viisidega (detailid hiljem).<\/p>\n<p><img decoding=\"async\" alt=\"werf \u2014 meie CI\/CD t\u00f6\u00f6riist Kubernetesis (\u00fclevaade ja videoettekanne)\" src=\"\/wp-content\/uploads\/2019\/08\/22df8b6347b45be19ecb889c102b92b5.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOletame, et p\u00e4rast seda ilmub uus commit, kus on muudetud ainult rakenduse koodi. Mida juhtub? Koodi muudatuste jaoks luuakse patch, valmistatakse ette uus stage-pilt. Selle signatuur m\u00e4\u00e4ratakse kui vana stage-pildi ja uue pat\u0161i kontrollsumma. Sellest pildist kujundatakse uus l\u00f5plik image-pilt. Sarnane k\u00e4itumine toimub ka teistel etappidel.<\/p>\n<p>Seega, stage-pildid on cache, mida saab hoida hajutatult, ning neist loodud image-pildid laaditakse Docker Registry'sse.<\/p>\n<p><img decoding=\"async\" alt=\"werf \u2014 meie CI\/CD t\u00f6\u00f6riist Kubernetesis (\u00fclevaade ja videoettekanne)\" src=\"\/wp-content\/uploads\/2019\/08\/35805eca81605bd64c6910b7965b567e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Registry puhastamine<\/h3>\n<p>\nJutt on siiski pigem nende Docker'i siltide eemaldamisest, mis on j\u00e4\u00e4nud rippuma p\u00e4rast eemaldatud silte \u2014 see on Docker Registry standardne funktsioon. T\u00f5eliselt r\u00e4\u00e4gime olukorrast, kus koguneb palju Docker'i silte ja me m\u00f5istame, et osa neist pole enam vajalik, kuid nad v\u00f5tavad ruumi (ja\/v\u00f5i maksame selle eest).<\/p>\n<p>Millised on puhastamise strateegiad?<\/p>\n<ol>\n<li> V\u00f5ib lihtsalt mitte midagi teha <b>puhastada<\/b>. M\u00f5nikord on t\u00f5esti lihtsam veidi maksta liigse ruumi eest, kui proovida lahti harutada tohutut silti. Kuid see toimib ainult teatud hetkeni.<\/li>\n<li> <b>T\u00e4ielik l\u00e4htestamine<\/b>. Kui kustutada k\u00f5ik pildid ja koostada ainult ajakohased CI-s\u00fcsteemis, v\u00f5ib tekkida probleem. Kui tootmises konteiner k\u00e4ivitub, laaditakse sellele uus pilt \u2014 selline, mida pole keegi testinud. See h\u00e4vitab immutable infrastructure idee.<\/li>\n<li> <b>Sinine-roheline<\/b>. Kui \u00fcks registri hakkab \u00fcle voolama \u2014 laadige pildid teise. Sama probleem, mis eelmisel meetodil: millal on v\u00f5imalik puhastada see registreerimine, mis hakkas \u00fcle voolama?<\/li>\n<li> <b>Aja j\u00e4rgi<\/b>. Kustutada k\u00f5ik pildid, mis on vanemad kui 1 kuu? Kuid kindlasti on teenus, mis ei ole kuus uuendatud...<\/li>\n<li> <b>K\u00e4sitsi<\/b> m\u00e4\u00e4ratle, mida v\u00f5ib juba eemaldada.<\/li>\n<\/ol>\n<p>\n\u041f\u043e-\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c\u0443 \u0436\u0438\u0437\u043d\u0435\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0434\u0432\u0430: \u043d\u0435 \u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0438\u043b\u0438 \u0436\u0435 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f \u0438\u0437 blue-green + \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0440\u0435\u0447\u044c \u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c: \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u043f\u043e\u0440\u0430 \u043f\u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c registry, \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0435 \u043d\u043e\u0432\u044b\u0439 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0435 \u0432\u0441\u0435 \u043d\u043e\u0432\u044b\u0435 \u043e\u0431\u0440\u0430\u0437\u044b \u0432 \u043d\u0435\u0433\u043e \u043d\u0430 \u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u0435\u0441\u044f\u0446\u0430. \u0410 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0441\u044f\u0446 \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435, \u043a\u0430\u043a\u0438\u0435 pod&#8217;\u044b \u0432 Kubernetes \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u0442\u0430\u0440\u044b\u0439 registry, \u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u0435 \u0438\u0445 \u0442\u043e\u0436\u0435 \u0432 \u043d\u043e\u0432\u044b\u0439 registry.<\/p>\n<p>Kuhu me j\u00f5udsime <b>werf<\/b>? \u041c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c:<\/p>\n<ol>\n<li> Git head: \u0432\u0441\u0435 \u0442\u0435\u0433\u0438, \u0432\u0441\u0435 \u0432\u0435\u0442\u043a\u0438, \u2014 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044f, \u0447\u0442\u043e \u0432\u0441\u0451, \u0447\u0442\u043e \u043f\u0440\u043e\u0442\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0432 Git, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0438 \u0432 \u043e\u0431\u0440\u0430\u0437\u0430\u0445 (\u0430 \u0435\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u043d\u0430\u0434\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0432 \u0441\u0430\u043c\u043e\u043c Git&#8217;\u0435);<\/li>\n<li> \u0432\u0441\u0435 pod&#8217;\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u043a\u0430\u0447\u0435\u043d\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u0432 Kubernetes;<\/li>\n<li> \u0441\u0442\u0430\u0440\u044b\u0435 ReplicaSet&#8217;\u044b (\u0442\u043e, \u0447\u0442\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u044b\u043a\u0430\u0447\u0435\u043d\u043e), \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c Helm-\u0440\u0435\u043b\u0438\u0437\u044b \u0438 \u043e\u0442\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0437\u044b \u0442\u0430\u043c.<\/li>\n<\/ol>\n<p>\n\u2026 ja teeme sellest komplektist whitelist'i \u2014 nimekiri piltidest, mida me ei eemalda. K\u00f5ik muu puhastame, p\u00e4rast mida otsime \u00fcles orvud staatilised pildid ja eemaldame need ka.<\/p>\n<h2>Deploy-etapp<\/h2>\n<p><\/p>\n<h3>Usaldusv\u00e4\u00e4rne deklaratiivsuse tase<\/h3>\n<p>\nEsimene asi, millele tahaks t\u00e4helepanu p\u00f6\u00f6rata deploos, on uue ressursik \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430atia v\u00e4ljaandmine, mis on deklareeritud. Originaalne YAML-dokument Kubernetes-ressursside kirjeldamisega erineb alati oluliselt (tulemusest), mis tegelikult klastris t\u00f6\u00f6tab. Sest Kubernetes lisab konfiguratsioonile:<\/p>\n<ol>\n<li> tuvastajad;<\/li>\n<li> teenuste teavet;<\/li>\n<li> mitmeid vaikeseade v\u00e4\u00e4rtusi;<\/li>\n<li> osa praeguse oleku kohta;<\/li>\n<li> muudatused, mis on tehtud admission webhooki t\u00f6\u00f6 k\u00e4igus;<\/li>\n<li> eraldi juhtide (ja planeerija) t\u00f6\u00f6 tulemuse.<\/li>\n<\/ol>\n<p>\nSeet\u00f5ttu, kui ilmub uus ressursi konfiguratsioon (<i>uus<\/i>), ei saa me lihtsalt v\u00f5tta ja kirjutada selle \u00fcle praegust, \"elavat\" konfiguratsiooni (<i>live<\/i>). Selleks peame me v\u00f5rreldama <i>uus<\/i> eelmise rakendatud konfiguratsiooniga (<i>last-applied<\/i>) ja rakendama <i>live<\/i> saadud pat\u0161i.<\/p>\n<p>Seda l\u00e4henemist nimetatakse <b>2-way merge<\/b>. Seda kasutatakse n\u00e4iteks Helm'is.<\/p>\n<p>On ka <b>3-way merge<\/b>, mis erineb selle poolest, et:<\/p>\n<ul>\n<li> v\u00f5rreldes <i>last-applied<\/i> ja <i>uus<\/i>, vaatame, mis on eemaldatud;<\/li>\n<li> v\u00f5rreldes <i>uus<\/i> ja <i>live<\/i>, vaatame, mis on lisatud v\u00f5i muudetud;<\/li>\n<li> kumulatiivse pat\u0161i rakendame <i>live<\/i>.<\/li>\n<\/ul>\n<p>\n\u041c\u044b \u0434\u0435\u043f\u043b\u043e\u0438\u043c 1000+ \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0441 Helm, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0436\u0438\u0432\u0451\u043c \u0441 2-way merge. \u041e\u0434\u043d\u0430\u043a\u043e \u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0440\u044f\u0434 \u043f\u0440\u043e\u0431\u043b\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0441\u0432\u043e\u0438\u043c\u0438 \u043f\u0430\u0442\u0447\u0430\u043c\u0438, \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0449\u0438\u043c\u0438 Helm&#8217;\u0443 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<h3>T\u00f5eline v\u00e4ljalaske staatus<\/h3>\n<p>\nP\u00e4rast seda, kui meie CI-s\u00fcsteem on j\u00e4rjekordse s\u00fcndmuse t\u00f5ttu genereerinud uue konfiguratsiooni Kubernetes'e jaoks, edastab see selle rakendamiseks <i>(rakenda)<\/i> klastrisse \u2014 kasutades Helm'i v\u00f5i <code>kubectl apply<\/code>. Seej\u00e4rel toimub juba kirjeldatud N-way merge, milles Kubernetes API kiidab heaks CI-s\u00fcsteemi, ning see omakorda oma kasutaja.<\/p>\n<p><img decoding=\"async\" alt=\"werf \u2014 meie CI\/CD t\u00f6\u00f6riist Kubernetesis (\u00fclevaade ja videoettekanne)\" src=\"\/wp-content\/uploads\/2019\/08\/fcc8251525f32c913f30fbcdc4296198.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKuid probleem on suur: nimelt <b>edukas rakendamine ei t\u00e4henda eduka v\u00e4ljalaskmist.<\/b>. \u0415\u0441\u043b\u0438 Kubernetes \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u0437\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0434\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0435\u0433\u043e \u2014 \u043c\u044b \u0435\u0449\u0451 \u043d\u0435 \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0440\u0435\u0441\u0442\u0430\u0440\u0442 pod&#8217;\u043e\u0432 \u0432\u043e frontend&#8217;\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0439\u0442\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e, \u0430 \u0432 backend&#8217;\u0435 \u2014 \u043d\u0435\u0442, \u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u00d5ige tegemiseks on selles skeemis tarvis lisasilda \u2014 spetsiaalset j\u00e4lgijat, mis saaks Kubernetes API-lt teavet staatuse kohta ja edastada selle edasiseks anal\u00fc\u00fcsimiseks tegeliku seisundi osas. Oleme loonud Open Source'i teegi Go-s \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/kubedog\"><b>kubedog<\/b><\/a><\/noindex> <i>(vt selle teadaanne <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/434160\/\">siit<\/a><\/noindex>)<\/i>, \u2014 mis lahendab selle probleemi ja on integreeritud werf-i.<\/p>\n<p>Selle j\u00e4lgija k\u00e4itumist werf-i tasandil configureerimine toimub annotatsioonide abil, mis paigutatakse Deployment'itele v\u00f5i StatefulSets'ile. Peamine annotatsioon on <code>fail-mode<\/code> \u2014 m\u00f5istab j\u00e4rgmisi v\u00e4\u00e4rtusi:<\/p>\n<ul>\n<li> <code>IgnoreAndContinueDeployProcess<\/code> \u2014 ignoreerime selle komponendi v\u00e4ljalaskmisel esinevaid probleeme ja j\u00e4tkame juurutamist;<\/li>\n<li> <code>FailWholeDeployProcessImmediately<\/code> \u2014 selle komponendi viga peatab juurutamisprotsessi;<\/li>\n<li> <code>HopeUntilEndOfDeployProcess<\/code> \u2014 loodame, et see komponent t\u00f6\u00f6tab juurutamise l\u00f5puks.<\/li>\n<\/ul>\n<p>\nN\u00e4iteks selline kombinatsioon ressurssidest ja annotatsiooni v\u00e4\u00e4rtustest <code>fail-mode<\/code>:<\/p>\n<p><img decoding=\"async\" alt=\"werf \u2014 meie CI\/CD t\u00f6\u00f6riist Kubernetesis (\u00fclevaade ja videoettekanne)\" src=\"\/wp-content\/uploads\/2019\/08\/40e161710e8a535cd95f1eb66ca8407b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u041a\u043e\u0433\u0434\u0430 \u0434\u0435\u043f\u043b\u043e\u0438\u043c \u0432 \u043f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0437, \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 (MongoDB) \u0435\u0449\u0451 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u0430 \u2014 Deployment&#8217;\u044b \u0443\u043f\u0430\u0434\u0443\u0442. \u041d\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u043c\u043e\u043c\u0435\u043d\u0442\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0430\u0441\u044c, \u0438 \u0434\u0435\u043f\u043b\u043e\u0439 \u0432\u0441\u0451 \u0436\u0435 \u043f\u0440\u043e\u0439\u0434\u0451\u0442.<\/p>\n<p>Werfil on veel kaks annotatsiooni kubedogi jaoks:<\/p>\n<ul>\n<li> <code>failures-allowed-per-replica<\/code> \u2014 lubatud kukkumiste arv iga replikatsiooni kohta;<\/li>\n<li> <code>show-logs-until<\/code> \u2014 \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u0443\u0435\u0442 \u043c\u043e\u043c\u0435\u043d\u0442, \u0434\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e werf \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 (\u0432 stdout) \u043b\u043e\u0433\u0438 \u0438\u0437 \u0432\u0441\u0435\u0445 \u0432\u044b\u043a\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0445 pod&#8217;\u043e\u0432. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u044d\u0442\u043e <code>PodIsReady<\/code> (et ignoreerida teateid, mis meile t\u00f5en\u00e4oliselt ei ole vajalikud, kui pod'ile hakkab liiklus tulema), kuid lubatud on ka v\u00e4\u00e4rtused <code>ControllerIsReady<\/code> ja <code>EndOfDeploy<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Mida veel soovime juurutamiselt?<\/h3>\n<p>\nLisaks juba kirjeldatud kahele punktile soovime:<\/p>\n<ul>\n<li> n\u00e4ha <b>logisid<\/b> \u2014 ning ainult vajalikke, mitte k\u00f5iki j\u00e4rjestikku;<\/li>\n<li> j\u00e4lgida <b>edusamme<\/b>, kuna kui t\u00f6\u00f6 \u201evaikselt\u201c seiskub minutiteks, on oluline m\u00f5ista, mis seal toimub;<\/li>\n<li> omada <b>automaatset tagasip\u00f6\u00f6rdumist<\/b> juhtumiteks, kui midagi l\u00e4heb valesti (seet\u00f5ttu on kriitiliselt oluline teada t\u00f5elist staatust). K\u00e4ivitamine peab olema atomaarne: kas see toimub l\u00f5puni v\u00f5i k\u00f5ik naaseb eelnevasse olekusse.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Kokkuv\u00f5te<\/h2>\n<p>\nMeie ettev\u00f5ttele on nende k\u00f5igi aspektide teostamiseks tarnimise eri etappides (build, publish, deploy) piisav CI-s\u00fcsteem ja t\u00f6\u00f6riist <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\">werf<\/a><\/noindex>.<\/p>\n<p>Kokkuv\u00f5tteks:<\/p>\n<p><img decoding=\"async\" alt=\"werf \u2014 meie CI\/CD t\u00f6\u00f6riist Kubernetesis (\u00fclevaade ja videoettekanne)\" src=\"\/wp-content\/uploads\/2019\/08\/bafba54f2df8740a1a12c93b3476e49a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nT\u00e4nu werfile oleme suutnud h\u00e4sti edasi liikuda paljusid DevOps-inseneride probleeme lahendada ja oleme r\u00f5\u00f5msad, kui laiem kogukond v\u00e4hemalt proovib seda t\u00f6\u00f6riista. Hea tulemuse saavutamine koos on lihtsam.<\/p>\n<h2>Video ja slaidid<\/h2>\n<p>\nVideo ettekandest (~47 minutit):<\/p>\n<p><center><div class=\"youtube-placeholder\" data-id=\"cK3ackGUTLw\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/cK3ackGUTLw\/hqdefault.jpg\" alt=\"Vaata videot\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<p>Ettekande esitlus:<\/p>\n<p><center><iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"\/\/speakerdeck.com\/player\/2033277984c04900b18940588edf1161\" frameborder=\"0\" allowfullscreen><\/iframe><\/center><\/p>\n<h2>P.S.<\/h2>\n<p>\nTeised ettekanded Kubernetesest meie blogis:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/459326\/\">Automaatne skaala ja ressursside haldamine Kuberneteses<\/a><\/noindex>\u00bb <i>(Dmitri Stoljarov; 27. aprill 2019 \u00abStachkis\u00bb)<\/i>;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/449096\/\">Laiendame ja t\u00e4iendame Kuberneteset<\/a><\/noindex>\u00bb <i>(Andrei Polovov; 8. aprill 2019 Saint HighLoad++)<\/i>;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/431500\/\">Andmebaasid ja Kubernetes<\/a><\/noindex>\u00bb <i>(Dmitri Stolyarov; 8. november 2018 HighLoad++)<\/i>;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/412901\/\">J\u00e4lgimine ja Kubernetes<\/a><\/noindex>\u00bb <i>(Dmitri Stolyarov; 28. mai 2018 RootConf'is)<\/i>;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/345116\/\">Parimad CI\/CD praktikud Kubernetesega ja GitLabiga<\/a><\/noindex>\u00bb <i>(Dmitri Stolyarov; 7. november 2017 HighLoad++)<\/i>;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/331188\/\">Meie kogemus Kubernetesega v\u00e4ikestes projektides<\/a><\/noindex>\u00bb <i>(Dmitri Stolyarov; 6. juuni 2017 RootConf'il)<\/i>.<\/li>\n<\/ul>\n<p>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460351\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>27 \u043c\u0430\u044f \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u0437\u0430\u043b\u0435 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 DevOpsConf 2019, \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0435\u0439 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0444\u0435\u0441\u0442\u0438\u0432\u0430\u043b\u044f \u0420\u0418\u0422++ 2019, \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0441\u0435\u043a\u0446\u0438\u0438 \u00ab\u041d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u0430\u044f \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0430\u00bb, \u043f\u0440\u043e\u0437\u0432\u0443\u0447\u0430\u043b \u0434\u043e\u043a\u043b\u0430\u0434 \u00abwerf \u2014 \u043d\u0430\u0448 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f CI\/CD \u0432 Kubernetes\u00bb. \u0412 \u043d\u0451\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e \u0442\u0435\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0445 \u0438 \u0432\u044b\u0437\u043e\u0432\u0430\u0445, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u0438 \u0434\u0435\u043f\u043b\u043e\u0435 \u0432 Kubernetes, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e \u043d\u044e\u0430\u043d\u0441\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043c\u0435\u0442\u043d\u044b \u043d\u0435 \u0441\u0440\u0430\u0437\u0443. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":27531,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-36754","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"27 \u043c\u0430\u044f \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u0437\u0430\u043b\u0435 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 DevOpsConf 2019, \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0435\u0439 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0444\u0435\u0441\u0442\u0438\u0432\u0430\u043b\u044f \u0420\u0418\u0422++ 2019, \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0441\u0435\u043a\u0446\u0438\u0438 \u00ab\u041d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u0430\u044f \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0430\u00bb, \u043f\u0440\u043e\u0437\u0432\u0443\u0447\u0430\u043b \u0434\u043e\u043a\u043b\u0430\u0434 \u00abwerf \u2014 \u043d\u0430\u0448 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f CI\/CD \u0432 Kubernetes\u00bb. \u0412 \u043d\u0451\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e \u0442\u0435\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0445 \u0438 \u0432\u044b\u0437\u043e\u0432\u0430\u0445, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u0438 \u0434\u0435\u043f\u043b\u043e\u0435 \u0432 Kubernetes, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e \u043d\u044e\u0430\u043d\u0441\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043c\u0435\u0442\u043d\u044b \u043d\u0435 \u0441\u0440\u0430\u0437\u0443.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/werf-nash-instrument-dlya-ci-cd-v-kubernetes-obzor-i-video-doklada\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47werf \u2014 \u043d\u0430\u0448 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f CI\/CD \u0432 Kubernetes (\u043e\u0431\u0437\u043e\u0440 \u0438 \u0432\u0438\u0434\u0435\u043e \u0434\u043e\u043a\u043b\u0430\u0434\u0430) | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"27 \u043c\u0430\u044f \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u0437\u0430\u043b\u0435 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 DevOpsConf 2019, \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0435\u0439 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0444\u0435\u0441\u0442\u0438\u0432\u0430\u043b\u044f \u0420\u0418\u0422++ 2019, \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0441\u0435\u043a\u0446\u0438\u0438 \u00ab\u041d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u0430\u044f \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0430\u00bb, \u043f\u0440\u043e\u0437\u0432\u0443\u0447\u0430\u043b \u0434\u043e\u043a\u043b\u0430\u0434 \u00abwerf \u2014 \u043d\u0430\u0448 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f CI\/CD \u0432 Kubernetes\u00bb. \u0412 \u043d\u0451\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e \u0442\u0435\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0445 \u0438 \u0432\u044b\u0437\u043e\u0432\u0430\u0445, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u0438 \u0434\u0435\u043f\u043b\u043e\u0435 \u0432 Kubernetes, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e \u043d\u044e\u0430\u043d\u0441\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043c\u0435\u0442\u043d\u044b \u043d\u0435 \u0441\u0440\u0430\u0437\u0443.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/werf-nash-instrument-dlya-ci-cd-v-kubernetes-obzor-i-video-doklada\" \/>\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:13:37+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:13:37+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\udd47werf \u2014 meie t\u00f6\u00f6riist CI\/CD jaoks Kuberneteses (\u00fclevaade ja ettekande video) | ProHoster","description":"27. mai DevOpsConf 2019 peamisel saalis, mis toimub festivali RIT++ 2019 raames, sektsioonis \"J\u00e4tkuv tarnimine\", peeti ettekannet \"werf \u2014 meie t\u00f6\u00f6riist CI\/CD jaoks Kuberneteses\". Selles k\u00e4sitletakse probleeme ja v\u00e4ljakutseid, millega iga\u00fcks silmitsi seisab Kubernetesesse juurutades, samuti n\u00fcansse, mis v\u00f5ivad esialgu t\u00e4helepanuta j\u00e4\u00e4da.","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/werf-nash-instrument-dlya-ci-cd-v-kubernetes-obzor-i-video-doklada","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47werf \u2014 \u043d\u0430\u0448 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f CI\/CD \u0432 Kubernetes (\u043e\u0431\u0437\u043e\u0440 \u0438 \u0432\u0438\u0434\u0435\u043e \u0434\u043e\u043a\u043b\u0430\u0434\u0430) | ProHoster","og:description":"27 \u043c\u0430\u044f \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u0437\u0430\u043b\u0435 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 DevOpsConf 2019, \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0435\u0439 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0444\u0435\u0441\u0442\u0438\u0432\u0430\u043b\u044f \u0420\u0418\u0422++ 2019, \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0441\u0435\u043a\u0446\u0438\u0438 \u00ab\u041d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u0430\u044f \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0430\u00bb, \u043f\u0440\u043e\u0437\u0432\u0443\u0447\u0430\u043b \u0434\u043e\u043a\u043b\u0430\u0434 \u00abwerf \u2014 \u043d\u0430\u0448 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f CI\/CD \u0432 Kubernetes\u00bb. \u0412 \u043d\u0451\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e \u0442\u0435\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0445 \u0438 \u0432\u044b\u0437\u043e\u0432\u0430\u0445, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u0438 \u0434\u0435\u043f\u043b\u043e\u0435 \u0432 Kubernetes, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e \u043d\u044e\u0430\u043d\u0441\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043c\u0435\u0442\u043d\u044b \u043d\u0435 \u0441\u0440\u0430\u0437\u0443.","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/werf-nash-instrument-dlya-ci-cd-v-kubernetes-obzor-i-video-doklada","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:13:37+00:00","article:modified_time":"2019-10-31T19:13:37+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"36754","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 04:44:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:39:23","updated":"2026-01-22 04:44:19"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/36754","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=36754"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/36754\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/27531"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=36754"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=36754"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=36754"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}