Tinder pāreja uz Kubernetes

PiezÄ«me. tulk.: pasaulslavenā pakalpojuma Tinder darbinieki nesen dalÄ«jās ar dažām tehniskām detaļām par savas infrastruktÅ«ras migrÄ“Å”anu uz Kubernetes. Process ilga gandrÄ«z divus gadus, un tā rezultātā K8s tika uzsākta ļoti liela mēroga platforma, kas sastāv no 200 pakalpojumiem, kas izvietoti 48 tÅ«kstoÅ”os konteineru. Ar kādām interesantām grÅ«tÄ«bām saskārās Tinder inženieri un pie kādiem rezultātiem viņi nonāca?Izlasi Å”o tulkojumu.

Tinder pāreja uz Kubernetes

Kāpēc?

GandrÄ«z pirms diviem gadiem Tinder nolēma pārvietot savu platformu uz Kubernetes. Kubernetes ļautu Tinder komandai ievietot konteinerus un pāriet uz ražoÅ”anu ar minimālu piepÅ«li, izmantojot nemainÄ«gu izvietoÅ”anu (nemainÄ«ga izvietoÅ”ana). Å ajā gadÄ«jumā lietojumprogrammu komplektu, to izvietoÅ”anu un paÅ”u infrastruktÅ«ru unikāli definētu kods.

Mēs arÄ« meklējām risinājumu mērogojamÄ«bas un stabilitātes problēmai. Kad mērogoÅ”ana kļuva kritiska, mums bieži bija jāgaida vairākas minÅ«tes, lÄ«dz parādÄ«jās jauni EC2 gadÄ«jumi. Ideja palaist konteinerus un sākt apkalpot satiksmi sekundēs, nevis minÅ«tēs, mums kļuva ļoti pievilcÄ«ga.

Process izrādÄ«jās grÅ«ts. MÅ«su migrācijas laikā 2019. gada sākumā Kubernetes klasteris sasniedza kritisko masu, un mēs sākām saskarties ar dažādām problēmām trafika apjoma, klastera lieluma un DNS dēļ. Pa ceļam mēs atrisinājām daudzas interesantas problēmas, kas saistÄ«tas ar 200 pakalpojumu migrÄ“Å”anu un Kubernetes klastera uzturÄ“Å”anu, kas sastāv no 1000 mezgliem, 15000 48000 podiem un XNUMX XNUMX strādājoÅ”iem konteineriem.

Kā?

KopÅ” 2018. gada janvāra esam izgājuÅ”i cauri dažādiem migrācijas posmiem. Mēs sākām, ievietojot visus savus pakalpojumus konteineros un izvietojot tos Kubernetes testa mākoņa vidēs. Sākot ar oktobri, mēs sākām metodisku visu esoÅ”o pakalpojumu migrÄ“Å”anu uz Kubernetes. LÄ«dz nākamā gada martam mēs pabeidzām migrÄ“Å”anu, un tagad Tinder platforma darbojas tikai Kubernetes.

Kubernetes attēlu veidoÅ”ana

Mums ir vairāk nekā 30 pirmkoda krātuves mikropakalpojumiem, kas darbojas Kubernetes klasterÄ«. Kods Å”ajās krātuvēs ir rakstÄ«ts dažādās valodās (piemēram, Node.js, Java, Scala, Go) ar vairākām izpildlaika vidēm vienai valodai.

BÅ«vsistēma ir izstrādāta, lai nodroÅ”inātu pilnÄ«bā pielāgojamu ā€œbÅ«vējuma kontekstuā€ katram mikropakalpojumam. Tas parasti sastāv no Dockerfile un čaulas komandu saraksta. To saturs ir pilnÄ«bā pielāgojams, un tajā paŔā laikā visi Å”ie bÅ«vÄ“Å”anas konteksti ir rakstÄ«ti saskaņā ar standartizētu formātu. BÅ«vÄ“Å”anas kontekstu standartizÄ“Å”ana ļauj vienai bÅ«vÄ“Å”anas sistēmai apstrādāt visus mikropakalpojumus.

Tinder pāreja uz Kubernetes
Attēls 1-1. Standartizēts veidoÅ”anas process, izmantojot Builder konteineru

Lai sasniegtu maksimālu konsekvenci starp izpildlaikiem (izpildlaika vides) tas pats veidoÅ”anas process tiek izmantots izstrādes un testÄ“Å”anas laikā. Mēs saskārāmies ar ļoti interesantu izaicinājumu: mums bija jāizstrādā veids, kā nodroÅ”ināt bÅ«vniecÄ«bas vides konsekvenci visā platformā. Lai to panāktu, visi montāžas procesi tiek veikti Ä«paŔā konteinerā. Celtnieks.

Viņa konteinera ievieÅ”anai bija nepiecieÅ”amas uzlabotas Docker metodes. Builder manto vietējo lietotāja ID un noslēpumus (piemēram, SSH atslēgu, AWS akreditācijas datus utt.), kas nepiecieÅ”ami, lai piekļūtu privātajām Tinder krātuvēm. Tas pievieno lokālos direktorijus, kuros ir avoti, lai dabiski uzglabātu bÅ«vÄ“Å”anas artefaktus. Å Ä« pieeja uzlabo veiktspēju, jo novērÅ” nepiecieÅ”amÄ«bu kopēt bÅ«vējuma artefaktus starp Builder konteineru un resursdatoru. Saglabātos bÅ«vējuma artefaktus var izmantot atkārtoti bez papildu konfigurācijas.

Dažiem pakalpojumiem mums bija jāizveido cits konteiners, lai kartētu kompilācijas vidi ar izpildlaika vidi (piemēram, Node.js bcrypt bibliotēka instalÄ“Å”anas laikā Ä£enerē platformai raksturÄ«gus bināros artefaktus). Kompilācijas procesa laikā prasÄ«bas dažādiem pakalpojumiem var atŔķirties, un galÄ«gais Dockerfile tiek apkopots lidojuma laikā.

Kubernetes klasteru arhitektūra un migrācija

Klasteru lieluma pārvaldība

Mēs nolēmām izmantot kube-aws automatizētai klasteru izvietoÅ”anai Amazon EC2 gadÄ«jumos. PaŔā sākumā viss darbojās vienā kopējā mezglu baseinā. Mēs ātri sapratām, ka darba slodzes ir jānodala pēc lieluma un gadÄ«jumu veida, lai efektÄ«vāk izmantotu resursus. LoÄ£ika bija tāda, ka vairāku ielādētu vairāku vÄ«tņu apvidu palaiÅ”ana veiktspējas ziņā izrādÄ«jās paredzamāka nekā to lÄ«dzāspastāvÄ“Å”ana ar lielu skaitu viena vÄ«tnes apvidu.

Beigās vienojāmies:

  • m5.4xliels ā€” monitoringam (Prometejs);
  • c5.4xliels - Node.js darba slodzei (vienpavedienu darba slodze);
  • c5.2xliels - Java un Go (daudzpavedienu darba slodze);
  • c5.4xliels ā€” vadÄ«bas panelim (3 mezgli).

Migrācija

Viens no sagatavoÅ”anās posmiem, lai pārietu no vecās infrastruktÅ«ras uz Kubernetes, bija esoŔās tieŔās komunikācijas novirzÄ«Å”ana starp pakalpojumiem uz jaunajiem slodzes balansētājiem (ElastÄ«gie slodzes balansētāji (ELB). Tie tika izveidoti noteiktā virtuālā privātā mākoņa (VPC) apakÅ”tÄ«klā. Å is apakÅ”tÄ«kls tika savienots ar Kubernetes VPC. Tas ļāva mums pakāpeniski migrēt moduļus, neņemot vērā Ä«paÅ”o pakalpojumu atkarÄ«bu secÄ«bu.

Å ie galapunkti tika izveidoti, izmantojot svērtās DNS ierakstu kopas, kurās CNAME norādÄ«ja uz katru jauno ELB. Lai pārslēgtos, mēs pievienojām jaunu ierakstu, kas norāda uz jauno Kubernetes pakalpojuma ELB ar svaru 0. Pēc tam ieraksta kopas Time To Live (TTL) iestatÄ«jām uz 0. Pēc tam tika iestatÄ«ts vecais un jaunais svars. lēnām pielāgots, un galu galā 100% slodzes tika nosÅ«tÄ«ta uz jaunu serveri. Pēc pārslēgÅ”anas TTL vērtÄ«ba atgriezās atbilstoŔākā lÄ«menÄ«.

MÅ«su rÄ«cÄ«bā esoÅ”ie Java moduļi varēja tikt galā ar zemu TTL DNS, bet Node lietojumprogrammas to nevarēja. Viens no inženieriem pārrakstÄ«ja daļu savienojuma pÅ«la koda un iesaiņoja to pārvaldniekā, kas atjaunināja kopas ik pēc 60 sekundēm. Izvēlētā pieeja darbojās ļoti labi un bez manāmas veiktspējas pasliktināŔanās.

Nodarbības

Tīkla auduma ierobežojumi

8. gada 2019. janvāra agrā rÄ«tā Tinder platforma negaidÄ«ti avarēja. Reaģējot uz nesaistÄ«tu platformas latentuma palielināŔanos agrāk tajā paŔā rÄ«tā, klastera pākstu un mezglu skaits palielinājās. Tas izraisÄ«ja ARP keÅ”atmiņas izsmelÅ”anu visos mÅ«su mezglos.

Ir trÄ«s Linux opcijas, kas saistÄ«tas ar ARP keÅ”atmiņu:

Tinder pāreja uz Kubernetes
(avots)

gc_thresh3 - tas ir stingrs ierobežojums. Ierakstu ā€œkaimiņu tabulas pārpildeā€ parādÄ«Å”anās žurnālā nozÄ«mēja, ka pat pēc sinhronās atkritumu savākÅ”anas (GC) ARP keÅ”atmiņā nebija pietiekami daudz vietas, lai saglabātu blakus esoÅ”o ierakstu. Å ajā gadÄ«jumā kodols vienkārÅ”i pilnÄ«bā izmeta paketi.

Mēs izmantojam Flaneļa kā tÄ«kla audums Kubernetes. Paketes tiek pārsÅ«tÄ«tas, izmantojot VXLAN. VXLAN ir L2 tunelis, kas izveidots virs L3 tÄ«kla. TehnoloÄ£ija izmanto MAC-in-UDP (MAC Address-in-User Datagram Protocol) iekapsulāciju un ļauj paplaÅ”ināt 2. slāņa tÄ«kla segmentus. Transporta protokols fiziskā datu centra tÄ«klā ir IP plus UDP.

Tinder pāreja uz Kubernetes
Attēls 2-1. Flaneļa diagramma (avots)

Tinder pāreja uz Kubernetes
Attēls 2-2. VXLAN pakotne (avots)

Katrs Kubernetes darbinieka mezgls pieŔķir virtuālo adreÅ”u telpu ar /24 masku no lielāka /9 bloka. Katram mezglam tas ir nozÄ«mē viens ieraksts marÅ”rutÄ“Å”anas tabulā, viens ieraksts ARP tabulā (interfeisā flanel.1) un viens ieraksts komutācijas tabulā (FDB). Tie tiek pievienoti, pirmo reizi startējot darbinieka mezglu vai katru reizi, kad tiek atklāts jauns mezgls.

Turklāt mezgla-pod (vai pod-pod) komunikācija galu galā notiek caur saskarni eth0 (kā parādÄ«ts iepriekÅ” redzamajā flaneļa diagrammā). Tā rezultātā ARP tabulā tiek parādÄ«ts papildu ieraksts katram atbilstoÅ”ajam avota un mērÄ·a resursdatoram.

MÅ«su vidē Ŕāda veida komunikācija ir ļoti izplatÄ«ta. Kubernetes pakalpojumu objektiem tiek izveidots ELB, un Kubernetes reÄ£istrē katru mezglu ar ELB. ELB neko nezina par podiem, un atlasÄ«tais mezgls var nebÅ«t paketes galamērÄ·is. Lieta ir tāda, ka tad, kad mezgls saņem paketi no ELB, tas to uzskata, ņemot vērā noteikumus iptables konkrētam pakalpojumam un nejauÅ”i izvēlas podziņu citā mezglā.

Kļūmes brÄ«dÄ« klasterÄ« bija 605 mezgli. IepriekÅ” minēto iemeslu dēļ ar to pietika, lai pārvarētu nozÄ«mi gc_thresh3, kas ir noklusējuma vērtÄ«ba. Kad tas notiek, ne tikai sāk izmest paketes, bet arÄ« visa Flanel virtuālā adreÅ”u telpa ar /24 masku pazÅ«d no ARP tabulas. Node-pod komunikācija un DNS vaicājumi ir pārtraukti (DNS tiek mitināts klasterÄ«; sÄ«kāku informāciju lasiet vēlāk Å”ajā rakstā).

Lai atrisinātu Å”o problēmu, jums ir jāpalielina vērtÄ«bas gc_thresh1, gc_thresh2 Šø gc_thresh3 un restartējiet Flanel, lai atkārtoti reÄ£istrētu trÅ«kstoÅ”os tÄ«klus.

NegaidÄ«ta DNS mērogoÅ”ana

Migrācijas procesā mēs aktÄ«vi izmantojām DNS, lai pārvaldÄ«tu trafiku un pakāpeniski pārsÅ«tÄ«tu pakalpojumus no vecās infrastruktÅ«ras uz Kubernetes. Mēs iestatÄ«jām salÄ«dzinoÅ”i zemas TTL vērtÄ«bas saistÄ«tajiem ierakstu komplektiem marÅ”rutā53. Kad vecā infrastruktÅ«ra darbojās EC2 gadÄ«jumos, mÅ«su atrisinātāja konfigurācija norādÄ«ja uz Amazon DNS. Mēs to uztvērām kā paÅ”saprotamu, un zemā TTL ietekme uz mÅ«su pakalpojumiem un Amazon pakalpojumiem (piemēram, DynamoDB) lielākoties palika nepamanÄ«ta.

Migrējot pakalpojumus uz Kubernetes, mēs atklājām, ka DNS apstrādā 250 tÅ«kstoÅ”us pieprasÄ«jumu sekundē. Tā rezultātā lietojumprogrammām sāka rasties pastāvÄ«gas un nopietnas DNS vaicājumu noildzes. Tas notika, neskatoties uz neticamajiem centieniem optimizēt un pārslēgt DNS nodroÅ”inātāju uz CoreDNS (kas maksimālās slodzes laikā sasniedza 1000 podi, kas darbojas ar 120 kodoliem).

Pētot citus iespējamos cēloņus un risinājumus, mēs atklājām raksts, aprakstot sacensÄ«bu apstākļus, kas ietekmē pakeÅ”u filtrÄ“Å”anas sistēmu netfilter operētājsistēmā Linux. Novērotās noildzes kopā ar pieaugoÅ”u skaitÄ«tāju ievietot_neizdevās flanela saskarnē bija saskaņā ar raksta atklājumiem.

Problēma rodas avota un galamērÄ·a tÄ«kla adreÅ”u tulkoÅ”anas (SNAT un DNAT) posmā un pēc tam ievadÄ«Å”anas tabulā. saplÅ«st. Viens no iekŔēji apspriestajiem un kopienas ieteiktajiem risinājumiem bija DNS pārvietoÅ”ana uz paÅ”u darbinieku mezglu. Å ajā gadÄ«jumā:

  • SNAT nav nepiecieÅ”ams, jo satiksme paliek mezglā. Tas nav jāmarÅ”rutē caur interfeisu eth0.
  • DNAT nav nepiecieÅ”ams, jo galamērÄ·a IP ir lokāls mezglam, nevis nejauÅ”i izvēlēts pods saskaņā ar noteikumiem iptables.

Mēs nolēmām pieturēties pie Ŕīs pieejas. CoreDNS tika izvietots kā DaemonSet pakalpojumā Kubernetes, un mēs ieviesām vietējā mezgla DNS serveri solve.conf katrs pods, uzstādot karogu --cluster-dns komandām kubeletā€Š. Å is risinājums izrādÄ«jās efektÄ«vs DNS taimauta gadÄ«jumā.

Tomēr mēs joprojām redzējām pakeÅ”u zudumu un skaitÄ«tāja pieaugumu ievietot_neizdevās flaneļa saskarnē. Tas turpinājās pēc tam, kad tika ieviests risinājums, jo mēs varējām likvidēt SNAT un/vai DNAT tikai DNS trafikam. SacensÄ«bu apstākļi tika saglabāti cita veida satiksmei. Par laimi, lielākā daļa mÅ«su pakeÅ”u ir TCP, un, ja rodas problēma, tās vienkārÅ”i tiek pārsÅ«tÄ«tas. Mēs joprojām cenÅ”amies atrast piemērotu risinājumu visiem satiksmes veidiem.

SÅ«tņa izmantoÅ”ana labākai slodzes lÄ«dzsvaroÅ”anai

Migrējot aizmugursistēmas pakalpojumus uz Kubernetes, mēs sākām ciest no nesabalansētas slodzes starp podiem. Mēs atklājām, ka HTTP Keepalive izraisÄ«ja ELB savienojumu pārtraukÅ”anu katras ieviestās izvietoÅ”anas pirmajos gatavajos apvidos. Tādējādi lielākā daļa datplÅ«smas tika veikta caur nelielu procentuālo daļu no pieejamajiem podiem. Pirmais mÅ«su pārbaudÄ«tais risinājums bija MaxSurge iestatÄ«Å”ana uz 100% jauniem izvietojumiem sliktākajiem scenārijiem. Efekts izrādÄ«jās nenozÄ«mÄ«gs un neperspektÄ«vs lielākas izvietoÅ”anas ziņā.

Cits risinājums, ko izmantojām, bija mākslÄ«gi palielināt resursu pieprasÄ«jumus kritiskiem pakalpojumiem. Å ajā gadÄ«jumā tuvumā novietotām pākstÄ«m bÅ«tu lielāka manevrÄ“Å”anas iespēja salÄ«dzinājumā ar citām smagajām pākstÄ«m. Tas nedarbotos arÄ« ilgtermiņā, jo tā bÅ«tu resursu izniekoÅ”ana. Turklāt mÅ«su Node lietojumprogrammas bija viena pavediena un attiecÄ«gi varēja izmantot tikai vienu kodolu. VienÄ«gais reālais risinājums bija izmantot labāku slodzes lÄ«dzsvaroÅ”anu.

Mēs jau sen vēlējāmies pilnÄ«bā novērtēt sÅ«tnis. PaÅ”reizējā situācija ļāva mums to izmantot ļoti ierobežotā veidā un iegÅ«t tÅ«lÄ«tējus rezultātus. Envoy ir augstas veiktspējas atvērtā koda XNUMX. slāņa starpniekserveris, kas paredzēts lielām SOA lietojumprogrammām. Tas var ieviest uzlabotas slodzes lÄ«dzsvaroÅ”anas metodes, tostarp automātiskus atkārtotus mēģinājumus, automātiskie slēdži un globālā ātruma ierobežoÅ”ana. (PiezÄ«me. tulk.: Vairāk par to varat lasÄ«t Å”eit Å is raksts par Istio, kura pamatā ir Envoy.)

Mēs nonācām pie Ŕādas konfigurācijas: katram blokam jābÅ«t Envoy blakusvāģim un vienam marÅ”rutam, un savienojiet kopu ar konteineru lokāli, izmantojot portu. Lai samazinātu iespējamo kaskādi un saglabātu nelielu trāpÄ«juma rādiusu, mēs izmantojām sÅ«tņa priekŔējo starpniekservera bloku parku ā€” vienu katrā pieejamÄ«bas zonā (AZ) katram pakalpojumam. Viņi paļāvās uz vienkārÅ”u pakalpojumu atklāŔanas dzinēju, ko bija uzrakstÄ«jis viens no mÅ«su inženieriem, kas vienkārÅ”i atgrieza sarakstu ar aplikācijām katrā AZ konkrētajam pakalpojumam.

Pēc tam pakalpojumu frontes sÅ«tņi izmantoja Å”o pakalpojumu atklāŔanas mehānismu ar vienu augÅ”upējo kopu un marÅ”rutu. Mēs iestatÄ«jām atbilstoÅ”us taimautus, palielinājām visus ķēdes pārtraucēju iestatÄ«jumus un pievienojām minimālu atkārtotā mēģinājuma konfigurāciju, lai palÄ«dzētu novērst atseviŔķas kļūmes un nodroÅ”inātu vienmērÄ«gu izvietoÅ”anu. Katram no Å”iem dienesta priekŔējiem sÅ«tņiem mēs novietojām TCP ELB. Pat ja mÅ«su galvenā starpniekservera slāņa Keepalive bija iestrēdzis dažiem Envoy podiem, tie joprojām varēja daudz labāk apstrādāt slodzi un tika konfigurēti tā, lai aizmugursistēmā balansētu, izmantojot vismaz_pieprasÄ«jumu.

IzvietoÅ”anai mēs izmantojām preStop āķi gan uzlikÅ”anas blokiem, gan blakusvāģa kārbām. Āķis izraisÄ«ja kļūdu, pārbaudot administratora galapunkta statusu, kas atrodas blakusvāģa konteinerā, un kādu laiku aizmiga, lai ļautu pārtraukt aktÄ«vo savienojumu darbÄ«bu.

Viens no iemesliem, kāpēc mēs varējām pārvietoties tik ātri, ir detalizētie rādītāji, kurus varējām viegli integrēt tipiskā Prometheus instalācijā. Tas ļāva mums precīzi redzēt, kas notiek, kamēr mēs pielāgojām konfigurācijas parametrus un pārdalām trafiku.

Rezultāti bija tÅ«lÄ«tēji un acÄ«mredzami. Mēs sākām ar nesabalansētākajiem pakalpojumiem, un Å”obrÄ«d tas darbojas klastera 12 svarÄ«gāko pakalpojumu priekŔā. Å ogad mēs plānojam pāreju uz pilna servisa tÄ«klu ar modernāku pakalpojumu atklāŔanu, ķēdes pārtraukumiem, noviržu noteikÅ”anu, ātruma ierobežoÅ”anu un izsekoÅ”anu.

Tinder pāreja uz Kubernetes
Attēls 3-1. Viena pakalpojuma CPU konverģence pārejas laikā uz Envoy

Tinder pāreja uz Kubernetes

Tinder pāreja uz Kubernetes

Gala rezultāts

Izmantojot Å”o pieredzi un papildu pētÄ«jumus, esam izveidojuÅ”i spēcÄ«gu infrastruktÅ«ras komandu ar spēcÄ«gām prasmēm lielu Kubernetes klasteru projektÄ“Å”anā, izvietoÅ”anā un darbÄ«bā. Visiem Tinder inženieriem tagad ir zināŔanas un pieredze konteineru iepakoÅ”anai un lietojumprogrammu izvietoÅ”anai Kubernetes.

Kad vecajā infrastruktÅ«rā radās nepiecieÅ”amÄ«ba pēc papildu jaudas, mums bija jāgaida vairākas minÅ«tes, lÄ«dz tiks palaists jauns EC2 gadÄ«jums. Tagad konteineri sāk darboties un sāk apstrādāt trafiku dažu sekunžu, nevis minÅ«Å”u laikā. Vairāku konteineru plānoÅ”ana vienā EC2 eksemplārā nodroÅ”ina arÄ« uzlabotu horizontālo koncentrāciju. Rezultātā mēs prognozējam bÅ«tisku EC2019 izmaksu samazinājumu 2. gadā salÄ«dzinājumā ar pagājuÅ”o gadu.

Migrācija ilga gandrÄ«z divus gadus, bet mēs to pabeidzām 2019. gada martā. PaÅ”laik Tinder platforma darbojas tikai Kubernetes klasterÄ«, kas sastāv no 200 pakalpojumiem, 1000 mezgliem, 15 000 podiem un 48 000 darbojoÅ”iem konteineriem. InfrastruktÅ«ra vairs nav vienÄ«gā operāciju komandu joma. Visi mÅ«su inženieri dala Å”o atbildÄ«bu un kontrolē savu lietojumprogrammu izveides un izvietoÅ”anas procesu, izmantojot tikai kodu.

PS no tulka

Lasiet arī rakstu sēriju mūsu emuārā:

Avots: www.habr.com

Pievieno komentāru