{"id":94977,"date":"2020-09-24T07:43:00","date_gmt":"2020-09-24T05:43:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/nashi-vyvody-za-god-migraczii-gitlab-com-na-kubernetes"},"modified":"2020-09-24T07:43:00","modified_gmt":"2020-09-24T05:43:00","slug":"nashi-vyvody-za-god-migraczii-gitlab-com-na-kubernetes","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/nashi-vyvody-za-god-migraczii-gitlab-com-na-kubernetes","title":{"rendered":"Nasze wnioski po roku migracji GitLab.com na Kubernetes","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i><b>Przyp. t\u0142um.<\/b>: Wdra\u017canie Kubernetes w GitLab uznawane jest za jeden z g\u0142\u00f3wnych czynnik\u00f3w przyczyniaj\u0105cych si\u0119 do wzrostu firmy. Niemniej jednak, do niedawna infrastruktura serwisu online GitLab.com by\u0142a oparta na maszynach wirtualnych, a migracja do K8s rozpocz\u0119\u0142a si\u0119 zaledwie rok temu i wci\u0105\u017c trwa. Z przyjemno\u015bci\u0105 przedstawiamy t\u0142umaczenie niedawnego artyku\u0142u in\u017cyniera SRE GitLab na temat tego, jak to przebiega i jakie wnioski wyci\u0105gaj\u0105 in\u017cynierowie zaanga\u017cowani w projekt.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Nasze wnioski po roku migracji GitLab.com na Kubernetes\" src=\"\/wp-content\/uploads\/2020\/09\/58429abf60cd19a49c5ce593051c2fca.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNasze dzia\u0142 infrastrukturze od oko\u0142o roku zajmuje si\u0119 migracj\u0105 wszystkich us\u0142ug, kt\u00f3re dzia\u0142aj\u0105 na GitLab.com, do Kubernetes. W tym czasie napotkali\u015bmy problemy zwi\u0105zane nie tylko z przenoszeniem us\u0142ug do Kubernetes, ale tak\u017ce z zarz\u0105dzaniem hybrydowym wdro\u017ceniem w trakcie przej\u015bcia. W tej artykule opowiemy o cennych lekcjach, kt\u00f3rych si\u0119 nauczyli\u015bmy.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Od samego pocz\u0105tku GitLab.com jego serwery dzia\u0142a\u0142y w chmurze na maszynach wirtualnych. Tym maszynami zarz\u0105dza Chef, a ich instalacja odbywa si\u0119 za pomoc\u0105 naszego <noindex><a rel=\"nofollow\" href=\"https:\/\/about.gitlab.com\/install\/#ubuntu\">oficjalnego pakietu Linux<\/a><\/noindex>. <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/gitlab-org\/release\/docs\/-\/blob\/master\/general\/deploy\/gitlab-com-deployer.md\">Strategia wdra\u017cania<\/a><\/noindex> na wypadek, gdyby trzeba by\u0142o zaktualizowa\u0107 aplikacj\u0119, polega na prostym aktualizowaniu parku serwer\u00f3w w skoordynowany spos\u00f3b sekwencyjnie przy pomocy CI-pipeline. Metoda ta \u2014 cho\u0107 wolna i nieco <noindex><a rel=\"nofollow\" href=\"https:\/\/about.gitlab.com\/handbook\/values\/#boring-solutions\">nudna<\/a><\/noindex> \u2014 gwarantuje, \u017ce GitLab.com stosuje te same metody instalacji i konfiguracji, co u\u017cytkownicy wersji autonomicznych <i>(self-managed)<\/i> instalacji GitLab, kt\u00f3rzy u\u017cywaj\u0105 naszych pakiet\u00f3w Linux.<\/p>\n<p>U\u017cywamy tej metody, poniewa\u017c niezwykle wa\u017cne jest, aby do\u015bwiadczy\u0107 wszystkich smutk\u00f3w i rado\u015bci, kt\u00f3re prze\u017cywaj\u0105 cz\u0142onkowie spo\u0142eczno\u015bci, gdy instaluj\u0105 i konfigurowuj\u0105 w\u0142asne kopie GitLab. Podej\u015bcie to dobrze sprawdza\u0142o si\u0119 przez pewien czas, jednak gdy liczba projekt\u00f3w na GitLab przekroczy\u0142a 10 milion\u00f3w, zrozumieli\u015bmy, \u017ce nie spe\u0142nia ju\u017c naszych potrzeb w zakresie skalowania i wdra\u017cania.<\/p>\n<h2>Pierwsze kroki w kierunku Kubernetes i cloud-native GitLab<\/h2>\n<p>\nW 2017 roku powsta\u0142 projekt <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/gitlab-org\/charts\">GitLab Charts<\/a><\/noindex> Aby przygotowa\u0107 GitLab do wdro\u017cenia w chmurze oraz umo\u017cliwi\u0107 u\u017cytkownikom instalacj\u0119 GitLab w klastrach Kubernetes, wiedzieli\u015bmy, \u017ce przeniesienie GitLab do Kubernetes zwi\u0119kszy mo\u017cliwo\u015bci skalowania platformy SaaS, upro\u015bci wdro\u017cenia i poprawi efektywno\u015b\u0107 wykorzystania zasob\u00f3w obliczeniowych. Jednocze\u015bnie wiele funkcji naszej aplikacji zale\u017ca\u0142o od zamontowanych podzia\u0142\u00f3w NFS, co spowolni\u0142o przej\u015bcie z maszyn wirtualnych.<\/p>\n<p>D\u0105\u017cenie do cloud native i Kubernetes umo\u017cliwi\u0142o naszym in\u017cynierom zaplanowanie stopniowego przej\u015bcia, w trakcie kt\u00f3rego zrezygnowali\u015bmy z niekt\u00f3rych zale\u017cno\u015bci aplikacji od sieciowych magazyn\u00f3w, r\u00f3wnocze\u015bnie kontynuuj\u0105c rozw\u00f3j nowych funkcji. Od momentu, kiedy zacz\u0119li\u015bmy planowa\u0107 migracj\u0119 latem 2019 roku, wiele z tych ogranicze\u0144 zosta\u0142o usuni\u0119tych, a proces przenoszenia GitLab.com na Kubernetes teraz idzie pe\u0142n\u0105 par\u0105!<\/p>\n<h2>Funkcje dzia\u0142ania GitLab.com w Kubernetes<\/h2>\n<p>\nDla GitLab.com u\u017cywamy jednego regionalnego klastra GKE, kt\u00f3ry przetwarza ca\u0142y ruch aplikacji. Aby zminimalizowa\u0107 z\u0142o\u017cono\u015b\u0107 (ju\u017c i tak skomplikowanej) migracji, koncentrujemy si\u0119 na us\u0142ugach, kt\u00f3re nie zale\u017c\u0105 od lokalnego sk\u0142adowania lub NFS. GitLab.com w du\u017cej mierze u\u017cywa monolitycznej bazy kodu opartej na Rails, a my kierujemy ruch w zale\u017cno\u015bci od cech obci\u0105\u017cenia roboczego do r\u00f3\u017cnych punkt\u00f3w ko\u0144cowych, izolowanych w swoich w\u0142asnych pulach w\u0119z\u0142\u00f3w.<\/p>\n<p>W przypadku frontendu te typy dziel\u0105 si\u0119 na \u017c\u0105dania do web, API, Git SSH\/HTTPS i Registry. W przypadku backendu dzielimy joby w kolejce wed\u0142ug r\u00f3\u017cnych cech, w zale\u017cno\u015bci od <noindex><a rel=\"nofollow\" href=\"https:\/\/about.gitlab.com\/blog\/2020\/06\/24\/scaling-our-use-of-sidekiq\/\">z g\u00f3ry okre\u015blonych granic zasob\u00f3w<\/a><\/noindex>, kt\u00f3re pozwalaj\u0105 nam ustala\u0107 docelowe wska\u017aniki poziomu us\u0142ug (Service-Level Objectives, SLO) dla r\u00f3\u017cnych obci\u0105\u017ce\u0144.<\/p>\n<p>Wszystkie te us\u0142ugi GitLab.com s\u0105 skonfigurowane za pomoc\u0105 niemodyfikowanego chartu Helm GitLab. Konfiguracja odbywa si\u0119 w subchartach, kt\u00f3re mog\u0105 by\u0107 selektywnie w\u0142\u0105czane w miar\u0119, jak stopniowo przenosimy us\u0142ugi do klastra. Nawet bior\u0105c pod uwag\u0119, \u017ce zdecydowano si\u0119 nie w\u0142\u0105cza\u0107 do migracji niekt\u00f3rych naszych stateful us\u0142ug, takich jak Redis, Postgres, GitLab Pages i Gitaly, u\u017cycie Kubernetes pozwala znacznie zmniejszy\u0107 liczb\u0119 maszyn wirtualnych, kt\u00f3rymi obecnie zarz\u0105dza Chef.<\/p>\n<h2>Przezroczysto\u015b\u0107 i zarz\u0105dzanie konfiguracj\u0105 Kubernetes<\/h2>\n<p>\nWszystkie ustawienia zarz\u0105dzane s\u0105 przez samego GitLaba. Do tego celu u\u017cywamy trzech projekt\u00f3w konfiguracyjnych opartych na Terraform i Helm. Staramy si\u0119 wsz\u0119dzie tam, gdzie to mo\u017cliwe, wykorzysta\u0107 samego GitLaba do uruchamiania GitLaba, ale dla zada\u0144 eksploatacyjnych mamy oddzieln\u0105 instalacj\u0119 GitLaba. Jest to konieczne, aby nie zale\u017ce\u0107 od dost\u0119pno\u015bci GitLab.com podczas wdro\u017ce\u0144 i aktualizacji GitLab.com.<\/p>\n<p>Chocia\u017c nasze pipeline'y dla klastra Kubernetes dzia\u0142aj\u0105 na osobnej instancji GitLab, repozytoria kodu maj\u0105 swoje lustra, publicznie dost\u0119pne pod nast\u0119puj\u0105cymi adresami:<\/p>\n<ul>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/gitlab-com\/gl-infra\/k8s-workloads\/gitlab-com\">k8s-workloads\/gitlab-com<\/a><\/noindex> \u2014 konfiguracja GitLab.com dla wykresu Helm;<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/gitlab-com\/gl-infra\/k8s-workloads\/gitlab-helmfiles\/\">k8s-workloads\/gitlab-helmfiles<\/a><\/noindex> \u2014 zawiera konfiguracje dla us\u0142ug, kt\u00f3re nie s\u0105 bezpo\u015brednio zwi\u0105zane z aplikacj\u0105 GitLab. Obejmuje to konfiguracje do logowania i monitorowania klastra, a tak\u017ce dla zintegrowanych narz\u0119dzi, takich jak PlantUML;<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/gitlab-com\/gitlab-com-infrastructure\">Gitlab-com-infrastructure<\/a><\/noindex> \u2014 konfiguracja Terraform dla Kubernetes i starej (legacy) infrastruktury VM. Tutaj konfiguruje si\u0119 wszystkie zasoby potrzebne do uruchomienia klastra, w tym sam klaster, pule w\u0119z\u0142\u00f3w, konta us\u0142ug, rezerwacj\u0119 adres\u00f3w IP.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Nasze wnioski po roku migracji GitLab.com na Kubernetes\" src=\"\/wp-content\/uploads\/2020\/09\/612125403171d73106a081bf4244a52b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Przy wprowadzaniu zmian pokazuje si\u0119 og\u00f3lnodost\u0119pne <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/gitlab-com\/gl-infra\/k8s-workloads\/gitlab-com\/-\/merge_requests\/315#note_390180361\"><i>kr\u00f3tkie streszczenie<\/i><\/a><\/noindex><i> z odsy\u0142aczem do szczeg\u00f3\u0142owego diffu, kt\u00f3ry SRE analizuje przed wprowadzeniem zmian w klastrze.<\/i><\/p>\n<p>Dla SRE link prowadzi do szczeg\u00f3\u0142owego diffu w instalacji GitLaba, kt\u00f3ra jest u\u017cywana do eksploatacji i dost\u0119p do kt\u00f3rej jest ograniczony. Pozwala to pracownikom i spo\u0142eczno\u015bci bez dost\u0119pu do projektu eksploatacyjnego (kt\u00f3ry jest otwarty tylko dla SRE) przegl\u0105da\u0107 proponowane zmiany w konfiguracji. \u0141\u0105cz\u0105c publiczn\u0105 instancj\u0119 GitLaba dla kodu z zamkni\u0119t\u0105 instancj\u0105 dla CI-pipeline'\u00f3w, zachowujemy jednolity przep\u0142yw pracy, jednocze\u015bnie gwarantuj\u0105c niezale\u017cno\u015b\u0107 od GitLab.com podczas aktualizacji konfiguracji.<\/p>\n<h2>Czego dowiedzieli\u015bmy si\u0119 podczas migracji<\/h2>\n<p>\nPodczas przeprowadzki zdobyli\u015bmy do\u015bwiadczenie, kt\u00f3re stosujemy do nowych migracji i wdro\u017ce\u0144 w Kubernetes.<\/p>\n<h3>1. Wzrost koszt\u00f3w z powodu ruchu mi\u0119dzy strefami dost\u0119pno\u015bci<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Nasze wnioski po roku migracji GitLab.com na Kubernetes\" src=\"\/wp-content\/uploads\/2020\/09\/3dce44b3f803ffcea13e0101e7343d91.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Codzienna statystyka egress (bajty na dob\u0119) dla zbioru repozytori\u00f3w Git na GitLab.com<\/i><\/p>\n<p>Google dzieli swoj\u0105 sie\u0107 na regiony. Te z kolei dziel\u0105 si\u0119 na strefy dost\u0119pno\u015bci (AZ). Hosting Git jest zwi\u0105zany z du\u017cymi wolumenami danych, dlatego wa\u017cne jest, aby kontrolowa\u0107 ruch wychodz\u0105cy. W przypadku ruchu wewn\u0119trznego, wychodz\u0105cy jest bezp\u0142atny tylko wtedy, gdy pozostaje w granicach jednej strefy dost\u0119pno\u015bci. W momencie pisania tego artyku\u0142u oddajemy oko\u0142o 100 TB danych w normalny dzie\u0144 roboczy (i to tylko dla repozytori\u00f3w Git). Us\u0142ugi, kt\u00f3re w naszej starej topologii opartej na VM by\u0142y na tych samych maszynach wirtualnych, teraz dzia\u0142aj\u0105 w r\u00f3\u017cnych podach Kubernetes. Oznacza to, \u017ce cz\u0119\u015b\u0107 ruchu, kt\u00f3ry wcze\u015bniej by\u0142 lokalny dla VM, mo\u017ce potencjalnie wyj\u015b\u0107 poza strefy dost\u0119pno\u015bci.<\/p>\n<p>Regionalne klastry GKE pozwalaj\u0105 na obj\u0119cie kilku stref dost\u0119pno\u015bci dla zapewnienia rezerwy. Rozwa\u017camy opcj\u0119 <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/gitlab-com\/gl-infra\/delivery\/-\/issues\/1175\">podzia\u0142u regionalnego klastra GKE na klastry jedno strefowe<\/a><\/noindex> dla us\u0142ug, kt\u00f3re generuj\u0105 du\u017ce ilo\u015bci ruchu. To pozwoli na obni\u017cenie koszt\u00f3w przep\u0142ywu danych przy zachowaniu rezerwy na poziomie klastra.<\/p>\n<h3>2. Limity, \u017c\u0105dania zasob\u00f3w i skalowanie<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Nasze wnioski po roku migracji GitLab.com na Kubernetes\" src=\"\/wp-content\/uploads\/2020\/09\/6e2e1ca4d37666b49358d94cd8660c56.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Liczba replik obs\u0142uguj\u0105cych ruch produkcyjny na registry.gitlab.com. Ruch osi\u0105ga szczyt oko\u0142o 15:00 UTC.<\/i><\/p>\n<p>Nasza historia z migracj\u0105 zacz\u0119\u0142a si\u0119 w sierpniu 2019 roku, kiedy przenie\u015bli\u015bmy pierwsz\u0105 us\u0142ug\u0119 \u2014 rejestr kontener\u00f3w GitLab (GitLab Container Registry) \u2014 do Kubernetes. Ta krytyczna us\u0142uga o wysokim ruchu idealnie nadawa\u0142a si\u0119 do pierwszej migracji, poniewa\u017c jest aplikacj\u0105 stateless z niewielk\u0105 liczb\u0105 zewn\u0119trznych zale\u017cno\u015bci. Pierwszym problemem, z kt\u00f3rym si\u0119 zmierzyli\u015bmy, by\u0142a du\u017ca liczba usuni\u0119tych pod\u00f3w z powodu braku pami\u0119ci na w\u0119z\u0142ach. W zwi\u0105zku z tym musieli\u015bmy zmieni\u0107 \u017c\u0105dania i limity.<\/p>\n<p>Stwierdzono, \u017ce w przypadku aplikacji, kt\u00f3rej zu\u017cycie pami\u0119ci ro\u015bnie z czasem, niskie warto\u015bci dla \u017c\u0105da\u0144 (rezerwuj\u0105cych pami\u0119\u0107 dla ka\u017cdego podu) w po\u0142\u0105czeniu z \u201ehojnie\u201d ustawionym twardym limitem na u\u017cycie prowadzi\u0142y do przeci\u0105\u017cenia. <i>(saturacji)<\/i> w\u0119z\u0142\u00f3w i wysokiego poziomu wyrzucania. Aby poradzi\u0107 sobie z tym problemem, postanowiono <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/gitlab-com\/gl-infra\/delivery\/-\/issues\/998#note_388983696\">postanowiono zwi\u0119kszy\u0107 \u017c\u0105dania i obni\u017cy\u0107 limity<\/a><\/noindex>. To zdj\u0119\u0142o presj\u0119 z w\u0119z\u0142\u00f3w i zapewni\u0142o cykl \u017cycia pod\u00f3w, kt\u00f3ry nie wywiera\u0142 zbyt wysokiej presji na w\u0119ze\u0142. Teraz zaczynamy migracje z hojnymi (i prawie r\u00f3wnymi) warto\u015bciami \u017c\u0105da\u0144 i limit\u00f3w, dostosowuj\u0105c je w razie potrzeby.<\/p>\n<h3>3. Metryki i logi<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Nasze wnioski po roku migracji GitLab.com na Kubernetes\" src=\"\/wp-content\/uploads\/2020\/09\/66d1fd47b57d5826f13defa6e6a7fe3c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Dzia\u0142 infrastrukturalny koncentruje si\u0119 na op\u00f3\u017anieniach, procencie b\u0142\u0119d\u00f3w i saturacji w stosunku do ustalonych <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Service-level_objective\"><i>cel\u00f3w poziomu us\u0142ug<\/i><\/a><\/noindex><i> (SLO), zwi\u0105zanych z <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/gitlab-com\/dashboards-gitlab-com\/-\/metrics\/sla-dashboard.yml?environment=1790496&amp;duration_seconds=86400\"><i>og\u00f3ln\u0105 dost\u0119pno\u015bci\u0105 naszego systemu<\/i><\/a><\/noindex><i>.<\/i><\/p>\n<p>Miniony rok by\u0142 kluczowy dla dzia\u0142u infrastrukturalnego, z popraw\u0105 w monitorowaniu i zarz\u0105dzaniu SLO. SLO pozwoli\u0142y nam ustala\u0107 cele dla poszczeg\u00f3lnych us\u0142ug, nad kt\u00f3rymi uwa\u017cnie czuwali\u015bmy w trakcie migracji. Jednak nawet z tak\u0105 poprawion\u0105 obserwowalno\u015bci\u0105 nie zawsze od razu wida\u0107 problemy, korzystaj\u0105c z metryk i alert\u00f3w. Na przyk\u0142ad, koncentruj\u0105c si\u0119 na op\u00f3\u017anieniach i procencie b\u0142\u0119d\u00f3w, nie pokrywamy wszystkich scenariuszy u\u017cycia us\u0142ugi, kt\u00f3ra przechodzi migracj\u0119.<\/p>\n<p>Ten problem zosta\u0142 zauwa\u017cony niemal natychmiast po przeniesieniu cz\u0119\u015bci obci\u0105\u017ce\u0144 do klastra. Szczeg\u00f3lnie mocno dawa\u0142 o sobie zna\u0107, gdy konieczne by\u0142o sprawdzenie funkcji, dla kt\u00f3rych liczba zapyta\u0144 jest niewielka, ale maj\u0105 one bardzo specyficzne zale\u017cno\u015bci konfiguracyjne. Jedn\u0105 z kluczowych lekcji po migracji by\u0142o, \u017ce w monitorowaniu nale\u017cy uwzgl\u0119dnia\u0107 nie tylko metryki, ale tak\u017ce logi i \u201ed\u0142ugi ogon\u201d <i>(mowa o <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Long_tail\"><i>takim ich rozk\u0142adzie<\/i><\/a><\/noindex><i> na wykresie \u2014 przyp. t\u0142um.)<\/i> b\u0142\u0119d\u00f3w. Teraz dla ka\u017cdej migracji w\u0142\u0105czamy szczeg\u00f3\u0142owy wykaz zapyta\u0144 do log\u00f3w <i>(log queries)<\/i> i planujemy jasne procedury wycofania, kt\u00f3re w przypadku problem\u00f3w mo\u017cna przekazywa\u0107 od jednej zmiany do kolejnej.<\/p>\n<p>R\u00f3wnoleg\u0142e obs\u0142ugiwanie tych samych zapyta\u0144 na starej infrastrukturze VM i nowej, opartej na Kubernetes, stanowi\u0142o unikalne wyzwanie. W odr\u00f3\u017cnieniu od migracji typu lift-and-shift <i>(szybkie przeniesienie aplikacji \u201ejak jest\u201d do nowej infrastruktury; wi\u0119cej informacji mo\u017cna znale\u017a\u0107 na przyk\u0142ad, <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/www.ibm.com\/cloud\/learn\/lift-and-shift\"><i>tutaj<\/i><\/a><\/noindex><i> \u2014 przyp. t\u0142um.)<\/i>, r\u00f3wnoleg\u0142e dzia\u0142anie \u201estarych\u201d VM i Kubernetes wymaga, aby narz\u0119dzia monitoruj\u0105ce by\u0142y zgodne z obu \u015brodowiskami i potrafi\u0142y \u0142\u0105czy\u0107 metryki w jedn\u0105 form\u0119. Wa\u017cne jest, aby\u015bmy u\u017cywali tych samych paneli i zapyta\u0144 do log\u00f3w, aby osi\u0105gn\u0105\u0107 sp\u00f3jn\u0105 obserwowalno\u015b\u0107 w czasie okresu przej\u015bciowego.<\/p>\n<h3>4. Prze\u0142\u0105czenie ruchu na nowy klaster<\/h3>\n<p>\nDla GitLab.com cz\u0119\u015b\u0107 serwer\u00f3w jest dedykowana <noindex><a rel=\"nofollow\" href=\"https:\/\/about.gitlab.com\/handbook\/engineering\/#canary-testing\">etapie canary<\/a><\/noindex>. Klaster canary obs\u0142uguje nasze wewn\u0119trzne projekty, a tak\u017ce mo\u017ce <noindex><a rel=\"nofollow\" href=\"https:\/\/next.gitlab.com\/\">by\u0107 aktywowany przez u\u017cytkownik\u00f3w<\/a><\/noindex>. Jednak przede wszystkim jest on przeznaczony do testowania zmian wprowadzanych w infrastruktur\u0119 i aplikacj\u0119. Pierwsza przeniesiona us\u0142uga zacz\u0119\u0142a od przyjmowania ograniczonej ilo\u015bci wewn\u0119trznego ruchu, a my nadal wykorzystujemy t\u0119 metod\u0119, aby upewni\u0107 si\u0119, \u017ce spe\u0142niamy SLO zanim skierujemy ca\u0142y ruch do klastra.<\/p>\n<p>W przypadku migracji oznacza to, \u017ce najpierw zapytania do wewn\u0119trznych projekt\u00f3w kierowane s\u0105 do Kubernetes, a nast\u0119pnie stopniowo prze\u0142\u0105czamy reszt\u0119 ruchu do klastra, zmieniaj\u0105c wag\u0119 dla backendu za pomoc\u0105 HAProxy. W trakcie przej\u015bcia z VM na Kubernetes sta\u0142o si\u0119 jasne, \u017ce bardzo korzystne jest posiadanie prostego sposobu na przekierowywanie ruchu mi\u0119dzy star\u0105 a now\u0105 infrastruktur\u0105 oraz odpowiednio przygotowanie starej infrastruktury na przypadek rollbacku w pierwszych dniach po migracji.<\/p>\n<h3>5. Zapasowe moce pod\u00f3w i ich wykorzystanie<\/h3>\n<p>\nPrawie od razu ujawniono kolejny problem: pody dla us\u0142ugi Registry uruchamia\u0142y si\u0119 szybko, jednak uruchomienie pod\u00f3w dla Sidekiq zajmowa\u0142o do <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/gitlab-org\/charts\/gitlab\/-\/issues\/1775\">dw\u00f3ch minut<\/a><\/noindex>. D\u0142ugie uruchamianie pod\u00f3w dla Sidekiq sta\u0142o si\u0119 problemem, gdy zacz\u0119li\u015bmy migracj\u0119 w Kubernetes obci\u0105\u017cenia robocze dla pracownik\u00f3w, kt\u00f3rzy musz\u0105 szybko przetwarza\u0107 zadania i szybko skalowa\u0107.<\/p>\n<p>W tym przypadku lekcja polega\u0142a na tym, \u017ce chocia\u017c Horizontal Pod Autoscaler (HPA) w Kubernetes dobrze radzi sobie ze wzrostem ruchu, wa\u017cne jest, aby uwzgl\u0119dni\u0107 charakterystyki obci\u0105\u017ce\u0144 i przydzieli\u0107 zapasowe zasoby pod\u00f3w (szczeg\u00f3lnie w warunkach nier\u00f3wnomiernego rozk\u0142adu popytu). W naszym przypadku zaobserwowano nag\u0142y skok zada\u0144, co prowadzi\u0142o do szybkiego skalowania, co skutkowa\u0142o nasyceniem zasob\u00f3w CPU, zanim zd\u0105\u017cyli\u015bmy zwi\u0119kszy\u0107 pul\u0119 w\u0119z\u0142\u00f3w.<\/p>\n<p>Zawsze jest pokusa, aby \u201ewycisn\u0105\u0107\u201d jak najwi\u0119cej z klastra, jednak pocz\u0105tkowo borykaj\u0105c si\u0119 z problemami z wydajno\u015bci\u0105, teraz zaczynamy od hojne pod budgetu i zmniejszamy go p\u00f3\u017aniej, uwa\u017cnie monitoruj\u0105c SLO. Uruchamianie pod\u00f3w dla us\u0142ugi Sidekiq znacznie przyspieszy\u0142o i teraz \u015brednio zajmuje oko\u0142o 40 sekund. <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/gitlab-org\/charts\/gitlab\/-\/issues\/1775\">Skr\u00f3cenie czasu uruchamiania pod\u00f3w<\/a><\/noindex> zyska\u0142 zar\u00f3wno GitLab.com, jak i nasi u\u017cytkownicy instalacji self-managed, korzystaj\u0105cy z oficjalnego Helm-charta GitLab.<\/p>\n<h2>Podsumowanie<\/h2>\n<p>\nPo przeniesieniu ka\u017cdej us\u0142ugi cieszyli\u015bmy si\u0119 z korzy\u015bci p\u0142yn\u0105cych z wykorzystania Kubernetes w produkcji: szybsze i bezpieczniejsze wdra\u017canie aplikacji, skalowanie oraz bardziej efektywne rozdysponowanie zasob\u00f3w. Przy tym zalety migracji wykraczaj\u0105 poza us\u0142ug\u0119 GitLab.com. Z ka\u017cdej poprawy oficjalnego Helm-charta korzystaj\u0105 r\u00f3wnie\u017c jego u\u017cytkownicy.<\/p>\n<p>Mam nadziej\u0119, \u017ce spodoba\u0142a si\u0119 Wam historia naszych przyg\u00f3d z migracj\u0105 do Kubernetes. Wci\u0105\u017c przenosimy nowe us\u0142ugi do klastra. Dodatkowe informacje mo\u017cna znale\u017a\u0107 w nast\u0119puj\u0105cych publikacjach:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/about.gitlab.com\/handbook\/engineering\/infrastructure\/production\/kubernetes\/gitlab-com\/\">Dlaczego migrujemy do Kubernetes?<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/about.gitlab.com\/handbook\/engineering\/infrastructure\/production\/architecture\/#gitlab-com-on-kubernetes\">GitLab.com na Kubernetes<\/a><\/noindex>\u00bb;<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/groups\/gitlab-com\/gl-infra\/-\/epics\/112\">epik o migracji GitLab.com na Kubernetes<\/a><\/noindex>.<\/li>\n<\/ul>\n<p><\/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\/519962\/\">3 lata z Kubernetes w produkcji: oto, co zrozumieli\u015bmy<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/504396\/\">10 typowych b\u0142\u0119d\u00f3w przy u\u017cywaniu Kubernetes<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/335814\/\">Historie sukcesu Kubernetes w produkcji. Cz\u0119\u015b\u0107 3: GitHub<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/440278\/\">Migracja Tindera na Kubernetes<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/520150\/\">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.: \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u044e Kubernetes \u0432 GitLab \u0441\u0447\u0438\u0442\u0430\u044e\u0442 \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u0434\u0432\u0443\u0445 \u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u0432, \u0441\u043f\u043e\u0441\u043e\u0431\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0440\u043e\u0441\u0442\u0443 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0434\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043e\u043d\u043b\u0430\u0439\u043d-\u0441\u0435\u0440\u0432\u0438\u0441\u0430 GitLab.com \u0431\u044b\u043b\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u043d\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d\u0430\u0445, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043a\u043e\u043b\u043e \u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434 \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u0435\u0451 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u0432 K8s, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430. \u0420\u0430\u0434\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 SRE-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0430 GitLab \u043e \u0442\u043e\u043c, \u043a\u0430\u043a [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":94978,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-94977","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u043c. \u043f\u0435\u0440\u0435\u0432.: \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u044e Kubernetes \u0432 GitLab \u0441\u0447\u0438\u0442\u0430\u044e\u0442 \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u0434\u0432\u0443\u0445 \u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u0432, \u0441\u043f\u043e\u0441\u043e\u0431\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0440\u043e\u0441\u0442\u0443 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438.\" \/>\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\/nashi-vyvody-za-god-migraczii-gitlab-com-na-kubernetes\" \/>\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\u041d\u0430\u0448\u0438 \u0432\u044b\u0432\u043e\u0434\u044b \u0437\u0430 \u0433\u043e\u0434 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 GitLab.com \u043d\u0430 Kubernetes | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u043c. \u043f\u0435\u0440\u0435\u0432.: \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u044e Kubernetes \u0432 GitLab \u0441\u0447\u0438\u0442\u0430\u044e\u0442 \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u0434\u0432\u0443\u0445 \u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u0432, \u0441\u043f\u043e\u0441\u043e\u0431\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0440\u043e\u0441\u0442\u0443 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/nashi-vyvody-za-god-migraczii-gitlab-com-na-kubernetes\" \/>\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=\"2020-09-24T05:43:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-09-24T05:43:00+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\udd47Nasze wnioski po roku migracji GitLab.com na Kubernetes | ProHoster","description":"Przyp. t\u0142um.: dostosowanie Kubernetes w GitLab uznawane jest za jeden z dw\u00f3ch g\u0142\u00f3wnych czynnik\u00f3w sprzyjaj\u0105cych wzrostowi firmy.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/nashi-vyvody-za-god-migraczii-gitlab-com-na-kubernetes","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\u041d\u0430\u0448\u0438 \u0432\u044b\u0432\u043e\u0434\u044b \u0437\u0430 \u0433\u043e\u0434 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 GitLab.com \u043d\u0430 Kubernetes | ProHoster","og:description":"\u041f\u0440\u0438\u043c. \u043f\u0435\u0440\u0435\u0432.: \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u044e Kubernetes \u0432 GitLab \u0441\u0447\u0438\u0442\u0430\u044e\u0442 \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u0434\u0432\u0443\u0445 \u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u0432, \u0441\u043f\u043e\u0441\u043e\u0431\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0440\u043e\u0441\u0442\u0443 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438.","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/nashi-vyvody-za-god-migraczii-gitlab-com-na-kubernetes","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":"2020-09-24T05:43:00+00:00","article:modified_time":"2020-09-24T05:43:00+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"94977","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":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 11:14:45","updated":"2022-10-03 07:39:43","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\/94977","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=94977"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/94977\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/94978"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=94977"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=94977"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=94977"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}