Гузаронидани Тиндер ба Кубернетес

Муаллиф: Крис О'Брайен, Менеҷери Муҳандисӣ | Крис Томас, Менеҷери Муҳандисӣ | Ҷинён Ли, Муҳандиси калони нармафзор | Таҳрир аз ҷониби: Купер Ҷексон, Муҳандис оид ба нармафзор

Чаро

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

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

Ин осон набуд. Ҳангоми муҳоҷирати мо дар аввали соли 2019, мо ба доираи кластерии Кубернетес худ расидем ва аз сабаби ҳаҷми трафик, андозаи кластер ва DNS ба мушкилоти мухталиф дучор шудем. Мо масъалаҳои ҷолибро барои муҳоҷират кардани 200 хидмат ҳал намудем ва кластери Кубернетесро дар миқдори 1000 гиреҳ, 15,000 қуттӣ ва 48,000 контейнерҳои даврӣ иҷро кардем.

Чӣ хел

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

Сохтани тасвирҳо барои Кубернетес

Дар хадамоти кластерии Кубернетес зиёда аз 30 анбори такмили ихтисос барои микросервисҳо мавҷуданд. Рамз дар ин анборҳо бо забонҳои мухталиф навишта шудааст (масалан, Node.js, Java, Scala, Go) бо муҳитҳои сершумор барои як забон.

Системаи сохташуда барои кор дар "микросхемаи сохташуда" барои ҳар як хидматрасонии махсус таҳия шудааст, ки маъмулан аз Dockerfile ва як қатор фармонҳои ниҳонӣ иборат аст. Гарчанде ки мундариҷаи онҳо пурра танзимшаванда аст, ин контексти сохташуда ҳама бо формати стандартишуда навишта мешаванд. Стандартисозии контекстҳои сохташуда ба системаи ягонаи сохтмон имкон медиҳад, ки тамоми хадамоти хидматрасонро анҷом диҳад.

Тасвири 1-1 Раванди стандартизатсияи сохтмон тавассути контейнери Builder

Бо мақсади ба даст овардани мувофиқати максималӣ дар муҳити корӣ, ҳамон як раванди сохтан дар марҳилаи таҳия ва озмоиш истифода мешавад. Вақте ки ба мо лозим омад, ки роҳи кафолати муҳити созгорро дар саросари платформа тартиб диҳем, ин як масъалаи душвореро ба миён овард. Дар натиҷа, ҳамаи равандҳои сохтмон дар як контейнери махсуси "Созанда" иҷро карда мешаванд.

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

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

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

Ҳаҷми кластерҳо

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

Мо қарор додем:

  • м5.4 зиёд кардани назорат (Prometheus)
  • c5.4xlarge барои бори кории Node.js (бори кории ришта)
  • c5.2xjge барои Java ва Go (бори кории бисёр ришта)
  • c5.4харч кардани ҳавопаймои назоратӣ (3 гиреҳ)

Муҳоҷират

Яке аз қадамҳои омодагӣ ба гузариш аз инфрасохтори кӯҳнаи мо ба Кубернетес ин тағир додани алоқаи мавҷудаи хидматрасонӣ ба хидматрасонӣ ба нуқтаи нави Elastic Balancing Balancers (ELBs) мебошад, ки дар зершахши махсуси виртуалии хусусӣ (VPC) сохта шудаанд. Ин зершабақа ба Кубернетес VPC нигаронида шудааст. Ин ба мо имкон дод, ки модулҳоро бидуни новобаста аз фармоиши мушаххас барои вобастагӣ аз хидмат муҳоҷирона интиқол диҳем.

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

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

Омӯзишҳо

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

Дар субҳи барвақти 8 январи соли 2019, Платформаи Тиндер ба шиддати шадид дучор омад. Дар посух ба афзоиши номусоиди таваққуфи платформа қабл аз он субҳ ҳисобҳои pod ва гиреҳҳо дар кластер муайян карда шуданд. Ин дар тамоми гиреҳи мо фарсоиши кэши ARP ба амал овард.

Се арзиши Linux, ки ба кэши ARP алоқаманданд, мавҷуданд:

Қарз

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

Мо Flannelро ҳамчун матои шабакавии худ дар Кубернетес истифода мебарем. Пакетҳо тавассути VXLAN интиқол дода мешаванд. VXLAN як тарҳбандии қабати Layer 2 аз болои шабакаи Layer 3 мебошад. Он барои таъмин кардани васила барои васеъ кардани сегменти шабакаи Layer 2 протоколи MAC-дар дохили истифодабаранда барои протокол (MAC-in-UDP) -ро истифода мебарад. Протоколи интиқол тавассути шабакаи маркази физикӣ дода мешавад IP plus UDP.

Тасвири 2-1 Диаграммаи фланел (қарз)

Тасвири 2-2 Бастаи VXLAN (қарз)

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

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

Дар муҳити мо ин намуди муошират хеле маъмул аст. Барои объектҳои хидматрасонии Kubernetes мо ELB сохта мешавад ва Kubernetes ҳар гиреҳро бо ELB ба қайд мегирад. ELB дарк намекунад ва гиреҳи интихобшуда метавонад макони ниҳоии пакет набошад. Ин аст, ки вақте гиреҳ пакетро аз ELB мегирад, вай қоидаҳои ипптболро барои хидмат арзёбӣ мекунад ва ба таври тасодуфӣ як гиреҳро дар гиреҳи дигар интихоб мекунад.

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

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

Ноустувории коргузории DNS дар миқёс

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

Вақте ки мо хидматҳои бештар ва бештарро ба Кубернетс савор кардем, мо дарёфтем, ки DNS хидмат мекунад, ки 250,000 дархостро дар як сония посух медиҳад. Мо дар вақти барномаҳои худ ҷустуҷӯи муваққатӣ ва таъсирбахши DNS дучор шудем. Ин бо вуҷуди талошҳои мукаммал ва танзими провайдери DNS ба густариши CoreDNS рух дод, ки дар як вақт ба 1000 қуттӣ 120 cores расидааст.

Ҳангоми таҳқиқи дигар сабабҳо ва роҳҳои эҳтимолӣ, мо як мақолаеро ёфтем, ки ҳолати нажодро, ки ба шабакаи netfilter филтркунии Linux пакет таъсир мерасонанд, тасвир мекунад. Вақти истилоҳи DNS, ки мо мебинем, дар баробари интерфейси ҳисобкунаки дохил_файл дар интерфейси Flannel, бо бозёфтҳои мақола ҳамоҳанг шудааст.

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

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

Мо тасмим гирифтем, ки бо ин усул ба пеш ҳаракат кунем. CoreDNS ҳамчун DaemonSet дар Кубернетс ҷойгир карда шуд ва мо сервери локалии DNS-ро ба ҳалли ҳар як навори podNS тавассути танзимкунии кубел - кластер-dns парчам ворид кардем. Гузаронидани давр барои хотимаи DNS самаранок буд.

Аммо, мо то ҳол мебинем, ки бастаҳои партофташуда ва афзори ҳисобкунии интерфейси Flannel's_failed. Ин ҳатто пас аз лағзиши дар боло зикрёфта боқӣ хоҳад монд, зеро мо аз SNAT ва / ё DNAT барои трафики DNS канорагирӣ кардем. Ҳолати мусобиқа барои дигар намудҳои ҳаракати нақлиёт ҳамоно идома хоҳад ёфт. Хушбахтона, аксарияти бастаҳои мо TCP мебошанд ва вақте ки ин ҳолат ба амал меояд, пакетҳо бомуваффақият интиқол дода мешаванд. Таъмини дарозмуддат барои ҳама намудҳои трафик ин чизеест, ки мо ҳоло мавриди муҳокима қарор медиҳем.

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

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

Як сабукии дигаре, ки мо истифода кардем ин буд, ки ба таври сунъӣ дархостҳои манбаъро дар хидматҳои интиқодӣ ба таври сунъӣ афзоиш диҳад, то pods colocated дар паҳлӯҳои дигари вазнин ҷойҳои бештаре дошта бошанд. Ин инчунин дар дурнамои дароз аз ҳисоби партовҳои манбаъ қобилиятнок нахоҳад буд ва барномаҳои Node мо ягона ришта карда мешуданд ва бинобар ин дар 1 ядро ​​самаранок пӯшонида мешуданд. Ягона роҳи ҳалли беҳтар ин истифодаи тавозуни беҳтар буд.

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

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

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

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

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

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

Тасвири 3-1 Ҳамоҳангсозии CPU дар як хидмат ҳангоми интиқол ба намоянда

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

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

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

Ин тақрибан ду солро талаб кард, аммо мо муҳоҷирати худро дар моҳи марти соли 2019 ба итмом расонидем. Платформаи Tinder танҳо дар кластери Кубернетес иборат аст, ки аз 200 хидмат, 1000 гиреҳ, 15,000 қуттӣ ва 48,000 контейнер иборат аст. Инфрасохтор дигар барои гурӯҳҳои амалиёти мо нигоҳ дошта намешавад. Ба ҷои ин, муҳандисон дар саросари созмон дар ин масъулият саҳм мегиранд ва назорат мекунанд, ки чӣ гуна барномаҳои онҳо бо ҳама рамзҳо сохта ва татбиқ карда мешаванд.