VÄre konklusjoner etter et Är med migrering av GitLab.com til Kubernetes

Obs. overs.: tilpassingen av Kubernetes i GitLab anses for Ä vÊre en av to hovedfaktorer som bidrar til selskapets vekst. Likevel, frem til nylig var infrastrukturen for nettjenesten GitLab.com bygget pÄ virtuelle maskiner, og migreringen til K8s begynte fÞrst for omtrent ett Är siden og er fortsatt ikke fullfÞrt. Vi er glade for Ä presentere oversettelsen av en nylig artikkel fra SRE-ingeniÞren i GitLab om hvordan dette foregÄr og hvilke konklusjoner ingeniÞrene som deltar i prosjektet gjÞr.

VÄre konklusjoner etter et Är med migrering av GitLab.com til Kubernetes

I omtrent ett Är har vÄr infrastrukturavdeling arbeidet med Ä migrere alle tjenestene som kjÞrer pÄ GitLab.com til Kubernetes. I lÞpet av denne tiden har vi stiftet bekjentskap med problemer knyttet til ikke bare flyttingen av tjenestene til Kubernetes, men ogsÄ til Ä administrere hybrid deployment under overgangen. Dette innlegget handler om de verdifulle lÊrdommene vi har fÄtt.

Fra starten av har serverne pĂ„ GitLab.com jobbet i skyen pĂ„ virtuelle maskiner. Disse virtuelle maskinene administreres av Chef, og installasjonen skjer ved hjelp av vĂ„r offisielle Linux-pakken. Utrullingsstrategi i tilfelle oppdateringer av applikasjonen, bestĂ„r i Ă„ oppdatere serverparken pĂ„ en koordinert, sekvensiell mĂ„te ved hjelp av CI-pipeline. Denne metoden — selv om den er litt treigere og kanskje kjedelig — garanterer at GitLab.com bruker de samme installasjons- og konfigureringsmetodene som brukerne av selvadministrerte (self-managed) GitLab-installasjoner bruker vĂ„re Linux-pakker for dette.

Vi bruker denne metoden fordi det er ekstremt viktig Ä oppleve alle gledene og utfordringene som vanlige medlemmer av fellesskapet opplever nÄr de installerer og konfigurerer sine versjoner av GitLab. Denne tilnÊrmingen har fungert godt en stund, men da antallet prosjekter pÄ GitLab passerte 10 millioner, innsÄ vi at den ikke lenger tilfredsstilte vÄre behov for skalering og utrulling.

FĂžrste skritt mot Kubernetes og cloud-native GitLab

I 2017 ble prosjektet GitLab Charts for preparing GitLab for deployment in the cloud, as well as to give users the ability to install GitLab in Kubernetes clusters. At that time, we knew that migrating GitLab to Kubernetes would enhance the scalability of our SaaS platform, simplify deployments, and improve the efficiency of resource utilization. At the same time, many features of our application relied on mounted NFS partitions, which slowed the transition from virtual machines.

The push towards cloud native and Kubernetes enabled our engineers to plan a gradual transition, during which we eliminated some of the application's dependencies on network storage, all while continuing to develop new features. Since we began planning the migration in the summer of 2019, many of these constraints have been removed, and the process of moving GitLab.com to Kubernetes is now in full swing!

Features of GitLab.com operating in Kubernetes

For GitLab.com, we use a single regional GKE cluster that handles all application traffic. To minimize the complexity of the already intricate migration, we focus on services that are not dependent on local storage or NFS. GitLab.com primarily uses a monolithic Rails codebase, and we direct traffic based on workload characteristics to various endpoints, isolated into their own node pools.

In the case of the frontend, these types are divided into requests to web, API, Git SSH/HTTPS, and Registry. For the backend, we break down jobs in the queues based on various characteristics depending on predetermined resource boundaries, allowing us to set Service-Level Objectives (SLOs) for different loads.

All these services on GitLab.com are configured using the unmodified GitLab Helm chart. Configuration is done in subcharts, which can be selectively included as we gradually move services into the cluster. Even considering the decision not to include some of our stateful services, such as Redis, Postgres, GitLab Pages, and Gitaly, using Kubernetes allows for a radical reduction in the number of VMs currently managed by Chef.

Transparency and configuration management of Kubernetes

Alle innstillinger styres av GitLab selv. For dette benyttes tre konfigurasjonsprosjekter basert pÄ Terraform og Helm. Vi prÞver overalt Ä bruke GitLab for Ä kjÞre GitLab, men for driftsoppgaver har vi en separat GitLab-installasjon. Denne er nÞdvendig for Ä unngÄ avhengighet av tilgjengeligheten til GitLab.com ved distribusjoner og oppdateringer av GitLab.com.

Selv om vÄre pipelines for Kubernetes-klyngen kjÞrer pÄ en separat GitLab-installasjon, finnes det speil av kode-repoene, offentlig tilgjengelig pÄ fÞlgende adresser:

  • k8s-workloads/gitlab-com — konfigurasjonsinnpakning for GitLab.com for Helm-diagrammet til GitLab;
  • k8s-workloads/gitlab-helmfiles — inneholder konfigurasjoner for tjenester som ikke er direkte relatert til applikasjonen GitLab. Blant disse er konfigurasjoner for loggfĂžring og overvĂ„king av klyngen, samt for integrerte verktĂžy som PlantUML;
  • Gitlab-com-infrastructure — Terraform-konfigurasjon for Kubernetes og gammel (legacy) VM-infrastruktur. Her konfigureres alle ressursene som trengs for Ă„ kjĂžre klyngen, inkludert selve klyngen, nodepuljer, tjenestekontoer, reservasjon av IP-adresser.

VÄre konklusjoner etter et Är med migrering av GitLab.com til Kubernetes
Ved endringer vises et offentlig kort sammendrag med en lenke til en detaljert diff, som SRE analyserer fĂžr endringer gjĂžres i klyngen.

For SRE fÞrer lenken til en detaljert diff i GitLab-installasjonen som brukes til drift, og tilgangen til denne er begrenset. Dette gjÞr at ansatte og samfunnet uten tilgang til det driftsprosjektet (som kun er Äpent for SRE) kan se de foreslÄtte endringene i konfigurasjonen. Ved Ä kombinere en offentlig GitLab-instans for kode med en lukket instans for CI-pipelines, opprettholder vi en enhetlig arbeidsflyt, samtidig som vi garanterer uavhengighet fra GitLab.com ved oppdateringer av konfigurasjonen.

Hva vi har lĂŠrt under migreringen

I lÞpet av flyttingen har vi samlet erfaring som vi bruker pÄ nye migreringer og distribusjoner i Kubernetes.

1. Økte kostnader pÄ grunn av trafikk mellom tilgjengelighetssoner

VÄre konklusjoner etter et Är med migrering av GitLab.com til Kubernetes
Daglig egress-statistikk (bytes per dag) for Git-repositorier pÄ GitLab.com

Google deler sitt nettverk i regioner. Disse deler seg videre inn i tilgjengelighetssoner (AZ). Git-hosting er forbundet med store datamengder, sĂ„ det er viktig for oss Ă„ kontrollere nettverks egress. I tilfelle intern trafikk er egress gratis bare hvis det forblir innenfor en enkelt tilgjengelighetssone. PĂ„ tidspunktet for skrivingen av denne artikkelen gir vi bort omtrent 100 TB data pĂ„ en vanlig arbeidsdag (og dette er kun for Git-repositorier). Tjenester som i vĂ„r gamle VM-baserte topologi var lokalisert pĂ„ de samme virtuelle maskinene, kjĂžrer nĂ„ pĂ„ forskjellige pod’er i Kubernetes. Dette betyr at noe av trafikken som tidligere var lokal for VM, potensielt kan gĂ„ utenfor tilgjengelighetssonene.

Regionale GKE-klynger tillater dekning i flere tilgjengelighetssoner for redundans. Vi vurderer muligheten Ä dele en regional GKE-klynge inn i en-sone-klynger for tjenester som genererer store mengder trafikk. Dette vil redusere kostnader for egress samtidig som vi opprettholder redundans pÄ klyngenivÄ.

2. Begrensninger, ressursforespĂžrsel og skalering

VÄre konklusjoner etter et Är med migrering av GitLab.com til Kubernetes
Antall replikater som hÄndterer produksjonstrafikk pÄ registry.gitlab.com. Trafikken nÄr sitt hÞydepunkt rundt kl. 15:00 UTC.

VĂ„r historie med migrering startet i august 2019, da vi flyttet den fĂžrste tjenesten — GitLab Container Registry — til Kubernetes. Denne kritisk viktige tjenesten med hĂžy trafikk var godt egnet for den fĂžrste migreringen, ettersom den er en stateless-applikasjon med fĂ„ eksterne avhengigheter. Det fĂžrste problemet vi mĂžtte var det hĂžye antallet utslĂ„tte pod’er pĂ„ grunn av minnemangel pĂ„ nodene. Dette fĂžrte til at vi mĂ„tte justere forespĂžrslene og begrensningene.

Det ble oppdaget at i tilfelle av en applikasjon hvis minneforbruk voks over tid, fÞrte lave verdier for forespÞrslene (som reserverer minne for hver pod) i kombinasjon med en "sjenerÞs" hard begrensning pÄ bruken til Ä fÞre til metning (saturation) pÄ nodene og hÞy utslutningsrate. For Ä hÄndtere dette problemet ble det besluttet Ä Þke forespÞrslene og redusere begrensningene.Dette lettet presset pÄ nodene og sikret en levetid for pod'er som ikke la for stort press pÄ noden. NÄ begynner vi migrasjoner med sjenerÞse (og nesten like) verdier for forespÞrslene og begrensningene, og justerer dem etter behov.

3. Metrier og logger

VÄre konklusjoner etter et Är med migrering av GitLab.com til Kubernetes
Infrastrukturavdelingen fokuserer pÄ forsinkelser, feilprosent og metning i forhold til satte mÄl for tjenestenivÄ (SLO), knyttet til den totale tilgjengeligheten av systemet vÄrt..

Det siste Äret har en av de viktigste hendelsene i infrastrukturavdelingen vÊrt forbedringer i overvÄking og hÄndtering av SLO. SLO har gjort det mulig for oss Ä sette mÄl for individuelle tjenester, som vi fulgte nÞye med pÄ under migrasjonen. Men selv med denne forbedrede observabiliteten er det ikke alltid mulig Ä umiddelbart se problemer, ved hjelp av metrier og alarmer. For eksempel, ved Ä fokusere pÄ forsinkelser og feilprosent, dekker vi ikke alltid alle bruks-scenariene for tjenesten som migrerer.

Dette problemet ble oppdaget nesten umiddelbart etter overfĂžringen av deler av arbeidsbelastningen til klyngen. Det kom sĂŠrlig tydelig frem nĂ„r vi mĂ„tte teste funksjoner, der antallet forespĂžrselene er lite, men hvor konfigurasjonsavhengighetene er svĂŠrt spesifikke. En av hovedlĂŠre fra migrasjonen ble nĂždvendigheten av Ă„ ta hensyn til bĂ„de metrier og logger samt den «lange halen» (det handler om denne fordelingen pĂ„ grafen – anm. oversetter) av feil. NĂ„ for hver migrasjon inkluderer vi en detaljert liste over forespĂžrslene til logger (log queries) og planlegger klare tilbaketrekningsprosedyrer som i tilfelle problemer kan overfĂžres fra en vakt til en annen.

Parallelt vedlikehold av de samme forespĂžrslene pĂ„ den gamle VM-infrastrukturen og den nye, basert pĂ„ Kubernetes, utgjorde en unik utfordring. I motsetning til lift-and-shift-migrasjon (rask overfĂžring av applikasjoner «som de er» til ny infrastruktur; mer informasjon kan leses om for eksempel, her – obs. overs.), parallell drift pĂ„ «gamle» VM-er og Kubernetes krever at overvĂ„kingsverktĂžyene er kompatible med begge miljĂžene og kan samle metrikker i Ă©n visning. Det er viktig at vi bruker de samme dashbordene og loggforespĂžrslene for Ă„ oppnĂ„ konsistent observabilitet i overgangsperioden.

4. Bytte av trafikk til ny klynge

For GitLab.com er deler av serverne dedikert til kanaristadiet. Kanariparken betjener vÄre interne prosjekter, men kan ogsÄ aktiveres av brukerne. Men fÞrst og fremst er den ment for Ä teste endringer som gjÞres i infrastrukturen og applikasjonen. Den fÞrste overfÞrte tjenesten begynte med Ä motta et begrenset volum internt trafikk, og vi fortsetter Ä bruke denne metoden for Ä sikre at SLO-en overholdes fÞr vi sender all trafikk til klyngen.

I tilfelle av migrering betyr dette at forespÞrslene fÞrst sendes til interne prosjekter i Kubernetes, og deretter gradvis omdirigerer vi resten av trafikken til klyngen ved Ä endre vekten for backend-en via HAProxy. I prosessen med Ä gÄ fra VM til Kubernetes ble det klart at det er veldig fordelaktig Ä ha en enkel metode for Ä omdirigere trafikken mellom det gamle og det nye infrastrukturen, og dermed holde den gamle infrastrukturen klar for tilbaketrekking de fÞrste dagene etter migreringen.

5. Reservekapasitet for pod-er og deres bruk

Nesten umiddelbart ble fÞlgende problem identifisert: pod-er for Registry-tjenesten startet raskt, men oppstart av pod-er for Sidekiq tok opptil to minutter. Den langvarige oppstarten av pod-er for Sidekiq ble et problem da vi begynte migreringen av arbeidsbelastninger for arbeidere i Kubernetes som mÄ behandle jobber raskt og skalere raskt.

I dette tilfellet var lÊrdommen at selv om Horizontal Pod Autoscaler (HPA) i Kubernetes hÄndterer Þkningen i trafikken godt, er det viktig Ä ta hensyn til egenskapene til arbeidsbelastningene og fordele reservekapasiteten for pod-er (spesielt under forhold med ujevn etterspÞrsel). I vÄrt tilfelle var det en plutselig bÞlge av jobber som fÞrte til rask skalering, noe som resulterte i at CPU-ressursene ble mettet fÞr vi kunne skalere node-poolen.

Det er alltid fristende Ä «presse» sÄ mye som mulig ut av klyngen, men vi, som fÞrst ble konfrontert med ytelsesproblemer, begynner nÄ med et sjenerÞst pod-budsjett og reduserer det etter hvert, mens vi nÞye fÞlger med pÄ SLO. Oppstart av pod-er for Sidekiq-tjenesten har blitt betydelig raskere og tar nÄ i gjennomsnitt rundt 40 sekunder. Fra reduksjonen i oppstartstiden for pod-er har bÄde GitLab.com og vÄre brukere av selvadministrerte installasjoner, som bruker den offisielle Helm-diagrammet til GitLab, hatt fordel.

Konklusjon

Etter overfÞringen av hver tjeneste har vi gledet oss over fordelene ved Ä bruke Kubernetes i produksjon: raskere og sikrere distribusjon av applikasjoner, skalerbarhet og mer effektiv ressursfordeling. Fordelene ved migrering gÄr nemlig utover GitLab.com-tjenesten. Brukerne av den offisielle Helm-diagrammet drar ogsÄ nytte av hver forbedring.

Jeg hÄper du likte historien om vÄre eventyr med migrering til Kubernetes. Vi fortsetter Ä flytte flere tjenester inn i klyngen. Ytterligere informasjon kan finnes i fÞlgende publikasjoner:

P.S. from the translator

Also read in our blog:

Kilde: habr.com

KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere đŸ”„ KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere | ProHoster