{"id":35941,"date":"2019-10-31T22:07:41","date_gmt":"2019-10-31T19:07:41","guid":{"rendered":"https:\/\/prohoster.info\/blog\/chto-zhe-takoe-gitops\/"},"modified":"2019-10-31T22:07:41","modified_gmt":"2019-10-31T19:07:41","slug":"chto-zhe-takoe-gitops","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/chto-zhe-takoe-gitops","title":{"rendered":"Czym jest GitOps?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i><b>Przyp. t\u0142um.<\/b>: Po niedawnej publikacji <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/456754\/\">materia\u0142u<\/a><\/noindex> na temat metod pull i push w GitOps zauwa\u017cyli\u015bmy zainteresowanie tym modelem w og\u00f3le, jednak publikacji w j\u0119zyku rosyjskim na ten temat jest bardzo ma\u0142o (na habrze po prostu ich nie ma). Dlatego z przyjemno\u015bci\u0105 przedstawiamy Pa\u0144stwu t\u0142umaczenie innego artyku\u0142u \u2014 cho\u0107 sprzed prawie roku! \u2014 od firmy Weaveworks, kt\u00f3rej za\u0142o\u017cyciel wymy\u015bli\u0142 termin \u201eGitOps\u201d. W tek\u015bcie wyja\u015bniono istot\u0119 podej\u015bcia oraz kluczowe r\u00f3\u017cnice w por\u00f3wnaniu do istniej\u0105cych ju\u017c rozwi\u0105za\u0144.<\/i><\/p>\n<p>\nRok temu opublikowali\u015bmy <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-operations-by-pull-request\">wprowadzenie do GitOps<\/a><\/noindex>. Wtedy opowiedzieli\u015bmy, jak zesp\u00f3\u0142 Weaveworks uruchomi\u0142 SaaS oparty ca\u0142kowicie na Kubernetesie i opracowa\u0142 zestaw zalecanych najlepszych praktyk dotycz\u0105cych wdra\u017cania, zarz\u0105dzania i monitorowania w \u015brodowisku cloud native.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Artyku\u0142 cieszy\u0142 si\u0119 popularno\u015bci\u0105. Inni zacz\u0119li m\u00f3wi\u0107 o GitOps, publikowa\u0107 nowe narz\u0119dzia do <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/hasura\/gitkube\">git push<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/dzone.com\/articles\/weaveworks-gitops-developer-toolkit-part-one-skaff\">opracowywania<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/storing-secure-sealed-secrets-using-gitops\">sekret\u00f3w<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/blog.alexellis.io\/introducing-openfaas-cloud\/\">funkcji<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/jenkins.io\/blog\/2018\/03\/19\/introducing-jenkins-x\/\">ci\u0105g\u0142ej integracji<\/a><\/noindex> itp. Na naszej stronie pojawi\u0142o si\u0119 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/category\/gitops\/\">du\u017co tre\u015bci<\/a><\/noindex> i r\u00f3\u017cnych zastosowa\u0144 GitOps. Ale niekt\u00f3rzy wci\u0105\u017c mieli pytania. Czym model r\u00f3\u017cni si\u0119 od tradycyjnego <noindex><a rel=\"nofollow\" href=\"https:\/\/puppet.com\/blog\/a-deployment-pipeline-for-infrastructure-a-devops-case-study-at-nbn\">infrastructure as code<\/a><\/noindex> oraz ci\u0105g\u0142ego dostarczania (<noindex><a rel=\"nofollow\" href=\"https:\/\/puppet.com\/blog\/a-deployment-pipeline-for-infrastructure-a-devops-case-study-at-nbn\">continuous delivery<\/a><\/noindex>)? Czy konieczne jest u\u017cycie Kubernetesa?<\/p>\n<p>Wkr\u00f3tce zrozumieli\u015bmy, \u017ce potrzebne jest nowe opracowanie, oferuj\u0105ce:<\/p>\n<ol>\n<li> Du\u017c\u0105 ilo\u015b\u0107 przyk\u0142ad\u00f3w i historii;<\/li>\n<li> Konkretn\u0105 definicj\u0119 GitOps;<\/li>\n<li> Por\u00f3wnanie z tradycyjnym ci\u0105g\u0142ym dostarczaniem.<\/li>\n<\/ol>\n<p>\nW tym artykule starali\u015bmy si\u0119 om\u00f3wi\u0107 wszystkie te tematy. Znajdziesz w nim zaktualizowane wprowadzenie do GitOps oraz spojrzenie na nie z perspektywy programist\u00f3w i CI\/CD. Skupiamy si\u0119 g\u0142\u00f3wnie na Kubernetesie, chocia\u017c model mo\u017cna z \u0142atwo\u015bci\u0105 uog\u00f3lni\u0107.<\/p>\n<h2>Poznajcie: GitOps<\/h2>\n<p>\nWyobra\u017a sobie Alicj\u0119. Zarz\u0105dza firm\u0105 Family Insurance, oferuj\u0105c\u0105 polisy ubezpieczeniowe zdrowotne, samochodowe, na nieruchomo\u015bci oraz ubezpieczenia turystyczne dla os\u00f3b, kt\u00f3re s\u0105 zbyt zaj\u0119te, aby samodzielnie rozwi\u0105zywa\u0107 zawirowania zwi\u0105zane z umowami. Jej biznes rozpocz\u0105\u0142 si\u0119 jako projekt poboczny, kiedy Alicja pracowa\u0142a w banku jako data scientist. Pewnego dnia zda\u0142a sobie spraw\u0119, \u017ce mo\u017ce wykorzysta\u0107 zaawansowane algorytmy komputerowe do skuteczniejszej analizy danych i tworzenia pakiet\u00f3w ubezpieczeniowych. Inwestorzy sfinansowali projekt, a teraz jej firma generuje ponad 20 milion\u00f3w dolar\u00f3w rocznie i szybko si\u0119 rozwija. W tej chwili zatrudnia 180 os\u00f3b na r\u00f3\u017cnych stanowiskach. W\u015br\u00f3d nich znajduje si\u0119 zesp\u00f3\u0142 technologiczny, kt\u00f3ry zajmuje si\u0119 tworzeniem, utrzymywaniem strony internetowej, bazy danych oraz analiz\u0105 bazy klient\u00f3w. Zesp\u00f3\u0142 sk\u0142adaj\u0105cy si\u0119 z 60 os\u00f3b prowadzi Bob \u2013 dyrektor techniczny firmy.<\/p>\n<p>Zesp\u00f3\u0142 Boba wdra\u017ca systemy produkcyjne w chmurze. Ich g\u0142\u00f3wne aplikacje dzia\u0142aj\u0105 na GKE, korzystaj\u0105c z zalet Kubernetes w Google Cloud. Ponadto wykorzystuj\u0105 r\u00f3\u017cne narz\u0119dzia do pracy z danymi i analityki.<\/p>\n<p>Family Insurance nie planowa\u0142a korzysta\u0107 z kontener\u00f3w, ale zara\u017cono si\u0119 entuzjazmem wok\u00f3\u0142 Dockera. Wkr\u00f3tce specjali\u015bci firmy odkryli, \u017ce GKE umo\u017cliwia \u0142atwe i przyjemne uruchamianie klastr\u00f3w do testowania nowych funkcji. Dodano Jenkins do CI i Quay do organizacji rejestru kontener\u00f3w, napisano skrypty dla Jenkinsa, kt\u00f3re push\u2019owa\u0142y nowe kontenery i konfiguracje do GKE.<\/p>\n<p>Min\u0119\u0142o troch\u0119 czasu. Alicja i Bob rozczarowali si\u0119 wydajno\u015bci\u0105 wybranego podej\u015bcia i jego wp\u0142ywem na biznes. Wdro\u017cenie kontener\u00f3w nie poprawi\u0142o wydajno\u015bci tak bardzo, jak liczy\u0142a dru\u017cyna. Czasami deploymenty si\u0119 psu\u0142y, a nie by\u0142o jasne, czy to zmiany w kodzie by\u0142y winne. Okaza\u0142o si\u0119 te\u017c trudno \u015bledzi\u0107 zmiany w konfiguracjach. Cz\u0119sto trzeba by\u0142o tworzy\u0107 nowy klaster i przenosi\u0107 do niego aplikacje, poniewa\u017c w ten spos\u00f3b naj\u0142atwiej by\u0142o uporz\u0105dkowa\u0107 ba\u0142agan, w jaki zamieni\u0142 si\u0119 system. Alicja obawia\u0142a si\u0119, \u017ce sytuacja pogorszy si\u0119 w miar\u0119 rozwoju aplikacji (poza tym powstawa\u0142 nowy projekt oparty na uczeniu maszynowym). Bob zautomatyzowa\u0142 wi\u0119kszo\u015b\u0107 pracy i nie rozumia\u0142, dlaczego pipeline nadal jest niestabilny, \u017ale si\u0119 skaluje i okresowo wymaga r\u0119cznej interwencji?<\/p>\n<p><b>Nast\u0119pnie dowiedzieli si\u0119 o GitOps. To rozwi\u0105zanie okaza\u0142o si\u0119 dok\u0142adnie tym, czego potrzebowali, aby pewnie i\u015b\u0107 naprz\u00f3d.<\/b><\/p>\n<p>Alicja i Bob s\u0142yszeli o procesach opartych na Gicie, DevOps oraz infrastructure as code od wielu lat. Unikalno\u015b\u0107 GitOps polega na tym, \u017ce wprowadza on szereg najlepszych praktyk \u2014 kategorycznych i normatywnych \u2014 dotycz\u0105cych wdra\u017cania tych idei w kontek\u015bcie Kubernetes. Ten temat <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/search?q=gitops&amp;src=typd\">by\u0142 wielokrotnie poruszany<\/a><\/noindex>, w tym w <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-high-velocity-cicd-for-kubernetes\">blogu Weaveworks<\/a><\/noindex>.<\/p>\n<p>Family Insurance postanawia wdro\u017cy\u0107 GitOps. Teraz firma ma zautomatyzowany model operacyjny, kompatybilny z Kubernetes, kt\u00f3ry \u0142\u0105czy <i>szybko\u015b\u0107<\/i> z <i>stabilno\u015bci\u0105<\/i>, poniewa\u017c:<\/p>\n<ul>\n<li> okaza\u0142o si\u0119, \u017ce wydajno\u015b\u0107 zespo\u0142u wzros\u0142a dwukrotnie i nikt nie wpada w sza\u0142;<\/li>\n<li> zaprzestali utrzymywania skrypt\u00f3w. Zamiast tego mog\u0105 teraz skupi\u0107 si\u0119 na nowych funkcjach i doskonali\u0107 metody in\u017cynieryjne \u2014 na przyk\u0142ad wdro\u017cy\u0107 wypuszczenia kanaryjskie i poprawi\u0107 testowanie;<\/li>\n<li> udoskonalili proces wdra\u017cania \u2014 w tej chwili rzadko si\u0119 psuje;<\/li>\n<li> uzyskali mo\u017cliwo\u015b\u0107 przywracania deployment\u00f3w po cz\u0119\u015bciowych awariach bez interwencji r\u0119cznej;<\/li>\n<li> zyskali<i>wi\u0119ksz\u0105<\/i>wi\u0119ksz\u0105 pewno\u015b\u0107 w systemach dostaw. Alicja i Bob odkryli, \u017ce mog\u0105 podzieli\u0107 zesp\u00f3\u0142 na grupy zajmuj\u0105ce si\u0119 mikrous\u0142ugami i pracuj\u0105ce r\u00f3wnolegle;<\/li>\n<li> mog\u0105 wprowadza\u0107 od 30 do 50 zmian w projekcie ka\u017cdego dnia dzi\u0119ki wysi\u0142kom ka\u017cdej grupy i pr\u00f3bowa\u0107 nowych technik;<\/li>\n<li> \u0142atwo anga\u017cuj\u0105 nowych programist\u00f3w do projektu, kt\u00f3rzy maj\u0105 mo\u017cliwo\u015b\u0107 wdra\u017cania aktualizacji na produkcj\u0119 za pomoc\u0105 pull request\u00f3w ju\u017c w ci\u0105gu kilku godzin;<\/li>\n<li> \u0142atwo przechodz\u0105 audyt w ramach SOC2 <i>(na zgodno\u015b\u0107 dostawc\u00f3w us\u0142ug z wymaganiami dotycz\u0105cymi bezpiecznego zarz\u0105dzania danymi; wi\u0119cej informacji mo\u017cna znale\u017a\u0107 na przyk\u0142ad <noindex><a rel=\"nofollow\" href=\"https:\/\/www.imperva.com\/learn\/data-security\/soc-2-compliance\/\">tutaj<\/a><\/noindex> \u2014 przyp. t\u0142um.)<\/i>.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Co si\u0119 sta\u0142o?<\/h3>\n<p>\nGitOps \u2014 to dwie rzeczy:<\/p>\n<ol>\n<li> Model eksploatacji dla Kubernetes i cloud native. Oferuje zbi\u00f3r najlepszych praktyk do wdra\u017cania, zarz\u0105dzania i monitorowania skojarzonych w kontenerach klastr\u00f3w i aplikacji. Eleganck\u0105 definicj\u0105 jest <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/vitorsilva\/status\/999978906903080961\">jedna slajd<\/a><\/noindex> od <noindex><a rel=\"nofollow\" href=\"https:\/\/2018.agilept.org\/speaker_luis_faceira.html\">Luis Faceira<\/a><\/noindex>:\n<\/li>\n<li> \u015acie\u017cka do stworzenia \u015brodowiska zorientowanego na programist\u00f3w do zarz\u0105dzania aplikacjami. Stosujemy workflow Git zar\u00f3wno do eksploatacji, jak i do rozwoju. Zauwa\u017c, \u017ce nie chodzi tylko o Git push, ale o organizacj\u0119 ca\u0142ego zestawu narz\u0119dzi CI\/CD oraz UI\/UX.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Kilka s\u0142\u00f3w o Git<\/h3>\n<p>\nJe\u015bli nie znasz system\u00f3w kontroli wersji i opartego na Gicie workflow, zdecydowanie zalecamy ich poznanie. Na pocz\u0105tku praca z ga\u0142\u0119ziami i pull requestami mo\u017ce wydawa\u0107 si\u0119 czarn\u0105 magi\u0105, ale korzy\u015bci przewy\u017cszaj\u0105 w\u0142o\u017cony wysi\u0142ek. Oto <noindex><a rel=\"nofollow\" href=\"https:\/\/codeburst.io\/trunk-based-development-vs-git-flow-a0212a6cae64\">dobry artyku\u0142<\/a><\/noindex> na pocz\u0105tek.<\/p>\n<h2>Jak dzia\u0142a Kubernetes<\/h2>\n<p>\nW naszej historii, Alice i Bob zwr\u00f3cili si\u0119 do GitOps, pracuj\u0105c przez pewien czas z Kubernetes. Rzeczywi\u015bcie, GitOps jest \u015bci\u015ble zwi\u0105zane z Kubernetes \u2014 to model eksploatacji dla infrastruktury i aplikacji opartych na Kubernetes.<\/p>\n<h3>Co Kubernetes oferuje u\u017cytkownikom?<\/h3>\n<p>\nOto niekt\u00f3re z kluczowych mo\u017cliwo\u015bci:<\/p>\n<ol>\n<li> W modelu Kubernetes wszystko mo\u017cna opisa\u0107 w formie deklaratywnej.<\/li>\n<li> Serwer API Kubernetes przyjmuje takie deklaracje jako dane wej\u015bciowe, a nast\u0119pnie nieustannie stara si\u0119 doprowadzi\u0107 klaster do stanu opisanego w deklaracji.<\/li>\n<li> Deklaracje s\u0105 wystarczaj\u0105ce do opisu i zarz\u0105dzania szerokim zakresem obci\u0105\u017ce\u0144 roboczych \u2014 \"aplikacji\".<\/li>\n<li> W rezultacie, wprowadzanie zmian w aplikacji i klastrze nast\u0119puje z powodu:\n<ul>\n<li> zmian w obrazach kontener\u00f3w;<\/li>\n<li> zmian w deklaratywnej specyfikacji;<\/li>\n<li> b\u0142\u0119d\u00f3w w \u015brodowisku \u2014 na przyk\u0142ad, awarii kontener\u00f3w.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><\/p>\n<h3>Wspania\u0142e mo\u017cliwo\u015bci konwergencji Kubernetes<\/h3>\n<p>\nGdy administrator wprowadza zmiany w konfiguracji, orkiestrator Kubernetes b\u0119dzie stosowa\u0107 je do klastra, a\u017c jego stan <i>zblizy si\u0119 do nowej konfiguracji.<\/i>. Ten model dzia\u0142a dla ka\u017cdego zasobu Kubernetes i mo\u017cna go rozszerza\u0107 za pomoc\u0105 niestandardowych definicji zasob\u00f3w (CRD). Dlatego deploymenty Kubernetes maj\u0105 nast\u0119puj\u0105ce wspania\u0142e cechy:<\/p>\n<ul>\n<li> <b>Automatyzacja<\/b>: aktualizacje Kubernetes zapewniaj\u0105 mechanizm do automatyzacji procesu wprowadzania zmian poprawnie i na czas.<\/li>\n<li> <b>Konwergencja<\/b>: Kubernetes b\u0119dzie kontynuowa\u0107 pr\u00f3by aktualizacji a\u017c do osi\u0105gni\u0119cia sukcesu.<\/li>\n<li> <b>Idempotencja<\/b>: wielokrotne zastosowania konwergencji prowadz\u0105 do tego samego wyniku.<\/li>\n<li> <b>Deterministyczno\u015b\u0107<\/b>: przy wystarczaj\u0105cych zasobach stan zaktualizowanego klastra zale\u017cy tylko od \u017c\u0105danego stanu.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Jak dzia\u0142a GitOps<\/h2>\n<p>\nWystarczaj\u0105co du\u017co dowiedzieli\u015bmy si\u0119 o Kubernetes, aby wyja\u015bni\u0107 zasady dzia\u0142ania GitOps.<\/p>\n<p>Wracaj\u0105c do zespo\u0142\u00f3w Family Insurance zwi\u0105zanych z mikrous\u0142ugami. Czym si\u0119 zazwyczaj zajmuj\u0105? Zobacz list\u0119 poni\u017cej (je\u015bli jakie\u015b punkty wydaj\u0105 si\u0119 dziwne lub niezrozumia\u0142e \u2014 prosimy o wstrzymanie si\u0119 z krytyk\u0105 i pozostanie z nami). To tylko przyk\u0142ady proces\u00f3w roboczych opartych na Jenkins. Istnieje wiele innych proces\u00f3w przy pracy z innymi narz\u0119dziami.<\/p>\n<p>Najwa\u017cniejsze \u2014 widzimy, \u017ce ka\u017cda aktualizacja ko\u0144czy si\u0119 wprowadzeniem zmian w plikach konfiguracyjnych i repozytoriach Git. Te zmiany w Git prowadz\u0105 do tego, \u017ce \u201eoperator GitOps\u201d aktualizuje klaster:<\/p>\n<p>1. Proces roboczy: \u201e<i>Build Jenkins \u2014 branch master<\/i>\u00bb.<br \/>\nLista zada\u0144:<\/p>\n<ul>\n<li> Jenkins push\u2019uje tagowane obrazy do Quay;<\/li>\n<li> Jenkins push\u2019uje konfiguracj\u0119 i Helm-charty do koszyka master-storage;<\/li>\n<li> Funkcja w chmurze kopiuje konfiguracj\u0119 i chart do repozytorium Git master;<\/li>\n<li> Operator GitOps aktualizuje klaster.<\/li>\n<\/ul>\n<p>\n2. <i>Build Jenkins \u2014 branch release lub hotfix<\/i>:<\/p>\n<ul>\n<li> Jenkins push\u2019uje nieznakowane obrazy do Quay;<\/li>\n<li> Jenkins push\u2019uje konfiguracj\u0119 i Helm-charty do koszyka staging-storage;<\/li>\n<li> Funkcja w chmurze kopiuje konfiguracj\u0119 i chart do repozytorium Git staging;<\/li>\n<li> Operator GitOps aktualizuje klaster.<\/li>\n<\/ul>\n<p>\n3. <i>Build Jenkins \u2014 branch develop lub feature<\/i>:<\/p>\n<ul>\n<li> Jenkins push\u2019uje nieznakowane obrazy do Quay;<\/li>\n<li> Jenkins push\u2019uje konfiguracj\u0119 i Helm-charty do koszyka develop-storage;<\/li>\n<li> Funkcja w chmurze kopiuje konfiguracj\u0119 i chart do repozytorium Git develop;<\/li>\n<li>Operator GitOps aktualizuje klaster.<\/li>\n<\/ul>\n<p>\n4. <i>Dodanie nowego klienta<\/i>:<\/p>\n<ul>\n<li> Menad\u017cer lub administrator (LCM\/ops) wywo\u0142uje Gradle do pocz\u0105tkowego wdro\u017cenia i konfiguracji balansuj\u0105cych obci\u0105\u017cenie (NLB);<\/li>\n<li> LCM\/ops zatwierdza now\u0105 konfiguracj\u0119 w celu przygotowania deploymentu do aktualizacji;<\/li>\n<li> Operator GitOps aktualizuje klaster.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Kr\u00f3tki opis GitOps<\/h3>\n<p><\/p>\n<ol>\n<li> Opisz po\u017c\u0105dany stan ca\u0142ego systemu, u\u017cywaj\u0105c specyfikacji deklaratywnych dla ka\u017cdego \u015brodowiska (w naszej historii zesp\u00f3\u0142 Boba definiuje ca\u0142\u0105 konfiguracj\u0119 systemu w Git).\n<ul>\n<li> Repozytorium Git jest jedynym \u017ar\u00f3d\u0142em prawdy w odniesieniu do po\u017c\u0105danego stanu ca\u0142ego systemu.<\/li>\n<li> Wszystkie zmiany w po\u017c\u0105danym stanie dokonuje si\u0119 poprzez commity w Git.<\/li>\n<li> Wszystkie po\u017c\u0105dane parametry klastra s\u0105 r\u00f3wnie\u017c obserwowalne w samym klastrze. W ten spos\u00f3b mo\u017cemy okre\u015bli\u0107, czy stany po\u017c\u0105dane i obserwowane odpowiadaj\u0105 sobie (konwerguj\u0105, <i>converge<\/i>) czy r\u00f3\u017cni\u0105 si\u0119 (dywerguj\u0105, <i>diverge<\/i>) od siebie.<\/li>\n<\/ul>\n<\/li>\n<li> Je\u017celi stany po\u017c\u0105dany i obserwowany r\u00f3\u017cni\u0105 si\u0119, to:\n<ul>\n<li> Istnieje mechanizm konwergencji, kt\u00f3ry pr\u0119dzej czy p\u00f3\u017aniej automatycznie synchronizuje stan docelowy i obserwowany. W obr\u0119bie klastra zajmuje si\u0119 tym Kubernetes.<\/li>\n<li> Proces uruchamia si\u0119 niezw\u0142ocznie z powiadomieniem \u201ezmiana zatwierdzona\u201d.<\/li>\n<li> Po pewnym konfigurowalnym czasie mo\u017ce zosta\u0107 wys\u0142ane powiadomienie \u201ediff\u201d, je\u015bli stany r\u00f3\u017cni\u0105 si\u0119.<\/li>\n<\/ul>\n<\/li>\n<li> W ten spos\u00f3b wszystkie commity w Git powoduj\u0105 sprawdzalne i idempotentne aktualizacje w klastrze.\n<ul>\n<li>Rollback to konwergencja do wcze\u015bniej po\u017c\u0105danego stanu.<\/li>\n<\/ul>\n<\/li>\n<li> Konwergencja jest ostateczna. O jej wyst\u0105pieniu \u015bwiadcz\u0105:\n<ul>\n<li> Brak powiadomie\u0144 \u201ediff\u201d przez okre\u015blony czas.<\/li>\n<li> Powiadomienie \u201ekonwergentny\u201d (np. webhook, zdarzenie Git writeback).<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><\/p>\n<h3>Czym jest dywergencja?<\/h3>\n<p>\nPowt\u00f3rzmy jeszcze raz: <i>wszystkie po\u017c\u0105dane w\u0142a\u015bciwo\u015bci klastra musz\u0105 by\u0107 obserwowalne w samym klastrze<\/i>.<\/p>\n<p>Kilka przyk\u0142ad\u00f3w dywergencji:<\/p>\n<ul>\n<li> Zmiana w pliku konfiguracyjnym z powodu scalania ga\u0142\u0119zi w Git.<\/li>\n<li> Zmiana w pliku konfiguracyjnym z powodu commita w Git, wykonanego przez klienta GUI.<\/li>\n<li> Wiele zmian w po\u017c\u0105danym stanie z powodu PR w Git, z p\u00f3\u017aniejszym budowaniem obrazu kontenera i zmianami w konfiguracji.<\/li>\n<li> Zmiana stanu klastra z powodu b\u0142\u0119du, konfliktu zasob\u00f3w prowadz\u0105cego do \u201ez\u0142ego zachowania\u201d, lub po prostu przypadkowego odchylenia od pierwotnego stanu.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Co stanowi mechanizm konwergencji?<\/h3>\n<p>\nKilka przyk\u0142ad\u00f3w:<\/p>\n<ul>\n<li> W przypadku kontener\u00f3w i klastr\u00f3w mechanizm konwergencji zapewnia Kubernetes.<\/li>\n<li> Ten sam mechanizm mo\u017cna u\u017cy\u0107 do zarz\u0105dzania aplikacjami i strukturami opartymi na Kubernetes (np. Istio i Kubeflow).<\/li>\n<li> Mechanizm do zarz\u0105dzania wsp\u00f3\u0142prac\u0105 robocz\u0105 mi\u0119dzy Kubernetes, repozytoriami obraz\u00f3w a Gitem dostarcza <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/weaveworks\/flux\">operator GitOps Weave Flux<\/a><\/noindex>, b\u0119d\u0105cy cz\u0119\u015bci\u0105 <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.weave.works\/\">Weave Cloud<\/a><\/noindex>.<\/li>\n<li> Dla podstawowych maszyn mechanizm konwergencji musi by\u0107 deklaratywny i autonomiczny. Z w\u0142asnego do\u015bwiadczenia mo\u017cemy powiedzie\u0107, \u017ce <noindex><a rel=\"nofollow\" href=\"https:\/\/blog.gruntwork.io\/why-we-use-terraform-and-not-chef-puppet-ansible-saltstack-or-cloudformation-7989dad2865c\">Terraform<\/a><\/noindex> jest najbli\u017cszy tej definicji, jednak wci\u0105\u017c wymaga kontroli cz\u0142owieka. W tym sensie GitOps rozwija tradycje Infrastructure as Code.<\/li>\n<\/ul>\n<p>\nGitOps \u0142\u0105czy Git z doskona\u0142ym mechanizmem konwergencji Kubernetes, oferuj\u0105c model eksploatacji.<\/p>\n<p>GitOps pozwala nam stwierdzi\u0107: <i>automatyzacji i kontroli podlegaj\u0105 tylko te systemy, kt\u00f3re mo\u017cna opisa\u0107 i monitorowa\u0107<\/i>.<\/p>\n<h3>GitOps jest przeznaczony dla ca\u0142ego stacka cloud native (np. Terraform itp.)<\/h3>\n<p>\nGitOps to nie tylko Kubernetes. Chcemy, aby ca\u0142y system by\u0142 zarz\u0105dzany deklaratywnie i wykorzystywa\u0142 konwergencj\u0119. Pod ca\u0142ym systemem rozumiemy zbi\u00f3r \u015brodowisk dzia\u0142aj\u0105cych z Kubernetes \u2014 na przyk\u0142ad \u201edev cluster 1\u201d, \u201eproduction\u201d itd. W ka\u017cde \u015brodowisko wchodz\u0105 maszyny, klastry, aplikacje oraz interfejsy dla zewn\u0119trznych us\u0142ug dostarczaj\u0105cych dane, monitoring itd.<\/p>\n<p>Zauwa\u017c, jak wa\u017cny w tej kwestii jest Terraform dla problemu bootstrappingu. Kubernetes musi by\u0107 gdzie\u015b wdro\u017cony, a u\u017cycie Terraform oznacza, \u017ce mo\u017cemy zastosowa\u0107 te same procesy GitOps do stworzenia warstwy zarz\u0105dzaj\u0105cej, le\u017c\u0105cej u podstaw Kubernetes i aplikacji. To praktyka, kt\u00f3ra przynosi korzy\u015bci.<\/p>\n<p>Du\u017c\u0105 uwag\u0119 po\u015bwi\u0119ca si\u0119 zastosowaniu koncept\u00f3w GitOps do warstw nad Kubernetes. Jak na razie istniej\u0105 rozwi\u0105zania typu GitOps dla Istio, Helm, Ksonnet, OpenFaaS i Kubeflow, a tak\u017ce na przyk\u0142ad Pulumi, kt\u00f3re tworz\u0105 warstw\u0119 do rozwoju aplikacji pod cloud native.<\/p>\n<h2>Kubernetes CI\/CD: por\u00f3wnanie GitOps z innymi podej\u015bciami<\/h2>\n<p>\nJak ju\u017c wspomniano, GitOps to dwie rzeczy:<\/p>\n<ol>\n<li> Model eksploatacji dla Kubernetes i cloud native, jak opisano powy\u017cej.<\/li>\n<li> Droga do organizacji zorientowanej na deweloper\u00f3w w zarz\u0105dzaniu aplikacjami.<\/li>\n<\/ol>\n<p>\nDla wielu GitOps to przede wszystkim proces oparty na pushach Git. Nam to te\u017c si\u0119 podoba. Ale to nie wszystko: przyjrzyjmy si\u0119 teraz potokom CI\/CD.<\/p>\n<h3>GitOps zapewnia ci\u0105g\u0142e wdra\u017canie (CD) pod Kubernetes<\/h3>\n<p>\nGitOps oferuje mechanizm ci\u0105g\u0142ego wdra\u017cania, eliminuj\u0105cy potrzeb\u0119 poszczeg\u00f3lnych \u201esystem\u00f3w zarz\u0105dzania wdro\u017ceniami\u201d. Ca\u0142\u0105 prac\u0119 wykonuje za was Kubernetes.<\/p>\n<ul>\n<li> Aktualizacja aplikacji wymaga aktualizacji w Gicie. Jest to transakcyjna aktualizacja do po\u017c\u0105danego stanu. \"Wdro\u017cenie\" nast\u0119pnie realizowane jest w klastrze przez sam Kubernetes na podstawie zaktualizowanego opisu.<\/li>\n<li> Ze wzgl\u0119du na specyfik\u0119 dzia\u0142ania Kubernetes, te aktualizacje s\u0105 zbie\u017cne. Zapewnia to mechanizm ci\u0105g\u0142ego wdra\u017cania, w kt\u00f3rym wszystkie aktualizacje s\u0105 atomowe.<\/li>\n<li> Uwaga: <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.weave.works\/\">Weave Cloud<\/a><\/noindex> oferuje operatora GitOps, integruj\u0105cego Git i Kubernetes, kt\u00f3ry pozwala na realizacj\u0119 CD poprzez por\u00f3wnanie po\u017c\u0105danych i bie\u017c\u0105cych stan\u00f3w klastra.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Bez kubectl i skrypt\u00f3w<\/h3>\n<p>\nNale\u017cy unika\u0107 u\u017cywania kubectl do aktualizacji klastra, a zw\u0142aszcza skrypt\u00f3w do grupowania polece\u0144 kubectl. Zamiast tego, przy u\u017cyciu pipeline'a GitOps u\u017cytkownik mo\u017ce zaktualizowa\u0107 sw\u00f3j klaster Kubernetes poprzez Git.<\/p>\n<p>Zalety obejmuj\u0105:<\/p>\n<ol>\n<li> <b>Poprawno\u015b\u0107<\/b>. Grup\u0119 aktualizacji mo\u017cna zastosowa\u0107, zbiega\u0107 i w ko\u0144cu zweryfikowa\u0107, co przybli\u017ca nas do celu atomowego wdra\u017cania. Przeciwnie, u\u017cycie skrypt\u00f3w nie daje \u017cadnych gwarancji zbie\u017cno\u015bci (wi\u0119cej o tym poni\u017cej).<\/li>\n<li> <b>Bezpiecze\u0144stwo<\/b>. <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/kelseyhightower\/status\/939003832805179392?lang=en\">Cytuj\u0105c<\/a><\/noindex> Kelsey Hightower: \u201eOgranicz dost\u0119p do klastra Kubernetes narz\u0119dziom automatyzacji oraz administratorom, kt\u00f3rych obowi\u0105zkiem jest jego debugowanie lub utrzymanie sprawno\u015bci\u201d. Zobacz tak\u017ce <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-compliance-and-secure-cicd\">moj\u0105 publikacj\u0119<\/a><\/noindex> na temat bezpiecze\u0144stwa i zgodno\u015bci z wymaganiami technicznymi, oraz <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/@vesirin\/how-i-gained-commit-access-to-homebrew-in-30-minutes-2ae314df03ab\">artyku\u0142 o wy\u0142amaniu si\u0119 z Homebrew<\/a><\/noindex> poprzez kradzie\u017c danych logowania z niedbale skonstruowanego skryptu Jenkins.<\/li>\n<li> <b>Do\u015bwiadczenie u\u017cytkownika<\/b>. Kubectl ujawnia mechanizm modelu obiektowego Kubernetes, kt\u00f3ry jest do\u015b\u0107 skomplikowany. W idealnym przypadku u\u017cytkownicy powinni interaktywowa\u0107 z systemem na wy\u017cszym poziomie abstrakcji. Ponownie odwo\u0142am si\u0119 do Kelsey i polecam zapozna\u0107 si\u0119 z <noindex><a rel=\"nofollow\" href=\"http:\/\/superuser.openstack.org\/articles\/kubernetes-boring\/\">takim podsumowaniem<\/a><\/noindex>.<\/li>\n<\/ol>\n<p><\/p>\n<h3>R\u00f3\u017cnica mi\u0119dzy CI a CD<\/h3>\n<p>\nGitOps poprawia istniej\u0105ce modele CI\/CD.<\/p>\n<p>Nowoczesny serwer CI to narz\u0119dzie do orkiestracji. W szczeg\u00f3lno\u015bci jest to narz\u0119dzie do orkiestracji potok\u00f3w CI. Obejmuj\u0105 one budow\u0119, testowanie, scalanie do ga\u0142\u0119zi itp. Serwery CI automatyzuj\u0105 zarz\u0105dzanie z\u0142o\u017conymi, wieloetapowymi potokami. Powszechn\u0105 pokus\u0105 jest stworzenie skryptu do zestawu aktualizacji Kubernetes i wykonanie go jako elementu potoku do pushowania zmian w klastrze. Rzeczywi\u015bcie, tak post\u0119puje wielu specjalist\u00f3w. Jednak to rozwi\u0105zanie nie jest optymalne, i oto dlaczego.<\/p>\n<p>CI powinno by\u0107 wykorzystywane do wprowadzania aktualizacji do trunk, a klaster Kubernetes powinien dostosowa\u0107 si\u0119 na podstawie tych aktualizacji, aby zarz\u0105dza\u0107 CD \"wewn\u0119trznie\". Nazywamy to <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-compliance-and-secure-cicd\">modelem pull dla CD<\/a><\/noindex>, w przeciwie\u0144stwie do modelu push CI. CD jest cz\u0119\u015bci\u0105 <i>orkiestracji runtime<\/i>.<\/p>\n<h3>Dlaczego serwery CI nie powinny realizowa\u0107 CD poprzez bezpo\u015brednie aktualizacje w Kubernetes<\/h3>\n<p>\n<i>Nie u\u017cywaj serwera CI do orkiestracji bezpo\u015brednich aktualizacji w Kubernetes w formie zestawu zada\u0144 CI. To antywzorzec, o kt\u00f3rym <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/kubernetes-anti-patterns-let-s-do-gitops-not-ciops\">ju\u017c wspomnieli\u015bmy<\/a><\/noindex> na naszym blogu.<\/i><\/p>\n<p>Wr\u00f3\u0107my do Alicji i Boba.<\/p>\n<p>Z jakimi problemami si\u0119 borykali? Serwer CI Boba stosuje zmiany w klastrze, ale je\u015bli w trakcie tego procesu si\u0119 zawiesi, Bob nie b\u0119dzie wiedzia\u0142, w jakim stanie jest (lub powinien by\u0107) klaster i jak go naprawi\u0107. To samo dotyczy sukcesu.<\/p>\n<p>Za\u0142\u00f3\u017cmy, \u017ce zesp\u00f3\u0142 Boba zbudowa\u0142 nowy obraz, a nast\u0119pnie zabezpieczy\u0142 swoje wdro\u017cenia, aby wdro\u017cy\u0107 obraz (wszystko to w ramach potoku CI).<\/p>\n<p>Je\u015bli obraz zostanie zbudowany prawid\u0142owo, ale pipeline si\u0119 zawiesi, zesp\u00f3\u0142 b\u0119dzie musia\u0142 ustali\u0107:<\/p>\n<ul>\n<li> Czy aktualizacja zosta\u0142a wdro\u017cona?<\/li>\n<li> Czy uruchamiamy now\u0105 wersj\u0119? Czy to spowoduje niepotrzebne skutki uboczne \u2014 z mo\u017cliwo\u015bci\u0105 uzyskania dw\u00f3ch instalacji tego samego niezmiennego obrazu? <\/li>\n<li> Czy powinni\u015bmy poczeka\u0107 na kolejn\u0105 aktualizacj\u0119, zanim uruchomimy budow\u0119?<\/li>\n<li> Co dok\u0142adnie posz\u0142o nie tak? Jakie kroki nale\u017cy powt\u00f3rzy\u0107 (i kt\u00f3re z nich mo\u017cna bezpiecznie powt\u00f3rzy\u0107)?<\/li>\n<\/ul>\n<p>\n<i>Organizacja opartego na Gicie procesu roboczego nie gwarantuje, \u017ce zesp\u00f3\u0142 Boba nie napotka na te problemy. Wci\u0105\u017c mog\u0105 pomyli\u0107 si\u0119 z pushem commita, tagiem lub innym parametrem; jednak to podej\u015bcie jest znacznie bli\u017csze jednoznacznemu podej\u015bciu \"wszystko lub nic\".<\/i><\/p>\n<p>Podsumowuj\u0105c, oto dlaczego serwery CI nie powinny zajmowa\u0107 si\u0119 CD:<\/p>\n<ul>\n<li> Skrypty aktualizacji nie zawsze s\u0105 deterministyczne; \u0142atwo mo\u017cna pope\u0142ni\u0107 w nich b\u0142\u0119dy.<\/li>\n<li> Serwery CI nie konwerguj\u0105 do deklaratywnego modelu klastra.<\/li>\n<li> Trudno jest zapewni\u0107 idempotencj\u0119. U\u017cytkownicy musz\u0105 rozumie\u0107 g\u0142\u0119bok\u0105 semantyk\u0119 systemu.<\/li>\n<li> Trudniej jest przeprowadzi\u0107 odzyskiwanie po cz\u0119\u015bciowym awarii.<\/li>\n<\/ul>\n<p>\n<i>Uwaga dotycz\u0105ca Helm: je\u015bli chcesz u\u017cywa\u0107 Helm, zalecamy po\u0142\u0105czenie go z operatorem GitOps, takim jak <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/managing-helm-releases-the-gitops-way\">Flux-Helm<\/a><\/noindex>. To pomo\u017ce zapewni\u0107 konwergencj\u0119. Sam Helm nie jest ani deterministyczny, ani atomowy.<\/i><\/p>\n<h2>GitOps jako najlepszy spos\u00f3b na realizacj\u0119 Continuous Delivery dla Kubernetes<\/h2>\n<p>\nZesp\u00f3\u0142 Alice i Bob wdra\u017ca GitOps i odkrywa, \u017ce znacznie \u0142atwiej jest pracowa\u0107 z produktami oprogramowania, utrzymywa\u0107 wysok\u0105 wydajno\u015b\u0107 i stabilno\u015b\u0107. Zako\u0144czmy ten artyku\u0142 ilustracjami, kt\u00f3re pokazuj\u0105, jak wygl\u0105da ich nowe podej\u015bcie. Nale\u017cy pami\u0119ta\u0107, \u017ce g\u0142\u00f3wnie m\u00f3wimy o aplikacjach i us\u0142ugach, jednak GitOps mo\u017cna wykorzysta\u0107 do zarz\u0105dzania ca\u0142\u0105 platform\u0105.<\/p>\n<h3>Model eksploatacji dla Kubernetes<\/h3>\n<p>\nZobacz poni\u017cszy diagram. Przedstawia Git i repozytorium obraz\u00f3w kontener\u00f3w jako wsp\u00f3lne zasoby dla dw\u00f3ch orkestrowanych cykli \u017cycia:<\/p>\n<ul>\n<li> Pipelina ci\u0105g\u0142ej integracji, kt\u00f3ra odczytuje i zapisuje pliki w Git oraz mo\u017ce aktualizowa\u0107 repozytorium obraz\u00f3w kontener\u00f3w.<\/li>\n<li> Pipelina Runtime GitOps, \u0142\u0105cz\u0105ca wdra\u017canie z zarz\u0105dzaniem i observability. Odczytuje i zapisuje pliki w Git oraz mo\u017ce przesy\u0142a\u0107 obrazy kontener\u00f3w.<\/li>\n<\/ul>\n<h3>Jakie s\u0105 g\u0142\u00f3wne wnioski?<\/h3>\n<p><\/p>\n<ol>\n<li> <b>Rozdzielenie problem\u00f3w<\/b>: Zauwa\u017c, \u017ce oba pipeline'y mog\u0105 wymienia\u0107 si\u0119 danymi tylko poprzez aktualizacj\u0119 Gita lub repozytorium obraz\u00f3w. Innymi s\u0142owy, istnieje zapora sieciowa mi\u0119dzy \u015brodowiskiem CI a runtime. Nazywamy to 'zapora niezmienno\u015bci' <i>(immutability firewall)<\/i>, poniewa\u017c wszystkie aktualizacje repozytori\u00f3w tworz\u0105 nowe wersje. Po wi\u0119cej informacji na ten temat, zapoznaj si\u0119 ze slajdami 72-87. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.slideshare.net\/weaveworks\/continuous-lifecycle-london-2018-event-keynote-97418556\">tej prezentacji<\/a><\/noindex>.<\/li>\n<li> <b>Mo\u017cna u\u017cywa\u0107 dowolnych serwer\u00f3w CI i Git<\/b>: GitOps dzia\u0142a z dowolnymi komponentami. Mo\u017cesz dalej korzysta\u0107 ze swoich ulubionych serwer\u00f3w CI i Git, repozytori\u00f3w obraz\u00f3w i zestaw\u00f3w test\u00f3w. Prawie wszystkie inne narz\u0119dzia do Continuous Delivery na rynku wymagaj\u0105 w\u0142asnego serwera CI\/Git lub repozytorium obraz\u00f3w. Mo\u017ce to stanowi\u0107 ograniczenie w rozwoju cloud native. W przypadku GitOps mo\u017cesz korzysta\u0107 z dobrze znanych narz\u0119dzi.<\/li>\n<li> <b>Wydarzenia jako narz\u0119dzie integracji<\/b>: Gdy tylko dane w Gicie s\u0105 aktualizowane, Weave Flux (lub operator Weave Cloud) informuje o tym runtime. Za ka\u017cdym razem, gdy Kubernetes przyjmuje zestaw zmian, Git jest aktualizowany. To zapewnia prosty model integracji do organizacji proces\u00f3w roboczych dla GitOps, jak pokazano poni\u017cej.<\/li>\n<\/ol>\n<h2>Podsumowanie<\/h2>\n<p>\nGitOps zapewnia istotne gwarancje aktualizacji, kt\u00f3re s\u0105 niezb\u0119dne dla ka\u017cdego nowoczesnego narz\u0119dzia CI\/CD:<\/p>\n<ul>\n<li> automatyzacja;<\/li>\n<li> konwergencja;<\/li>\n<li> idempotentno\u015b\u0107;<\/li>\n<li> deterministyczno\u015b\u0107.<\/li>\n<\/ul>\n<p>\nJest to istotne, poniewa\u017c oferuje model eksploatacji dla deweloper\u00f3w w obszarze chmurowym.<\/p>\n<ul>\n<li> Tradycyjne narz\u0119dzia do zarz\u0105dzania i monitorowania system\u00f3w s\u0105 zwi\u0105zane z zespo\u0142ami operacyjnymi, kt\u00f3re dzia\u0142aj\u0105 w ramach runbooka <i>(zbioru rutynowych procedur i operacji \u2014 przyp. t\u0142um.)<\/i>, zwi\u0105zanym z konkretnym wdro\u017ceniem.<\/li>\n<li> W zarz\u0105dzaniu systemami chmurowymi narz\u0119dzia do monitorowania s\u0105 najlepszym sposobem oceny wynik\u00f3w wdro\u017ce\u0144, aby zesp\u00f3\u0142 deweloperski m\u00f3g\u0142 szybko na nie reagowa\u0107.<\/li>\n<\/ul>\n<p>\nWyobra\u017a sobie wiele klastr\u00f3w rozproszonych po r\u00f3\u017cnych chmurach oraz wiele serwis\u00f3w z w\u0142asnymi zespo\u0142ami i planami wdro\u017ce\u0144. GitOps oferuje model zarz\u0105dzania dla wszystkich tych zasob\u00f3w.<\/p>\n<h2>P.S. od t\u0142umacza<\/h2>\n<p>\nPrzeczytaj tak\u017ce na naszym blogu:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/456754\/\">GitOps: por\u00f3wnanie metod Pull i Push<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/434160\/\">Prezentujemy bibliotek\u0119 kubedog do \u015bledzenia zasob\u00f3w Kubernetes.<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/449096\/\">Rozszerzamy i uzupe\u0142niamy Kubernetes (przegl\u0105d i wideo z prezentacji).<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p class=\"for_users_only_msg\">Tylko zarejestrowani u\u017cytkownicy mog\u0105 bra\u0107 udzia\u0142 w ankiecie. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Zaloguj si\u0119<\/a><\/noindex>, prosz\u0119.<\/p>\n<h2 class=\"default-block__polling-title\">Czy wiedzia\u0142e\u015b o GitOps zanim pojawi\u0142y si\u0119 te dwa t\u0142umaczenia na habrze?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Tak, wszystko wiedzia\u0142em(a).<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Jedynie powierzchownie.<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Nie<\/p>\n<\/li>\n<\/ul>\n<p>    35 u\u017cytkownik\u00f3w zag\u0142osowa\u0142o. 10 u\u017cytkownik\u00f3w wstrzyma\u0142o si\u0119 od g\u0142osu.<br \/>\n<br \/>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/458878\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u043c. \u043f\u0435\u0440\u0435\u0432.: \u041f\u043e\u0441\u043b\u0435 \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043e \u043c\u0435\u0442\u043e\u0434\u0430\u0445 pull \u0438 push \u0432 GitOps \u043c\u044b \u0443\u0432\u0438\u0434\u0435\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u043a \u044d\u0442\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 \u0446\u0435\u043b\u043e\u043c, \u043e\u0434\u043d\u0430\u043a\u043e \u0440\u0443\u0441\u0441\u043a\u043e\u044f\u0437\u044b\u0447\u043d\u044b\u0445 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0439 \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u043c\u0430\u043b\u043e (\u043d\u0430 \u0445\u0430\u0431\u0440\u0435 \u0438\u0445 \u043f\u043e\u043f\u0440\u043e\u0441\u0442\u0443 \u043d\u0435\u0442). \u041f\u043e\u0441\u0435\u043c\u0443 \u0440\u0430\u0434\u044b \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u2014 \u043f\u0443\u0441\u0442\u044c \u0438 \u0443\u0436\u0435 \u043f\u043e\u0447\u0442\u0438 \u0433\u043e\u0434\u0438\u0447\u043d\u043e\u0439 \u0434\u0430\u0432\u043d\u043e\u0441\u0442\u0438! \u2014 \u043e\u0442 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Weaveworks, \u0433\u043b\u0430\u0432\u0430 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-35941","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u043c.\" \/>\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\/pl\/blog\/administrirovanie\/chto-zhe-takoe-gitops\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0427\u0442\u043e \u0436\u0435 \u0442\u0430\u043a\u043e\u0435 GitOps? | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u043c.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/chto-zhe-takoe-gitops\" \/>\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:07:41+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:07:41+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\udd47Czym jest GitOps? | ProHoster","description":"Przyk\u0142.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/chto-zhe-takoe-gitops","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0427\u0442\u043e \u0436\u0435 \u0442\u0430\u043a\u043e\u0435 GitOps? | ProHoster","og:description":"\u041f\u0440\u0438\u043c.","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/chto-zhe-takoe-gitops","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:07:41+00:00","article:modified_time":"2019-10-31T19:07:41+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"35941","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-22 01:21:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:53:31","updated":"2026-01-22 01:21:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/35941","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=35941"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/35941\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=35941"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=35941"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=35941"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}