Пераезд Тиндара ў Кубернэтэс

Аўтар: Крыс О'Браэн, менеджэр па інжынерыі | Крыс Томас, менеджэр па інжынерыі | Jinyong Lee, старэйшы праграмны інжынер | Рэдагаваў: Купер Джэксан, інжынер праграмнага забеспячэння

Чаму

Амаль два гады таму Tinder вырашыў перанесці сваю платформу ў Kubernetes. Kubernetes прадаставіла нам магчымасць накіраваць Tinder Engineering у бок кантэйнізацыі і працы з малым дотыкам праз нязменнае разгортванне. Будаўніцтва, разгортванне і інфраструктура прыкладання будуць вызначаны як код.

Мы таксама хацелі вырашыць праблемы маштабу і стабільнасці. Калі маштабаванне стала крытычным, мы часта перажывалі некалькі хвілін чакання, калі новыя выпадкі EC2 выйдуць у Інтэрнэт. Ідэя планавання кантэйнераў і абслугоўвання трафіку за лічаныя секунды была нам прывабная.

Гэта было няпроста. Падчас нашай міграцыі ў пачатку 2019 года мы дасягнулі крытычнай масы ў нашым кластэры Kubernetes і пачалі сутыкацца з рознымі праблемамі з-за аб'ёму трафіку, памеру кластара і DNS. Мы вырашылі цікавыя задачы па пераносу 200 службаў і запуску кластара Kubernetes з маштабам, які налічвае 1000 вузлоў, 15000 струкоў і 48 000 запушчаных кантэйнераў.

Як

З студзеня 2018 года мы прабіраліся праз розныя этапы міграцыйных намаганняў. Мы пачалі з кантэйнеравання ўсіх нашых службаў і размяшчэння іх у серыі Kubernetes, дзе размешчана пастаноўка. З кастрычніка мы пачалі метадычна пераносіць усе нашы спадчынныя паслугі ў Kubernetes. Да сакавіка наступнага года мы завяршылі сваю міграцыю і платформа Tinder зараз працуе выключна на Кубернэце.

Стварэнне малюнкаў для Кубернетаў

Існуе больш за 30 сховішчаў зыходнага кода для мікрасэрвісаў, якія працуюць у кластэры Kubernetes. Код у гэтых сховішчах пішацца на розных мовах (напрыклад, Node.js, Java, Scala, Go) з некалькімі асяроддзямі выканання для адной мовы.

Сістэма зборкі распрацавана для працы з цалкам наладжвальным кантэкстам зборкі для кожнай мікрасэрвісы, які звычайна складаецца з Dockerfile і шэрагу каманд абалонак. Нягледзячы на ​​тое, што іх змест цалкам наладжваецца, усе гэтыя кантэксты зборкі пішуцца пры дапамозе стандартызаванага фармату. Стандартызацыя кантэкстаў зборкі дазваляе адзінай сістэме зборкі апрацоўваць усе мікрасэрвісы.

Малюнак 1–1 Стандартызаваны працэс зборкі праз кантэйнер Builder

Для дасягнення максімальнай узгодненасці асяроддзя выканання падчас этапу распрацоўкі і тэставання выкарыстоўваецца адзін і той жа працэс зборкі. Гэта выклікала унікальную праблему, калі нам трэба было распрацаваць спосаб гарантаваць паслядоўную сераду пабудовы на ўсёй платформе. У выніку ўсе працэсы зборкі выконваюцца ў спецыяльным кантэйнеры "Builder".

Рэалізацыя кантэйнера Builder патрабавала шэрагу ўдасканаленых метадаў Docker. Гэты кантэйнер Builder успадкоўвае мясцовыя ідэнтыфікатары карыстальніка і сакрэты (напрыклад, ключ SSH, уліковыя дадзеныя AWS і г.д.) па меры неабходнасці для доступу да прыватных сховішчаў Tinder. Ён мацуе мясцовыя каталогі, якія змяшчаюць зыходны код, каб мець натуральны спосаб захоўвання артэфактаў. Такі падыход павышае прадукцыйнасць, таму што ён выключае капіяванне створаных артэфактаў паміж кантэйнерам Builder і хост-машынай. Захаваныя артэфакты зборкі будуць выкарыстаны ў наступны раз без дадатковай канфігурацыі.

Для некаторых службаў нам трэба было стварыць яшчэ адзін кантэйнер у Builder, каб ён адпавядаў асяроддзі часу кампіляцыі і асяроддзі выканання (напрыклад, усталяванне бібліятэкі bcrypt Node.js стварае бінарныя артэфакты, характэрныя для платформы). Патрабаванні да часу кампіляцыі могуць адрознівацца паміж паслугамі, а выніковы Dockerfile складаецца з хады.

Архітэктура і міграцыя кубернетаўскіх кластараў

Памер кластара

Мы вырашылі выкарыстаць кубе-айс для аўтаматызаванага забеспячэння кластараў у асобніках Amazon EC2. Мы рана запускалі ўсё ў адзін агульны пул. Мы хутка вызначылі неабходнасць падзелу працоўных нагрузак на розныя памеры і тыпы асобнікаў, каб лепш выкарыстоўваць рэсурсы. Разважанне заключалася ў тым, што выкарыстанне меншай колькасці моцна разьбовых струкоў разам дало больш прагназуемыя вынікі для нас, чым дазволіць ім суіснаваць з вялікай колькасцю аднаразовых струкоў.

Мы спыніліся на:

  • m5.4xlarge для маніторынгу (Prometheus)
  • c5.4xlarge для загрузкі Node.js (аднапаточная праца)
  • c5.2xlarge для Java і Go (шматструменная праца)
  • c5.4павялічэнне для плоскасці кіравання (3 вузла)

Міграцыя

Адзін з этапаў падрыхтоўкі да пераходу ад старой інфраструктуры да Kubernetes заключаўся ў змене існуючай сувязі паміж паслугамі і ўказваць на новыя эластычныя балансары нагрузкі (ELBs), якія былі створаны ў пэўнай падсеткі Virtual Private Cloud (VPC). Гэтая падсетка была падгледжана да VPC Kubernetes. Гэта дазволіла нам мноства міграваць модулі без уліку канкрэтнага парадку залежнасці ад службы.

Гэтыя канчатковыя кропкі былі створаны з узважаным наборам запісаў DNS, які CNAME паказваў на кожны новы ELB. Каб перакрыцьцё, мы дадалі новую пласцінку, паказваючы на ​​новую службу Kubernetes ELB з масай 0. Затым мы ўсталёўваем Time To Live (TTL) на запісе, усталяваным на 0. Старыя і новыя вагі потым павольна падганяліся да у канчатковым выніку на новым серверы 100%. Пасля завяршэння перакрыцця TTL быў усталяваны на нешта больш разумнае.

Нашы модулі Java адзначылі нізкі TTL DNS, але нашы прыкладання Node гэтага не зрабілі. Адзін з нашых інжынераў перапісаў частку кода пула злучэння, каб загарнуць яго ў мэнэджар, які б абнаўляў басейны кожныя 60-я. Гэта атрымалася вельмі добра для нас, не маючы прыкметнага выканання.

Вучэнні

Абмежаванні сеткавых тканін

У раннія ранішнія гадзіны 8 студзеня 2019 года платформа Tinder's пацярпела працяглы адключэнне. У адказ на незвязанае павелічэнне затрымкі платформы раней гэтай раніцы, колькасць стручкоў і вузлоў маштабуецца на класце. Гэта прывяло да знясілення кэш ARP на ўсіх нашых вузлах.

Ёсць тры значэнні Linux, якія адносяцца да кэш ARP:

Крэдыт

gc_thresh3 - цвёрдая фуражка. Калі вы атрымліваеце запісы ў журнале "перапаўненне суседскай табліцы", гэта паказвае на тое, што нават пасля сінхроннага збору смецця (GC) кэша ARP не хапала месца для захоўвання запісу суседа. У гэтым выпадку ядро ​​проста ня скідае пакет.

Мы выкарыстоўваем Flannel у якасці тканіны сеткі ў Kubernetes. Пакеты накіроўваюцца праз VXLAN. VXLAN - гэта схема накладання пласта 2 у сетцы 3 ўзроўню. Ён выкарыстоўвае інкапсуляцыю MAC-адрас у карыстацкім пратаколе (MAC-у-UDP), каб забяспечыць магчымасць пашырэння сеткавых сегментаў ўзроўню 2. Пратакол транспарту па сетцы фізічных цэнтраў апрацоўкі дадзеных складае IP плюс UDP.

Малюнак 2–1 фланелевая схема (крэдыт)

Малюнак 2–2 VXLAN-пакет (крэдыт)

Кожны рабочы вузел Kubernetes вылучае ўласную / 24 віртуальнай прасторы адрасы з большага / 9 блока. Для кожнага вузла гэта прывядзе да 1 запісу табліцы маршрутаў, 1 запісу табліцы ARP (у інтэрфейсе flannel.1) і 1 запісу базы дадзеных пераадрасацыі (FDB). Яны дадаюцца пры першым запуску вузла работніка альбо пры выяўленні кожнага новага вузла.

Акрамя таго, сувязь "ад вузла да струка" (ці "пад-да-струк") у канчатковым рахунку праходзіць праз інтэрфейс eth0 (намаляваны на дыяграме Фланеля вышэй). Гэта прывядзе да дадатковай запісы ў табліцы ARP для кожнага адпаведнага крыніцы вузла і пункта прызначэння.

У нашых умовах такі тып зносін сустракаецца вельмі часта. Для нашых аб'ектаў службы Kubernetes ствараецца ELB, і Kubernetes рэгіструе кожны вузел з ELB. ELB не ведае, і выбраны вузел не можа быць канчатковым пунктам прызначэння пакета. Гэта таму, што, калі вузел атрымлівае пакет ад ELB, ён ацэньвае свае правілы iptables для службы і выпадкова выбірае стручок на іншым вузле.

На момант адключэння ў класце было 605 агульных вузлоў. Па прычынах, выкладзеных вышэй, гэтага было дастаткова, каб зацьміць значэнне gc_thresh3 па змаўчанні. Як толькі гэта адбудзецца, у табліцы ARP адсутнічаюць не толькі пакеты, але і ўвесь Flannel / 24s віртуальнай прасторы. Збой камунікацыі вузла ў стручку і пошуку DNS. (DNS размешчаны ў кластары, як будзе падрабязней растлумачана ў гэтым артыкуле.)

Для вырашэння значэння gc_thresh1, gc_thresh2 і gc_thresh3 павышаюцца, і Flannel неабходна перазапусціць, каб перарэгістраваць адсутнічаюць сеткі.

Нечакана працуе DNS на маштабе

Каб з улікам нашай міграцыі мы актыўна выкарыстоўвалі DNS для палягчэння фарміравання трафіку і паэтапнага пераключэння са спадчыны ў Кубернэты для нашых паслуг. Мы ўсталёўваем адносна нізкія значэнні TTL на звязаных Route53 RecordSets. Калі мы запусцілі састарэлую інфраструктуру ў асобніках EC2, наша канфігурацыя дазволу паказала на DNS Amazon. Мы ўспрымалі гэта як належнае, і кошт параўнальна нізкага TTL за нашы паслугі і паслугі Amazon (напрыклад, DynamoDB) засталася ў асноўным незаўважанай.

Калі мы з'яўляліся ўсё большай і большай колькасцю паслуг Kubernetes, мы апынуліся службе DNS, якая адказвала на 250 000 запытаў у секунду. У нашых прыкладаннях мы сутыкнуліся з перарывістымі і ўражлівымі таймаўтамі пошуку DNS. Гэта адбылося, нягледзячы на ​​вычарпальную наладу намаганняў і пераход пастаўшчыка DNS на разгортванне CoreDNS, які ў свой час дасягнуў максімуму ў 1000 струкоў, спажываючы 120 ядраў.

У ходзе даследавання іншых магчымых прычын і рашэнняў мы знайшлі артыкул, якая апісвае стан гонкі, якія ўплываюць на рамкі фільтравання пакетаў Linux netfilter. Часы таймаўтаў DNS, якія мы назіралі, разам з павелічэннем лічыльніка insert_failed на інтэрфейсе Flannel, у адпаведнасці з высновамі артыкула.

Гэтая праблема ўзнікае падчас перакладу сеткавых крыніц і крыніц прызначэння (SNAT і DNAT) і наступнай устаўкі ў табліцу здымка. Адзін з варыянтаў абмеркавання, які абмяркоўваўся ўнутры і прапанаваны супольнасцю, заключаўся ў перамяшчэнні DNS на сам рабочы вузел. У гэтым выпадку:

  • SNAT не патрэбны, таму што трафік знаходзіцца на лакальным вузле. Яго не трэба перадаваць праз інтэрфейс eth0.
  • DNAT не патрэбны, бо IP прызначэння з'яўляецца лакальным для вузла, а не выпадкова абраным стручком па правілах iptables.

Мы вырашылі рухацца з такім падыходам. CoreDNS быў разгорнуты як DaemonSet у Kubernetes, і мы ўводзілі лакальны DNS-сервер вузла ў Resv.conf кожнага струка, наладжваючы камандны сцяг kubelet - cluster-dns. Рашэнне было эфектыўным для таймаўтаў DNS.

Аднак мы па-ранейшаму бачым скінутыя пакеты і прырост лічыльніка ўстаўкі Flannel. Гэта будзе захоўвацца і пасля вышэйзгаданага рашэння, таму што мы пазбягалі толькі SNAT і / або DNAT для трафіку DNS. Умова гонкі ўсё яшчэ будзе мець месца для іншых відаў руху. На шчасце, большасць нашых пакетаў - гэта TCP, і калі гэта стане, пакеты будуць паспяхова перададзены. Доўгатэрміновае рашэнне для ўсіх відаў трафіку - гэта тое, што мы ўсё яшчэ абмяркоўваем.

Выкарыстанне паслання для паляпшэння балансавання нагрузкі

Калі мы перанеслі нашы сервісы ў Kubernetes, мы пачалі пакутаваць ад незбалансаванай нагрузкі на струкі. Мы выявілі, што дзякуючы HTTP Keepalive злучэнні ELB затрымаліся на першых гатовых струках кожнага разгортвання, таму большасць трафіку цякла праз невялікі адсотак наяўных струкоў. Адно з першых змякчальных мер, якія мы паспрабавалі, было выкарыстанне 100% MaxSurge для новых разгортванняў для злосных парушальнікаў. Гэта было нязначна эфектыўным і не ўстойлівым доўгатэрміновым перыядам пры некаторых буйных разгортваннях.

Яшчэ адно змякчэнне, якое мы выкарыстоўвалі, было штучна завышаць запыты на рэсурсы для крытычна важных службаў, каб каляровыя струкі мелі большы запас, акрамя іншых цяжкіх струкоў. Гэта таксама не збіралася ў канчатковым рахунку з-за адходаў рэсурсаў, і нашы прыкладанні ў вузле былі аднапоточныя і, такім чынам, эфектыўна абмежаваныя ў 1 ядры. Адзіным відавочным рашэннем было выкарыстанне лепшага балансавання нагрузкі.

Мы з унутранай думкай хацелі ацаніць пасланца. Гэта дало нам магчымасць разгарнуць яго вельмі абмежаваным чынам і атрымаць неадкладныя выгады. Пасланнік - гэта высокаэфектыўны проксі-сервер Layer 7, які працуе з адкрытым зыходным кодам і прызначаны для вялікіх сэрвісна-арыентаваных архітэктур. Ён здольны ўкараняць перадавыя метады балансавання нагрузкі, уключаючы аўтаматычныя спробы, разрыў ланцуга і абмежаванне глабальнай хуткасці.

Канфігурацыя, якую мы прыдумалі, заключалася ў тым, каб побач з кожным стручком, які меў адзін маршрут і кластар, каб патрапіць у лакальны кантэйнерны порт, была калыска пасланца. Каб звесці да мінімуму патэнцыял каскаду і захаваць невялікі радыус выбуху, мы выкарысталі флот фронтавых проксі-сервераў Envoy, па адным разгортванні ў кожнай зоне даступнасці (AZ) для кожнай службы. Яны патрапілі ў невялікі механізм выяўлення сэрвісу, які сабраў адзін з нашых інжынераў, які проста вярнуў спіс струкоў у кожнай АЗ за пэўную паслугу.

Затым служба "Фронт-Пасланнікі" выкарыстала гэты механізм выяўлення паслуг з дапамогай аднаго кластара і маршруту ўзыходзячага шляху. Мы наладзілі разумныя тайм-аўты, узмацнілі ўсе налады аўтаматычнага выключальніка, а потым усталявалі мінімальную паўторную канфігурацыю для дапамогі ў пераходных збоях і плаўных разгортваннях. Мы развязалі кожную з гэтых службаў перадпасылкі з дапамогай TCP ELB. Нават калі захавальнік ад нашага галоўнага проксі-слаёў быў замацаваны на пэўных стручках пасланнікаў, яны значна лепш спраўляліся з нагрузкай і былі настроены, каб збалансаваць баланс праз мінімальны запыт.

Для разгортвання мы выкарыстоўвалі кручок preStop як на дадатку, так і на калысцы. Гэты кручок называецца праверкай здароўя калыскі правал канчатковай кропкі адміністратара, разам з невялікім сном, каб даць некаторы час, каб дазволіць злучэнні з паветраным святлом завяршыцца і сцячы.

Адна з прычын, чаму нам удалося перабрацца так хутка, была дзякуючы багатай метрыцы, якую мы змаглі лёгка інтэграваць у наш звычайны рэжым Праметэя. Гэта дазволіла нам убачыць, што менавіта адбываецца, калі мы паўтарылі налады канфігурацыі і скарацілі трафік.

Вынікі былі неадкладныя і відавочныя. Мы пачалі з самых незбалансаваных сэрвісаў, і ўжо зараз яны працуюць перад дванаццаццю самых важных службаў нашага кластара. У гэтым годзе мы плануем перайсці да сеткі з поўным абслугоўваннем з больш прасунутым выяўленнем службы, разрывам ланцуга, выяўленнем па-за межамі, абмежаваннем хуткасці і трасіроўкай.

Малюнак 3–1 канвергенцыя працэсара адной службы падчас скарачэння да паслання

Канчатковы вынік

Дзякуючы гэтым навучанням і дадатковым даследаванням мы распрацавалі моцную ўнутраную інфраструктурную каманду з вялікім знаёмствам па распрацоўцы, разгортванні і эксплуатацыі вялікіх кластараў Kubernetes. Цяпер уся інжынерная арганізацыя Tinder мае веды і вопыт, як зрабіць кантэйнеры і разгарнуць свае прыкладанні ў Kubernetes.

У нашай спадчыннай інфраструктуры, калі патрабаваліся дадатковыя маштабы, мы часта цярпелі некалькі хвілін чакання, калі новыя выпадкі EC2 выйдуць у Інтэрнэт. Зараз кантэйнеры раскладу і абслугоўваюць рух на працягу некалькіх секунд, а не хвілін. Планаванне некалькіх кантэйнераў на адным асобніку EC2 таксама забяспечвае палепшаную гарызантальную шчыльнасць. У выніку мы праектуем значную эканомію сродкаў на EC2 у 2019 годзе ў параўнанні з папярэднім годам.

Прайшло амаль два гады, але мы завяршылі міграцыю ў сакавіку 2019 года. Платформа Tinder працуе выключна на кластары Kubernetes, які складаецца з 200 службаў, 1000 вузлоў, 15 000 струкоў і 48 000 запушчаных кантэйнераў. Інфраструктура ўжо не з'яўляецца задачай, адведзенай для нашых аператыўных груп. Замест гэтага інжынеры ўсёй арганізацыі падзяляюць гэтую адказнасць і маюць кантроль над тым, як іх прыкладанні будуюцца і разгортваюцца пры дапамозе ўсяго кода.

Глядзіце таксама

Як вы перашкаджаеце камусьці згадваць пра вас у Instagram?Сяброўка трапляе на хлопца на сваім Snapchat. Яна не выдаліла яго альбо скажа яму, каб адступіць па маёй просьбе, таму я асабіста адпраўляю яго ў Instagram і кажу яму, каб адключыць ад яе ўсе кантакты. Цяпер яна звар'яцела і называе мяне вар'ятам. Хто мае рацыю?Вы падкрэслілі, што з-за разводаў SnapChat? Чаму вы хочаце працягваць іх ісці?Як я магу выкарыстоўваць Instagram BioLink, каб зарабіць грошы?Чаму я магу размясціць \ u201csпрамакаць \ u201d Instagram гісторыі?Ці ёсць выхад, каб адключыць галасавыя паведамленні ад аўтаматычнай загрузкі на WhatsApp? Калі так, то які працэс гэта зрабіць?Ці трэба мне выдаліць свайго экс-паслядоўніка з Instagram? Я толькі што выявіў, што гэта магчыма. Кароткая гісторыя: гэта быў халодны разрыў, і мы так не размаўлялі (амаль 3 гады). Каго б больш нашкодзіць: ён абнаўляецца ў маім жыцці альбо адсякае?Як адключыць нечыя паведамленні Instagram на Android?