{"id":35594,"date":"2019-10-31T22:05:15","date_gmt":"2019-10-31T19:05:15","guid":{"rendered":"https:\/\/prohoster.info\/blog\/gitops-sravnenie-metodov-pull-i-push\/"},"modified":"2019-10-31T22:05:15","modified_gmt":"2019-10-31T19:05:15","slug":"gitops-sravnenie-metodov-pull-i-push","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/gitops-sravnenie-metodov-pull-i-push","title":{"rendered":"GitOps: por\u00f3wnanie metod Pull i Push","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i><b>Przyp. t\u0142um.<\/b>: W spo\u0142eczno\u015bci Kubernetes zyskuje na popularno\u015bci trend zwany GitOps, w co osobi\u015bcie si\u0119 przekonali\u015bmy, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/454184\/\">uczestnicz\u0105c w<\/a><\/noindex> KubeCon Europe 2019. Termin ten zosta\u0142 stworzony stosunkowo niedawno <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-operations-by-pull-request\">przez szefa firmy Weaveworks \u2014 Alexisa Richardsona \u2014 i oznacza stosowanie znanych deweloperom narz\u0119dzi (przede wszystkim \u2014 Git, st\u0105d nazwa) do rozwi\u0105zywania problem\u00f3w zwi\u0105zanych z eksploatacj\u0105. W szczeg\u00f3lno\u015bci chodzi o eksploatacj\u0119 Kubernetes poprzez przechowywanie jego konfiguracji w Git i automatyczne wdra\u017canie zmian w klastrze. O dw\u00f3ch podej\u015bciach do tego wdra\u017cania opowiada Matthias Jg w tym artykule.<\/a><\/noindex> W zesz\u0142ym roku<\/i><\/p>\n<p><img decoding=\"async\" alt=\"GitOps: por\u00f3wnanie metod Pull i Push\" src=\"\/wp-content\/uploads\/2862627cedb4347679d0c14876a24869.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n(w rzeczywisto\u015bci formalnie mia\u0142o to miejsce w sierpniu 2017 r. \u2014 przyp. t\u0142um.) <i>pojawi\u0142o si\u0119 nowe podej\u015bcie do wdra\u017cania aplikacji w Kubernetes. Nazywa si\u0119 GitOps i jego podstawow\u0105 ide\u0105 jest to, \u017ce wersjonowanie deployment\u00f3w odbywa si\u0119 w bezpiecznym \u015brodowisku repozytorium Git.<\/i> Pojawi\u0142 si\u0119 nowy spos\u00f3b wdra\u017cania aplikacji w Kubernetes. Nazywa si\u0119 GitOps, a jego podstaw\u0105 jest za\u0142o\u017cenie, \u017ce \u015bledzenie wersji wdro\u017ce\u0144 odbywa si\u0119 w bezpiecznym \u015brodowisku repozytorium Git.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><b>Wersjonowanie deployment\u00f3w i historia zmian<\/b>:<\/p>\n<ol>\n<li> <b>Wersjonowanie wdro\u017ce\u0144 i historia zmian<\/b>. Stan ca\u0142ego klastra jest przechowywany w repozytorium Git, a wdro\u017cenia aktualizowane s\u0105 tylko za pomoc\u0105 commit\u00f3w. Dodatkowo wszystkie zmiany mo\u017cna \u015bledzi\u0107 za pomoc\u0105 historii commit\u00f3w.<\/li>\n<li> <b>. Prosta<\/b>git reset <code>pozwala na cofanie zmian w deploymentach; zawsze dost\u0119pne s\u0105 poprzednie stany.<\/code> pozwala na przywracanie zmian w wdro\u017ceniach; zawsze dost\u0119pne s\u0105 wcze\u015bniejsze stany.<\/li>\n<li> <b>. Zwykle system Git zawiera wiele poufnych danych, dlatego wi\u0119kszo\u015b\u0107 firm zwraca szczeg\u00f3ln\u0105 uwag\u0119 na jego zabezpieczenia. Odpowiednio, ta ochrona obejmuje r\u00f3wnie\u017c operacje zwi\u0105zane z deploymentami.<\/b>. Zwykle systemy Git zawieraj\u0105 wiele poufnych danych, dlatego wi\u0119kszo\u015b\u0107 firm szczeg\u00f3lnie dba o ich zabezpieczenie. St\u0105d te\u017c ta ochrona dotyczy r\u00f3wnie\u017c operacji na wdro\u017ceniach.<\/li>\n<li> <b>. Wi\u0119kszo\u015b\u0107 system\u00f3w Git domy\u015blnie wspiera polityki dla r\u00f3\u017cnych ga\u0142\u0119zi \u2014 na przyk\u0142ad tylko pull requesty mog\u0105 aktualizowa\u0107 master, a zmiany musz\u0105 by\u0107 zweryfikowane i zaakceptowane przez innego cz\u0142onka zespo\u0142u. Podobnie jak w przypadku kontroli dost\u0119pu, te same polityki stosuje si\u0119 do aktualizacji deployment\u00f3w.<\/b>. Wi\u0119kszo\u015b\u0107 system\u00f3w Git domy\u015blnie wspiera polityki dla r\u00f3\u017cnych ga\u0142\u0119zi \u2014 na przyk\u0142ad tylko pull requesty mog\u0105 aktualizowa\u0107 master, a zmiany musz\u0105 by\u0107 zatwierdzone przez innego cz\u0142onka zespo\u0142u. Tak jak w przypadku kontroli dost\u0119pu, te same polityki stosuje si\u0119 do aktualizacji wdro\u017ce\u0144.<\/li>\n<\/ol>\n<p>\nJak wida\u0107, metoda GitOps ma wiele zalet. W ci\u0105gu ostatniego roku szczeg\u00f3ln\u0105 popularno\u015b\u0107 zyska\u0142y dwa podej\u015bcia. Jedno opiera si\u0119 na push, drugie \u2014 na pull. Zanim je om\u00f3wimy, przyjrzyjmy si\u0119 najpierw, jak wygl\u0105daj\u0105 typowe wdro\u017cenia Kubernetes.<\/p>\n<h2>W ci\u0105gu ostatnich kilku lat w Kubernetes ugruntowa\u0142y si\u0119 r\u00f3\u017cne metody i narz\u0119dzia do wdra\u017cania:<\/h2>\n<p>\nNa podstawie rodzimych szablon\u00f3w Kubernetes\/Kustomize<\/p>\n<ol>\n<li> <b>Na podstawie natywnych szablon\u00f3w Kubernetes\/Kustomize<\/b>To najprostszy spos\u00f3b wdra\u017cania aplikacji w Kubernetes. Programista tworzy podstawowe pliki YAML i je stosuje. Aby unikn\u0105\u0107 ci\u0105g\u0142ego przepisywania tych samych szablon\u00f3w, stworzono Kustomize (przekszta\u0142ca szablony Kubernetes w modu\u0142y). <i><b>Przyp. t\u0142um.<\/b>: Kustomize zosta\u0142 zintegrowany z kubectl w <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/445196\/\">wydaniu Kubernetes 1.14<\/a><\/noindex>.<\/i><\/li>\n<li> <b>Chart\u00f3w Helm<\/b>. Wykresy Helm pozwalaj\u0105 tworzy\u0107 zestawy szablon\u00f3w, kontener\u00f3w init, sidecar\u00f3w itd., kt\u00f3re s\u0105 stosowane do wdra\u017cania aplikacji z bardziej elastycznymi mo\u017cliwo\u015bciami konfiguracji ni\u017c w podej\u015bciu opartym na szablonach. W podstawach tej metody le\u017c\u0105 szablony plik\u00f3w YAML. Helm wype\u0142nia je r\u00f3\u017cnymi parametrami, a nast\u0119pnie przesy\u0142a je do Tillera \u2014 komponentu klastra, kt\u00f3ry wdra\u017ca je w klastrze i umo\u017cliwia aktualizacje i wycofania. Wa\u017cne jest to, \u017ce w istocie Helm po prostu wstawia odpowiednie warto\u015bci do szablon\u00f3w, a nast\u0119pnie stosuje je tak samo, jak w tradycyjnym podej\u015bciu <i>(wi\u0119cej o tym, jak to dzia\u0142a i jak mo\u017cna to wykorzysta\u0107, przeczytaj w naszej <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/423239\/\">artyku\u0142 o Helm<\/a><\/noindex> \u2014 przyp. t\u0142um.)<\/i>. Istnieje wiele gotowych chart\u00f3w Helm, obejmuj\u0105cych szeroki zakres zada\u0144.<\/li>\n<li> <b>Alternatywne narz\u0119dzia<\/b>. Istnieje wiele alternatywnych narz\u0119dzi. Wszystkie \u0142\u0105cz\u0105, \u017ce przekszta\u0142caj\u0105 pewne pliki szablon\u00f3w w zrozumia\u0142e pliki YAML Kubernetes, a nast\u0119pnie je stosuj\u0105.<\/li>\n<\/ol>\n<p>\nW naszej pracy stale korzystamy z chart\u00f3w Helm do wa\u017cnych narz\u0119dzi (poniewa\u017c wiele z nich jest ju\u017c gotowych, co znacznie u\u0142atwia \u017cycie) oraz 'czystych' plik\u00f3w YAML Kubernetes do wdra\u017cania w\u0142asnych aplikacji.<\/p>\n<h2>Pull &amp; Push<\/h2>\n<p>\nW jednym z moich ostatnich wpis\u00f3w na blogu przedstawi\u0142em narz\u0119dzie <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/weaveworks\/flux\">Weave Flux<\/a><\/noindex>, umo\u017cliwiaj\u0105cy commitowanie szablon\u00f3w do repozytorium Git i aktualizowanie wdro\u017cenia po ka\u017cdym commicie lub pushu kontenera. Moje do\u015bwiadczenie pokazuje, \u017ce to narz\u0119dzie jest jednym z kluczowych w promowaniu podej\u015bcia pull, dlatego b\u0119d\u0119 si\u0119 na nie cz\u0119sto powo\u0142ywa\u0142. Je\u015bli chcesz dowiedzie\u0107 si\u0119 wi\u0119cej o tym, jak go u\u017cywa\u0107, oto <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/@m.k.joerg\/gitops-weave-flux-in-detail-77ce36945646\">link do artyku\u0142u<\/a><\/noindex>.<\/p>\n<p><i><b>NB!<\/b> Wszystkie zalety korzystania z GitOps s\u0105 zachowane w obu podej\u015bciach.<\/i><\/p>\n<h2>Podej\u015bcie oparte na Pull<\/h2>\n<p>\n<img decoding=\"async\" alt=\"GitOps: por\u00f3wnanie metod Pull i Push\" src=\"\/wp-content\/uploads\/4ed8e6de36bc37d0e747ff99027f8399.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPodstaw\u0105 podej\u015bcia pull jest fakt, \u017ce wszystkie zmiany s\u0105 wprowadzane wewn\u0105trz klastra. W obr\u0119bie klastra znajduje si\u0119 operator, kt\u00f3ry regularnie sprawdza powi\u0105zane repozytoria Git i Docker Registry. Je\u015bli dochodzi w nich do jakichkolwiek zmian, stan klastra jest aktualizowany od wewn\u0105trz. Zazwyczaj uwa\u017ca si\u0119, \u017ce taki proces jest do\u015b\u0107 bezpieczny, poniewa\u017c \u017caden zewn\u0119trzny klient nie ma dost\u0119pu do praw administracyjnych klastra.<\/p>\n<p><b>Zalety:<\/b><\/p>\n<ol>\n<li> \u017baden zewn\u0119trzny klient nie ma uprawnie\u0144 do wprowadzania zmian w klastrze, wszystkie aktualizacje s\u0105 wprowadzane od wewn\u0105trz.<\/li>\n<li> Niekt\u00f3re narz\u0119dzia pozwalaj\u0105 r\u00f3wnie\u017c synchronizowa\u0107 aktualizacje Helm chart\u00f3w i powi\u0105zywa\u0107 je z klastrem.<\/li>\n<li> Docker Registry mo\u017cna skanowa\u0107 w poszukiwaniu nowych wersji. Je\u015bli nowy obraz si\u0119 pojawia, repozytorium Git i wdro\u017cenie s\u0105 aktualizowane do nowej wersji.<\/li>\n<li> Narz\u0119dzia pull mog\u0105 by\u0107 rozdzielone na r\u00f3\u017cne przestrzenie nazw z r\u00f3\u017cnymi repozytoriami Git i uprawnieniami dost\u0119pu. Dzi\u0119ki temu mo\u017cna zastosowa\u0107 model wielodost\u0119powy (multitenant). Na przyk\u0142ad zesp\u00f3\u0142 A mo\u017ce korzysta\u0107 z przestrzeni nazw A, zesp\u00f3\u0142 B \u2014 z przestrzeni nazw B, a zesp\u00f3\u0142 zajmuj\u0105cy si\u0119 infrastruktur\u0105 mo\u017ce korzysta\u0107 z przestrzeni globalnej.<\/li>\n<li> Zazwyczaj narz\u0119dzia s\u0105 do\u015b\u0107 lekkie.<\/li>\n<li> W po\u0142\u0105czeniu z takimi narz\u0119dziami jak operator <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/bitnami-labs\/sealed-secrets\">Bitnami Sealed Secrets<\/a><\/noindex>, sekrety mog\u0105 by\u0107 przechowywane w zaszyfrowanej formie w repozytorium Git i wydobywane wewn\u0105trz klastra.<\/li>\n<li> Brak po\u0142\u0105czenia z pipeline'ami CD, poniewa\u017c wdro\u017cenia odbywaj\u0105 si\u0119 wewn\u0105trz klastra.<\/li>\n<\/ol>\n<p>\n<b>Minusy<\/b>:<\/p>\n<ol>\n<li> Zarz\u0105dzanie sekretami wdro\u017ce\u0144 z wykres\u00f3w Helm jest trudniejsze ni\u017c zwyk\u0142ymi, poniewa\u017c najpierw musz\u0105 by\u0107 one generowane w formie, powiedzmy, sealed secrets, a nast\u0119pnie odszyfrowywane przez wewn\u0119trznego operatora, i dopiero wtedy staj\u0105 si\u0119 dost\u0119pne dla narz\u0119dzia pull. Nast\u0119pnie mo\u017cna uruchomi\u0107 wydanie w Helmie z warto\u015bciami ju\u017c wdro\u017conych sekret\u00f3w. Najprostszym sposobem jest utworzenie sekretu ze wszystkimi warto\u015bciami Helm u\u017cywanymi do wdro\u017cenia, odszyfrowanie go i zapisanie w Git.<\/li>\n<li> Stosuj\u0105c podej\u015bcie pull, jeste\u015b zwi\u0105zany z narz\u0119dziami operuj\u0105cymi na pull. To ogranicza mo\u017cliwo\u015b\u0107 dostosowania procesu wdra\u017cania w klastrze. Na przyk\u0142ad praca z Kustomize jest trudna, poniewa\u017c musi by\u0107 wykonana zanim ostateczne szablony trafi\u0105 do Gita. Nie twierdz\u0119, \u017ce nie mo\u017cna u\u017cywa\u0107 oddzielnych narz\u0119dzi, ale ich integracja w proces wdra\u017cania jest bardziej skomplikowana.<\/li>\n<\/ol>\n<p><\/p>\n<h2>Podej\u015bcie oparte na Push<\/h2>\n<p>\n<img decoding=\"async\" alt=\"GitOps: por\u00f3wnanie metod Pull i Push\" src=\"\/wp-content\/uploads\/533fc0bd107c3338d323e908ae9e75ab.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nW podej\u015bciu push zewn\u0119trzny system (g\u0142\u00f3wnie pipeline'y CD) uruchamia wdro\u017cenia w klastrze po zatwierdzeniu w repozytorium Git lub po pomy\u015blnym zako\u0144czeniu poprzedniego pipeline'a CI. W tym podej\u015bciu system ma dost\u0119p do klastra.<\/p>\n<p><b>Zalety<\/b>:<\/p>\n<ol>\n<li> Bezpiecze\u0144stwo jest okre\u015blane przez repozytorium Git i pipeline budowy.<\/li>\n<li> Wdra\u017canie chart\u00f3w Helm jest prostsze, istnieje wsparcie dla wtyczek Helm.<\/li>\n<li> Zarz\u0105dzanie sekretami jest \u0142atwiejsze, poniewa\u017c sekrety mo\u017cna stosowa\u0107 w pipeline'ach, a tak\u017ce przechowywa\u0107 w Git w zaszyfrowanej formie (w zale\u017cno\u015bci od preferencji u\u017cytkownika).<\/li>\n<li> Brak przywi\u0105zania do konkretnego narz\u0119dzia, poniewa\u017c mo\u017cna u\u017cywa\u0107 r\u00f3\u017cnych ich typ\u00f3w.<\/li>\n<li> Aktualizacje wersji kontener\u00f3w mog\u0105 by\u0107 inicjowane przez pipeline budowy.<\/li>\n<\/ol>\n<p>\n<b>Minusy<\/b>:<\/p>\n<ol>\n<li> Dane do dost\u0119pu do klastra znajduj\u0105 si\u0119 wewn\u0105trz systemu budowy.<\/li>\n<li> Aktualizacja kontener\u00f3w wdro\u017ce\u0144 jest wci\u0105\u017c prostsza z procesem pull.<\/li>\n<li> Silne uzale\u017cnienie od systemu CD, poniewa\u017c potrzebne pipeline'y mog\u0105 by\u0107 pierwotnie napisane pod GitLab Runners, a p\u00f3\u017aniej zesp\u00f3\u0142 zdecyduje si\u0119 przej\u015b\u0107 na Azure DevOps lub Jenkins\u2026 wi\u0119c b\u0119dzie konieczne przeprowadzenie migracji du\u017cej liczby pipeline'\u00f3w budowy.<\/li>\n<\/ol>\n<p><\/p>\n<h2>Podsumowanie: Push czy Pull?<\/h2>\n<p>\nJak to zwykle bywa, ka\u017cdy z podej\u015b\u0107 ma swoje zalety i wady. Niekt\u00f3re zadania \u0142atwiej wykona\u0107 jednym sposobem, a trudniej innym. Na pocz\u0105tku przeprowadza\u0142em wdro\u017cenia r\u0119cznie, ale po natkni\u0119ciu si\u0119 na kilka artyku\u0142\u00f3w o Weave Flux postanowi\u0142em wdro\u017cy\u0107 procesy GitOps dla wszystkich projekt\u00f3w. Dla podstawowych szablon\u00f3w okaza\u0142o si\u0119 to \u0142atwe, ale potem zacz\u0105\u0142em napotyka\u0107 trudno\u015bci w pracy z chartami Helm. W tamtym czasie Weave Flux oferowa\u0142 tylko wczesn\u0105 wersj\u0119 operatora Helm Chart, ale nawet teraz niekt\u00f3re zadania s\u0105 trudniejsze z powodu konieczno\u015bci r\u0119cznego tworzenia sekret\u00f3w i ich stosowania. Mo\u017cna powiedzie\u0107, \u017ce podej\u015bcie pull jest znacznie bardziej zabezpieczone, poniewa\u017c dane uwierzytelniaj\u0105ce klastra nie s\u0105 dost\u0119pne poza nim, co tak bardzo zwi\u0119ksza bezpiecze\u0144stwo, \u017ce warto ponie\u015b\u0107 dodatkowy wysi\u0142ek.<\/p>\n<p>Po chwili refleksji doszed\u0142em do nieoczekiwanego wniosku, \u017ce tak nie jest. Je\u015bli chodzi o komponenty wymagaj\u0105ce maksymalnej ochrony, do takiego zestawienia nale\u017c\u0105 magazyny sekret\u00f3w oraz systemy CI\/CD, repozytoria Git. Informacje w nich s\u0105 bardzo podatne na ataki i potrzebuj\u0105 maksymalnej ochrony. Ponadto, je\u015bli kto\u015b wniknie do twojego repozytorium Git i b\u0119dzie m\u00f3g\u0142 wprowadzi\u0107 tam kod, to b\u0119dzie m\u00f3g\u0142 wdro\u017cy\u0107 cokolwiek zechce (niezale\u017cnie od wybranego podej\u015bcia, czy to pull czy push), i wnikn\u0105\u0107 do system\u00f3w klastra. Tak wi\u0119c najbardziej krytycznymi komponentami wymagaj\u0105cymi ochrony s\u0105 repozytorium Git oraz systemy CI\/CD, a nie po\u015bwiadczenia klastra. Je\u015bli masz dobrze skonfigurowane polityki i \u015brodki bezpiecze\u0144stwa dla tego typu system\u00f3w, a po\u015bwiadczenia klastra s\u0105 wydobywane do pipeline'\u00f3w tylko w postaci sekret\u00f3w, dodatkowe bezpiecze\u0144stwo podej\u015bcia pull mo\u017ce okaza\u0107 si\u0119 nie tak cenne, jak pocz\u0105tkowo zak\u0142adano.<\/p>\n<p>Zatem, je\u015bli podej\u015bcie pull jest bardziej pracoch\u0142onne i nie przynosi korzy\u015bci w zakresie bezpiecze\u0144stwa, czy nie by\u0142oby logiczne u\u017cywa\u0107 tylko podej\u015bcia push? Ale kto\u015b mo\u017ce zauwa\u017cy\u0107, \u017ce w podej\u015bciu push jeste\u015b zbyt uzale\u017cniony od systemu CD i by\u0107 mo\u017ce lepiej jest tego nie robi\u0107, aby w przysz\u0142o\u015bci u\u0142atwi\u0107 migracje.<\/p>\n<p>Moim zdaniem (jak zawsze) nale\u017cy u\u017cywa\u0107 tego, co najlepiej pasuje do konkretnego przypadku lub \u0142\u0105czy\u0107 r\u00f3\u017cne podej\u015bcia. Osobi\u015bcie korzystam z obu metod: Weave Flux do deployment\u00f3w opartych na pull, kt\u00f3re g\u0142\u00f3wnie obejmuj\u0105 nasze w\u0142asne us\u0142ugi, oraz podej\u015bcia push z Helm'em i wtyczkami, co u\u0142atwia stosowanie chart\u00f3w Helm do klastra i pozwala na bezproblemowe tworzenie sekret\u00f3w. My\u015bl\u0119, \u017ce nigdy nie b\u0119dzie jednego uniwersalnego rozwi\u0105zania, kt\u00f3re pasuje do wszystkich przypadk\u00f3w, poniewa\u017c zawsze jest wiele niuans\u00f3w, kt\u00f3re zale\u017c\u0105 od konkretnego zastosowania. Przy tym zdecydowanie polecam GitOps \u2014 znacznie u\u0142atwia \u017cycie i zwi\u0119ksza bezpiecze\u0144stwo.<\/p>\n<p>Mam nadziej\u0119, \u017ce moje do\u015bwiadczenie w tej kwestii pomo\u017ce zdecydowa\u0107, kt\u00f3ra metoda najlepiej odpowiada Twojemu typowi deployment\u00f3w, a ja ch\u0119tnie poznam Twoje zdanie.<\/p>\n<h2>P.S. Notka od t\u0142umacza<\/h2>\n<p>\nW minusach modelu pull pojawia si\u0119 punkt m\u00f3wi\u0105cy o trudno\u015bciach z umieszczaniem odrenderowanych manifest\u00f3w w Git, jednak nie ma minus\u00f3w, \u017ce pipeline CD w modelu pull dzia\u0142a oddzielnie od wdro\u017ce\u0144 i w zasadzie staje si\u0119 pipeline'em z kategorii <i>Continuous Apply<\/i>. Dlatego b\u0119dzie potrzeba jeszcze wi\u0119cej wysi\u0142ku, aby zbiera\u0107 statusy ze wszystkich deployment\u00f3w i jako\u015b udost\u0119pnia\u0107 logi\/status, najlepiej powi\u0105zane z systemem CD.<\/p>\n<p>W tym sensie model push pozwala na zapewnienie jakichkolwiek gwarancji w zakresie wdro\u017cenia, poniewa\u017c czas \u017cycia pipeline'a mo\u017cna ustawi\u0107 r\u00f3wnym czasowi \u017cycia wdro\u017cenia.<\/p>\n<p>Wypr\u00f3bowali\u015bmy oba modele i doszli\u015bmy do tych samych wniosk\u00f3w co autor artyku\u0142u:<\/p>\n<ol>\n<li> Model pull nadaje si\u0119 do organizacji aktualizacji komponent\u00f3w systemowych w du\u017cej liczbie klastr\u00f3w (patrz <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/455543\/\">artyku\u0142 o addon-operatorze<\/a><\/noindex>).<\/li>\n<li> Model push oparty na GitLab CI dobrze nadaje si\u0119 do wdra\u017cania aplikacji przy u\u017cyciu chart\u00f3w Helm. Przy tym wdro\u017cenie deployment\u00f3w w ramach pipeline'\u00f3w jest \u015bledzone za pomoc\u0105 narz\u0119dzia <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\">werf<\/a><\/noindex>. Swoj\u0105 drog\u0105, w kontek\u015bcie tego naszego projektu s\u0142yszeli\u015bmy ci\u0105g\u0142e \u201eGitOps\u201d, gdy omawiali\u015bmy bie\u017c\u0105ce problemy in\u017cynier\u00f3w DevOps przy naszym stoisku na KubeCon Europe \u201919.<\/li>\n<\/ol>\n<p><\/p>\n<h2>P.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\/441964\/\">Kubernetes tips &amp; tricks: przekszta\u0142canie dzia\u0142aj\u0105cych zasob\u00f3w w klastrze w zarz\u0105dzanie Helm 2<\/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<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/436910\/\">Porady dotycz\u0105ce tworzenia niestandardowych proces\u00f3w roboczych w GitLab CI<\/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 u\u017cywasz GitOps?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Tak, podej\u015bcie pull<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Tak, podej\u015bcie push<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Tak, pull + push<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Tak, co\u015b innego<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Nie<\/p>\n<\/li>\n<\/ul>\n<p>    G\u0142osowa\u0142o 30 u\u017cytkownik\u00f3w. Wstrzyma\u0142o si\u0119 10 u\u017cytkownik\u00f3w.<br \/>\n<br \/>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/456754\/\">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.: \u0412 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435 Kubernetes \u044f\u0432\u043d\u0443\u044e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u0442\u0440\u0435\u043d\u0434 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c GitOps, \u0432 \u0447\u0451\u043c \u043c\u044b \u043b\u0438\u0447\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u043b\u0438\u0441\u044c, \u043f\u043e\u0441\u0435\u0442\u0438\u0432 KubeCon Europe 2019. \u042d\u0442\u043e\u0442 \u0442\u0435\u0440\u043c\u0438\u043d \u0431\u044b\u043b \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043d \u0433\u043b\u0430\u0432\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Weaveworks \u2014 Alexis Richardson \u2014 \u0438 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0445 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 (\u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u2014 Git, \u043e\u0442\u043a\u0443\u0434\u0430 \u0438 \u0441\u0430\u043c\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435) \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438. \u0412 [&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-35594","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\/gitops-sravnenie-metodov-pull-i-push\" \/>\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\udd47GitOps: \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 Pull \u0438 Push | 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\/gitops-sravnenie-metodov-pull-i-push\" \/>\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:05:15+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:05:15+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\udd47GitOps: por\u00f3wnanie metod Pull i Push | ProHoster","description":"Przyk\u0142.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/gitops-sravnenie-metodov-pull-i-push","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\udd47GitOps: \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 Pull \u0438 Push | ProHoster","og:description":"\u041f\u0440\u0438\u043c.","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/gitops-sravnenie-metodov-pull-i-push","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:05:15+00:00","article:modified_time":"2019-10-31T19:05:15+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"35594","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-21 23:54:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:05:10","updated":"2026-01-21 23:54: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\/35594","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=35594"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/35594\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=35594"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=35594"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=35594"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}