Гузариши Tinder ба Kubernetes

Шарҳ. тарҷума.: Кормандони хидмати машҳури ҷаҳонии Tinder чанде пеш баъзе тафсилоти техникии интиқоли инфрасохтори худро ба Kubernetes мубодила карданд. Ин раванд тақрибан ду сол тӯл кашид ва боиси ба кор андохтани як платформаи хеле калон дар K8s гардид, ки аз 200 хидмат дар 48 ҳазор контейнер ҷойгир шудааст. Муҳандисони Tinder бо чӣ душвориҳои ҷолиб рӯ ба рӯ шуданд ва онҳо ба чӣ натиҷа расиданд?Ин тарҷумаро хонед.

Гузариши Tinder ба Kubernetes

Чаро?

Тақрибан ду сол пеш, Tinder тасмим гирифт, ки платформаи худро ба Kubernetes интиқол диҳад. Kubernetes ба дастаи Tinder имкон медиҳад, ки бо кӯшиши ҳадди ақал тавассути ҷойгиркунии тағирнопазир контейнер созад ва ба истеҳсол гузарад (тағирёбанда). Дар ин ҳолат, маҷмӯи барномаҳо, ҷобаҷогузории онҳо ва худи инфрасохтор бо код ба таври беназир муайян карда мешавад.

Мо инчунин дар чустучуи роди далли проблемадои васеъшавй ва устуворй будем. Вақте ки миқёс муҳим гашт, ба мо лозим меомад, ки чанд дақиқа интизор шавем, то версияҳои нави EC2 гарданд. Идеяи ба кор андохтани контейнерҳо ва оғози хидматрасонии трафик дар тӯли сонияҳо ба ҷои дақиқаҳо барои мо хеле ҷолиб буд.

Процесс душвор буд. Ҳангоми муҳоҷирати мо дар аввали соли 2019, кластери Кубернетес ба массаи муҳим расид ва мо аз сабаби ҳаҷми трафик, андозаи кластер ва DNS ба мушкилоти гуногун дучор шудем. Дар ин роҳ, мо бисёр мушкилоти ҷолиберо, ки марбут ба интиқоли 200 хидмат ва нигоҳдории кластери Kubernetes иборат аст, аз 1000 гиреҳ, 15000 48000 қуттӣ ва XNUMX XNUMX контейнерҳои корӣ ҳал кардем.

Чӣ тавр?

Аз январи соли 2018 мо марҳилаҳои гуногуни муҳоҷиратро паси сар кардем. Мо аз контейнер кардани ҳама хидматҳои худ ва ҷойгиркунии онҳо дар муҳити абрии озмоишии Kubernetes оғоз кардем. Аз моҳи октябр сар карда, мо ба таври методӣ интиқоли ҳама хидматҳои мавҷударо ба Kubernetes оғоз кардем. То моҳи марти соли оянда, мо муҳоҷиратро анҷом додем ва ҳоло платформаи Tinder танҳо дар Kubernetes кор мекунад.

Сохтани тасвирҳо барои Kubernetes

Мо зиёда аз 30 анбори коди сарчашма барои хидматрасониҳои хурд дар кластери Kubernetes дорем. Рамз дар ин анборҳо бо забонҳои гуногун (масалан, Node.js, Java, Scala, Go) бо муҳитҳои вақти корӣ барои як забон навишта шудааст.

Системаи сохтани он тарҳрезӣ шудааст, ки барои ҳар як хидматрасонии хурд як "контексти бунёд"-и комилан танзимшавандаро таъмин кунад. Он одатан аз Dockerfile ва рӯйхати фармонҳои ҷилди иборат аст. Мундариҷаи онҳо комилан танзимшаванда аст ва дар айни замон, ҳамаи ин контекстҳои сохташуда мувофиқи формати стандартӣ навишта шудаанд. Стандартизатсияи контекстҳои сохтмон имкон медиҳад, ки як системаи ягонаи сохтмонӣ ҳама хидматҳои хурдро идора кунад.

Гузариши Tinder ба Kubernetes
Расми 1-1. Раванди стандартишудаи сохтмон тавассути контейнери Builder

Барои ноил шудан ба мувофиқати ҳадди аксар байни вақтҳои корӣ (муҳитҳои вақти корӣ) ҳамон раванди сохтмон ҳангоми таҳия ва озмоиш истифода мешавад. Мо бо мушкилоти хеле ҷолиб рӯ ба рӯ шудем: мо бояд роҳеро таҳия кунем, ки мутобиқати муҳити сохтмонро дар тамоми платформа таъмин кунем. Барои ноил шудан ба ин ҳама равандҳои васлкунӣ дар дохили контейнери махсус гузаронида мешаванд. сохтмончӣ.

Татбиқи контейнери ӯ усулҳои пешрафтаи Docker-ро талаб мекард. Builder ID корбари маҳаллӣ ва асрорро (ба монанди калиди SSH, маълумоти эътимоднокии AWS ва ғайра) мерос мегирад, ки барои дастрасӣ ба анборҳои хусусии Tinder лозиманд. Он директорияҳои маҳаллиро, ки дорои манбаъҳо мебошанд, барои нигоҳ доштани артефактҳои сохташуда ҷойгир мекунад. Ин равиш иҷроишро беҳтар мекунад, зеро он зарурати нусхабардории артефактҳои сохтмонӣ байни контейнери Builder ва мизбонро аз байн мебарад. Артефактҳои сохташудаи захирашударо бе конфигуратсияи иловагӣ дубора истифода бурдан мумкин аст.

Барои баъзе хидматҳо, мо маҷбур шудем, ки як контейнери дигар эҷод кунем, то муҳити компиляцияро ба муҳити корӣ харита кунем (масалан, китобхонаи bcrypt Node.js ҳангоми насб артефактҳои дуии хоси платформаро тавлид мекунад). Дар ҷараёни тартибдиҳӣ, талаботҳо метавонанд байни хидматҳо фарқ кунанд ва файли ниҳоии Docker-ро зуд тартиб медиҳанд.

Меъмории кластери Кубернетес ва муҳоҷират

Идоракунии андозаи кластер

Мо тасмим гирифтем, ки истифода барем кубе-авс барои ҷойгиркунии кластери автоматӣ дар мисолҳои Amazon EC2. Дар ибтидо ҳама чиз дар як ҳавзи умумии гиреҳҳо кор мекард. Мо зуд фаҳмидем, ки сарбории корро аз рӯи ҳаҷм ва навъи мисол ҷудо кунем, то захираҳоро самараноктар истифода барем. Мантиқ аз он иборат буд, ки кор кардани якчанд қуттиҳои бисёрсоҳаи пурбор аз ҷиҳати иҷроиш назар ба ҳамзистии онҳо бо шумораи зиёди риштаҳои як ришта пешгӯишавандатар буд.

Дар охир мо тасмим гирифтем:

  • м5.4х калон — барои мониторинг (Прометей);
  • c5.4x калон - барои сарбории кории Node.js (сарбории як ришта);
  • c5.2x калон - барои Java ва Go (сарбории бисёрҷабҳа);
  • c5.4x калон — барои панели идоракунй (3 гирех).

Муҳоҷират

Яке аз қадамҳои омодагӣ барои гузаштан аз инфрасохтори кӯҳна ба Кубернетес ин равона кардани иртиботи мустақими мавҷуда байни хидматҳо ба тавозуни нави сарборӣ (Elastic Load Balancers (ELB)) буд. Онҳо дар зершабакаи мушаххаси абрии хусусии виртуалӣ (VPC) сохта шудаанд. Ин зершабака ба VPC Kubernetes пайваст карда шудааст. Ин ба мо имкон дод, ки модулҳоро тадриҷан бе назардошти тартиби мушаххаси вобастагии хидматрасонӣ гузаронем.

Ин нуқтаҳо бо истифода аз маҷмӯи вазншудаи сабтҳои DNS сохта шудаанд, ки дорои CNAMEҳо ба ҳар як ELB нав ишора мекунанд. Барои гузаштан, мо як вуруди наверо илова кардем, ки ба ELB-и нави хидмати Кубернетес бо вазни 0 ишора мекунад. Сипас мо вақти зиндагӣ (TTL)-и вурудро ба 0 муқаррар кардем. Пас аз ин, вазнҳои кӯҳна ва нав буданд оҳиста танзим карда шуд ва дар ниҳоят 100% сарборӣ ба сервери нав фиристода шуд. Пас аз анҷоми гузариш, арзиши TTL ба сатҳи мувофиқтар баргашт.

Модулҳои Java, ки мо доштем, метавонанд бо пасти TTL DNS мубориза баранд, аммо барномаҳои Node натавонистанд. Яке аз муҳандисон як қисми рамзи ҳавзи пайвастро аз нав навишт ва онро дар менеҷер печонд, ки ҳавзҳоро ҳар 60 сония навсозӣ мекард. Усули интихобшуда хеле хуб кор кард ва бе ягон таназзули назарраси фаъолият.

Дарсҳо

Маҳдудиятҳои матоъҳои шабакавӣ

Субҳи барвақти 8 январи соли 2019 платформаи Tinder ногаҳон суқут кард. Дар посух ба афзоиши бесамари таъхири платформа субҳи ҳамон рӯз, шумораи қубурҳо ва гиреҳҳо дар кластер зиёд шуд. Ин боиси он шуд, ки кэши ARP дар ҳама гиреҳҳои мо тамом шавад.

Се варианти Linux вобаста ба кэши ARP вуҷуд дорад:

Гузариши Tinder ба Kubernetes
(манбаъ)

gc_thresh3 - ин маҳдудияти сахт аст. Пайдо шудани вурудоти "серфи ҷадвали ҳамсоя" дар гузориш маънои онро дошт, ки ҳатто пас аз ҷамъоварии партовҳои синхронӣ (GC), дар кэши ARP барои нигоҳ доштани вуруди ҳамсоя ҷой кофӣ набуд. Дар ин ҳолат, ядро ​​​​бастаро комилан партофтааст.

Мо истифода мебарем Flannel ҳамчун матои шабакавӣ дар Кубернетес. Бастаҳо тавассути VXLAN интиқол дода мешаванд. VXLAN як нақби L2 аст, ки дар болои шабакаи L3 бардошта шудааст. Технология инкапсуляцияи MAC-in-UDP (MAC Address-in-User Datagram Protocol) -ро истифода мебарад ва имкон медиҳад, ки сегментҳои шабакаи Layer 2 васеъ карда шавад. Протоколи интиқол дар шабакаи маркази додаҳои физикӣ IP ва UDP мебошад.

Гузариши Tinder ба Kubernetes
Расми 2–1. Диаграммаи фланелӣ (манбаъ)

Гузариши Tinder ба Kubernetes
Расми 2-2. Бастаи VXLAN (манбаъ)

Ҳар як гиреҳи коргари Kubernetes фазои суроғаи виртуалиро бо ниқоби /24 аз блоки калонтар /9 ҷудо мекунад. Барои ҳар як гиреҳ ин аст маънои онро дорад як вуруд дар ҷадвали масир, як вуруд дар ҷадвали ARP (дар интерфейси flannel.1) ва як вуруд дар ҷадвали коммутатсионӣ (FDB). Онҳо ҳангоми бори аввал оғоз шудани гиреҳи корӣ ё ҳар дафъае, ки гиреҳи нав пайдо мешавад, илова карда мешаванд.

Илова бар ин, алоқаи гиреҳ (ё pod-pod) дар ниҳоят тавассути интерфейс мегузарад eth0 (чунон ки дар диаграммаи Фланел дар боло нишон дода шудааст). Ин боиси воридшавии иловагӣ дар ҷадвали ARP барои ҳар як манбаи мувофиқ ва мизбони таъинот мегардад.

Дар муҳити мо, ин намуди муошират хеле маъмул аст. Барои объектҳои хидматрасонӣ дар Кубернетес ELB сохта мешавад ва Kubernetes ҳар як гиреҳро бо ELB сабт мекунад. ELB дар бораи pods чизе намедонад ва гиреҳи интихобшуда метавонад макони ниҳоии баста набошад. Гап дар он аст, ки вақте гиреҳ бастаро аз ELB мегирад, онро бо назардошти қоидаҳо баррасӣ мекунад iptables барои хадамоти мушаххас ва ба таври тасодуфӣ як pod дар гиреҳи дигар интихоб мекунад.

Дар замони нокомӣ дар кластер 605 гиреҳ мавҷуд буд. Бо сабабҳои дар боло зикршуда, ин барои бартараф кардани аҳамият кофӣ буд gc_thresh3, ки пешфарз аст. Вақте ки ин рӯй медиҳад, на танҳо бастаҳо партофта мешаванд, балки тамоми фазои суроғаи виртуалии Flannel бо ниқоби /24 аз ҷадвали ARP нопадид мешавад. Муоширати гиреҳ-pod ва дархостҳои DNS қатъ карда мешавад (DNS дар кластер ҷойгир аст; барои тафсилот баъдтар дар ин мақола хонед).

Барои ҳалли ин мушкилот, шумо бояд арзишҳоро зиёд кунед gc_thresh1, gc_thresh2 и gc_thresh3 ва Flannel-ро аз нав оғоз кунед, то шабакаҳои гумшударо дубора ба қайд гиред.

Миқёси ғайричашмдошти DNS

Дар ҷараёни муҳоҷират, мо барои идоракунии трафик ва тадриҷан интиқоли хидматҳо аз инфрасохтори кӯҳна ба Kubernetes DNS-ро фаъолона истифода бурдем. Мо барои RecordSets алоқаманд дар Route53 арзишҳои нисбатан пасти TTL муқаррар кардем. Вақте ки инфрасохтори кӯҳна дар мисолҳои EC2 кор мекард, конфигуратсияи ҳалли мо ба Amazon DNS ишора кард. Мо инро як чизи муқаррарӣ гирифтем ва таъсири пасти TTL ба хидматҳои мо ва хидматҳои Amazon (ба монанди DynamoDB) ба таври назаррас нодида гирифта шуд.

Вақте ки мо хидматҳоро ба Kubernetes интиқол додем, мо дарёфтем, ки DNS дар як сония 250 ҳазор дархостро коркард мекунад. Дар натиҷа, барномаҳо барои дархостҳои DNS ба таъхирҳои доимӣ ва ҷиддӣ дучор шуданд. Ин сарфи назар аз кӯшишҳои бебаҳо барои оптимизатсия ва иваз кардани провайдери DNS ба CoreDNS (ки дар сарбории баландтарин ба 1000 pods, ки дар 120 ядро ​​кор мекунад) расид, рӯй дод.

Ҳангоми таҳқиқи дигар сабабҳо ва роҳҳои ҳалли имконпазир мо кашф кардем мақола, тавсифи шароити мусобиқа, ки ба чаҳорчӯбаи филтркунии пакетҳо таъсир мерасонанд нетфилтр дар Linux. Тайм-аутҳо, ки мо мушоҳида кардем, дар якҷоягӣ бо ҳисобкунаки афзоянда ворид_карданд дар интерфейси Flannel бо бозёфтҳои мақола мувофиқ буданд.

Мушкилот дар марҳилаи тарҷумаи суроғаҳои шабакавӣ (SNAT ва DNAT) ва воридшавии минбаъда ба ҷадвал рух медиҳад. контракт. Яке аз роҳҳои ҳалли дар дохили кишвар муҳокимашуда ва аз ҷониби ҷомеа пешниҳодшуда интиқол додани DNS ба гиреҳи коргар буд. Дар ин маврид:

  • SNAT лозим нест, зеро трафик дар дохили гиреҳ мемонад. Онро тавассути интерфейс интиқол додан лозим нест eth0.
  • DNAT лозим нест, зеро IP-и таъинот дар гиреҳ маҳаллӣ аст, на як подкоҳи тасодуфӣ мувофиқи қоидаҳо iptables.

Мо тасмим гирифтем, ки бо ин усул пайравӣ кунем. CoreDNS ҳамчун DaemonSet дар Kubernetes ҷойгир карда шуд ва мо сервери гиреҳи маҳаллии DNS-ро дар ҳал.conf ҳар як pod бо гузоштани байрақ --cluster-dns дастаҳо кубелет . Ин ҳалли барои вақтхушиҳои DNS самаранок буд.

Бо вуҷуди ин, мо то ҳол талафоти бастаҳо ва афзоиши ҳисобкуниро мушоҳида кардем ворид_карданд дар интерфейси Flannel. Ин пас аз татбиқи ҳалли муваққатӣ идома ёфт, зеро мо тавонистем SNAT ва/ё DNAT-ро танҳо барои трафики DNS нест кунем. Шароити мусобика барои дигар намудхои харакат нигох дошта шуд. Хушбахтона, аксари бастаҳои мо TCP мебошанд ва агар мушкилот ба миён ояд, онҳо ба таври оддӣ интиқол дода мешаванд. Мо ҳоло ҳам кӯшиш мекунем, ки роҳи ҳалли мувофиқро барои ҳама намудҳои трафик пайдо кунем.

Истифодаи Envoy барои беҳтар мувозинати сарборӣ

Вақте ки мо хидматҳои пуштибониро ба Кубернетес интиқол додем, мо аз сарбории номутаносиби байни подкҳо азоб мекашидем. Мо дарёфтем, ки HTTP Keepalive боиси овезон шудани пайвастҳои ELB дар қуттиҳои аввалини омодаи ҳар як ҷойгиркунӣ гардид. Ҳамин тариқ, қисми зиёди трафик тавассути фоизи ками подкҳои мавҷуда гузашт. Ҳалли аввалине, ки мо озмоиш кардем, муқаррар кардани MaxSurge ба 100% дар густариши нав барои сенарияҳои бадтарин буд. Таъсири он дар робита ба ҷойгиркунии калонтар ночиз ва умедбахш буд.

Ҳалли дигаре, ки мо истифода мебарем, ин ба таври сунъӣ зиёд кардани дархостҳои захиравӣ барои хидматҳои муҳим буд. Дар ин ҳолат, баргҳои дар наздикӣ ҷойгиршуда дар муқоиса бо дигар қуттиҳои вазнин фазои бештаре барои маневр доранд. Он дар муддати тӯлонӣ низ кор намекунад, зеро он сарфи беҳудаи захираҳо хоҳад буд. Илова бар ин, замимаҳои Node мо як ришта буданд ва мувофиқан танҳо як ядроро истифода бурдан мумкин буд. Ягона ҳалли воқеӣ ин истифодаи беҳтари мувозинати сарборӣ буд.

Мо кайҳо боз мехостем, ки пурра қадр кунем Энди. Вазъияти хозира ба мо имкон дод, ки онро ба таври хеле махдуд чорй кунем ва нати-чахои фаврй ба даст оварем. Envoy прокси-сермаънои баланд, сарчашмаи кушода, қабати-XNUMX мебошад, ки барои барномаҳои бузурги SOA пешбинӣ шудааст. Он метавонад усулҳои пешрафтаи мувозинати сарборӣ, аз ҷумла такрори автоматӣ, сӯзандоруҳо ва маҳдудияти суръати глобалиро татбиқ кунад. (Шарҳ. тарҷума.: Шумо метавонед дар ин бора бештар хонед ин мақола дар бораи Истио, ки ба фиристодан асос ёфтааст.)

Мо конфигуратсияи зеринро пешниҳод кардем: барои ҳар як подк ва як масири як канори Envoy дошта бошед ва кластерро ба контейнер тавассути порт ба таври маҳаллӣ пайваст кунед. Барои кам кардани каскади эҳтимолӣ ва нигоҳ доштани радиуси хурди зарба, мо як флоти прокси-проксии Envoy-ро истифода бурдем, ки барои ҳар як хидмат як минтақаи дастрас (AZ) буд. Онҳо ба як муҳаррики оддии кашфи хидмат, ки аз ҷониби яке аз муҳандисони мо навишта шудааст, такя мекарданд, ки танҳо рӯйхати подкҳоро дар ҳар як AZ барои хидмати додашуда баргардонд.

Фиристодагони хидматрасонӣ пас аз ин механизми кашфи хидматро бо як кластер ва масири боло истифода бурданд. Мо мӯҳлатҳои мувофиқро муқаррар кардем, ҳама танзимоти ноқилро зиёд кардем ва конфигуратсияи ҳадди ақали такрориро илова кардем, то дар ҳалли як нокомиҳо ва таъмини ҷойгиркунии ҳамвор кӯмак расонем. Мо дар назди ҳар яке аз ин фиристодагони хидматрасонӣ TCP ELB ҷойгир кардем. Ҳатто агар нигоҳдории қабати проксии асосии мо дар баъзе подкҳои Envoy часпида бошад ҳам, онҳо ба ҳар ҳол тавонистанд сарбориро хеле беҳтар идора кунанд ва барои мувозинат тавассути minimum_request дар қафо танзим карда шуданд.

Барои ҷойгиркунӣ, мо қалмоқчаи preStop -ро ҳам дар қуттиҳои барнома ва ҳам дар паҳлӯҳои паҳлӯ истифода бурдем. Қалмоқ ҳангоми тафтиши ҳолати нуқтаи ниҳоии администратор, ки дар контейнери паҳлӯ ҷойгир аст, хатогиро ба вуҷуд овард ва муддате хоб рафт, то пайвастҳои фаъол қатъ карда шаванд.

Яке аз сабабҳое, ки мо тавонистем, ки ин қадар зуд ҳаракат кунем, ин ченакҳои муфассал аст, ки мо тавонистем ба осонӣ ба насби маъмулии Prometheus ворид кунем. Ин ба мо имкон дод, то бубинем, ки ҳангоми танзими параметрҳои конфигуратсия ва тақсими трафик чӣ рӯй дода истодааст.

Натичахо фавран ва аён буданд. Мо бо хидматҳои нобаробартарин оғоз кардем ва дар айни замон он дар назди 12 хидмати муҳимтарин дар кластер фаъолият мекунад. Имсол мо ба нақшаи гузариш ба шабакаи пурраи хидматрасонӣ бо кашфи пешрафтаи хидматрасонӣ, шикастани схемаҳо, муайян кардани фарқиятҳо, маҳдудияти суръат ва пайгирӣ нақша дорем.

Гузариши Tinder ба Kubernetes
Расми 3–1. Конвергенсияи CPU як хидмат ҳангоми гузариш ба Envoy

Гузариши Tinder ба Kubernetes

Гузариши Tinder ба Kubernetes

Натиҷаи ниҳоӣ

Тавассути ин таҷриба ва таҳқиқоти иловагӣ, мо як дастаи пурқуввати инфрасохторӣ сохтем, ки дорои малакаҳои қавӣ дар тарҳрезӣ, ҷойгиркунӣ ва истифодабарии кластерҳои бузурги Kubernetes мебошад. Ҳама муҳандисони Tinder ҳоло дониш ва таҷрибаи бастабандии контейнерҳо ва ҷойгиркунии замимаҳо дар Kubernetes доранд.

Вақте ки зарурати иқтидори иловагӣ дар инфрасохтори кӯҳна ба миён омад, мо маҷбур шудем, ки якчанд дақиқа интизор шавем, то инстанцияҳои нави EC2 оғоз шаванд. Акнун контейнерҳо ба кор шурӯъ мекунанд ва коркарди трафикро дар тӯли сонияҳо ба ҷои дақиқаҳо оғоз мекунанд. Банақшагирии контейнерҳои сершумор дар як мисоли EC2 инчунин консентратсияи уфуқии беҳтарро таъмин мекунад. Дар натиҷа, мо дар соли 2019 нисбат ба соли гузашта коҳиши назарраси хароҷоти EC2-ро пешбинӣ мекунем.

Муҳоҷират тақрибан ду сол тӯл кашид, аммо мо онро дар моҳи марти соли 2019 анҷом додем. Дар айни замон, платформаи Tinder танҳо дар кластери Kubernetes кор мекунад, ки аз 200 хидмат, 1000 гиреҳ, 15 қуттиҳо ва 000 контейнерҳои корӣ иборат аст. Инфрасохтор дигар домени ягонаи гурӯҳҳои амалиётӣ нест. Ҳамаи муҳандисони мо ин масъулиятро ба ӯҳда доранд ва раванди сохтан ва ҷойгиркунии замимаҳои худро танҳо бо истифода аз код назорат мекунанд.

PS аз тарҷумон

Инчунин як қатор мақолаҳоро дар блоги мо хонед:

Манбаъ: will.com

Илова Эзоҳ