Tinder tranzisyon pou Kubernetes

Remak. trad.: Anplwaye sèvis Tinder ki pi popilè nan lemonn dènyèman te pataje kèk detay teknik sou migrasyon enfrastrikti yo nan Kubernetes. Pwosesis la te pran prèske dezan e li te lakòz lansman yon platfòm gwo echèl sou K8s, ki gen 200 sèvis ki te òganize sou 48 mil veso. Ki difikilte enteresan enjenyè Tinder yo te rankontre ak ki rezilta yo te rive? Li tradiksyon sa a.

Tinder tranzisyon pou Kubernetes

Poukisa?

Prèske de zan de sa, Tinder deside deplase platfòm li a nan Kubernetes. Kubernetes ta pèmèt ekip Tinder la nan kontenè epi ale nan pwodiksyon ak efò minim atravè deplwaman imuiabl (deplwaman imuiabl). Nan ka sa a, asanble aplikasyon yo, deplwaman yo, ak enfrastrikti nan tèt li ta dwe inikman defini pa kòd.

Nou t ap chèche tou yon solisyon pou pwoblèm évolutivité ak estabilite. Lè dekale te vin kritik, nou souvan te oblije rete tann plizyè minit pou nouvo ka EC2 yo vire. Lide a nan lanse resipyan ak kòmanse sèvi trafik nan segonn olye pou yo minit te vin trè atire nou.

Pwosesis la te tounen difisil. Pandan migrasyon nou an nan kòmansman ane 2019 la, gwoup Kubernetes la te rive nan yon mas kritik e nou te kòmanse rankontre divès pwoblèm akòz volim trafik, gwosè gwoup, ak DNS. Sou wout la, nou te rezoud yon anpil nan pwoblèm enteresan ki gen rapò ak imigre 200 sèvis ak kenbe yon gwoup Kubernetes ki gen ladan 1000 nœuds, 15000 gous ak 48000 kontenè k ap kouri.

Ki jan?

Depi janvye 2018, nou te pase plizyè etap nan migrasyon. Nou te kòmanse pa containerize tout sèvis nou yo epi deplwaye yo nan anviwònman nwaj tès Kubernetes. Kòmanse nan mwa Oktòb, nou te kòmanse metodikman imigre tout sèvis ki egziste deja nan Kubernetes. Nan mwa Mas nan ane annapre a, nou te konplete migrasyon an e kounye a, platfòm Tinder la kouri sèlman sou Kubernetes.

Bati imaj pou Kubernetes

Nou gen plis pase 30 depo kòd sous pou mikwosèvis ki kouri sou yon gwoup Kubernetes. Kòd la nan depo sa yo ekri nan diferan lang (pa egzanp, Node.js, Java, Scala, Go) ak plizyè anviwònman ègzekutabl pou menm lang.

Sistèm konstriksyon an fèt pou bay yon "kontèks bati" totalman personnalisable pou chak mikwosèvis. Li anjeneral konsiste de yon Dockerfile ak yon lis kòmandman koki. Kontni yo se konplètman customizable, epi an menm tan an, tout kontèks bati sa yo ekri dapre yon fòma ofisyèl. Estandize kontèks bati pèmèt yon sèl sistèm bati jere tout mikwosèvis yo.

Tinder tranzisyon pou Kubernetes
Figi 1-1. Pwosesis konstriksyon estanda atravè veso Builder

Pou reyalize maksimòm konsistans ant runtimes (anviwònman ègzekutabl) se menm pwosesis konstriksyon yo itilize pandan devlopman ak tès. Nou te fè fas a yon defi trè enteresan: nou te oblije devlope yon fason asire konsistans nan anviwònman an bati atravè tout platfòm la. Pou reyalize sa a, tout pwosesis asanble yo te pote soti nan yon veso espesyal. Konstrukteur.

Enplemantasyon veso li te mande teknik Docker avanse. Builder eritye ID itilizatè lokal la ak sekrè (tankou kle SSH, kalifikasyon AWS, elatriye) ki nesesè pou jwenn aksè nan depo Tinder prive. Li monte repèrtwar lokal ki gen sous natirèlman magazen bati zafè. Apwòch sa a amelyore pèfòmans paske li elimine nesesite pou kopye zafè bati ant veso Builder la ak lame a. Afèktik ki estoke yo ka itilize ankò san konfigirasyon adisyonèl.

Pou kèk sèvis, nou te oblije kreye yon lòt veso pou kat anviwònman konpilasyon an nan anviwònman an ègzekutabl (pa egzanp, bibliyotèk Node.js bcrypt la jenere zafè binè espesifik pou platfòm pandan enstalasyon an). Pandan pwosesis konpilasyon an, kondisyon yo ka varye ant sèvis, epi final Dockerfile konpile sou vole.

Achitekti gwoup Kubernetes ak migrasyon

Jesyon gwosè cluster

Nou deside itilize kube-aws pou deplwaman otomatik gwoup sou ka Amazon EC2. Nan kòmansman an anpil, tout bagay te travay nan yon sèl pisin komen nan nœuds. Nou te byen vit reyalize nesesite pou separe chaj travay yo pa gwosè ak kalite egzanp pou fè itilizasyon resous yo pi efikas. Lojik la te ke kouri plizyè chaje gous milti-threaded te vin pi previzib an tèm de pèfòmans pase viv ansanm ak yon gwo kantite gous sèl-threaded.

Nan fen a nou deside sou:

  • m5.4xlarge — pou siveyans (Prometheus);
  • c5.4xlarge - pou kantite travay Node.js (chaj travay yon sèl-threaded);
  • c5.2xlarge - pou Java and Go (chaj travay miltithreaded);
  • c5.4xlarge — pou panèl kontwòl la (3 nœuds).

Migrasyon

Youn nan etap preparasyon pou imigre soti nan ansyen enfrastrikti nan Kubernetes se te redireksyon kominikasyon dirèk ki deja egziste ant sèvis yo nan nouvo balans chaj yo (Elastic Load Balancers (ELB). Yo te kreye sou yon subnet espesifik nan yon nwaj prive vityèl (VPC). Sou-rezo sa a te konekte ak yon VPC Kubernetes. Sa a te pèmèt nou emigre modil piti piti, san yo pa konsidere lòd espesifik depandans sèvis yo.

Pwen final sa yo te kreye lè l sèvi avèk seri dosye DNS ki gen CNAME ki montre chak nouvo ELB. Pou chanje sou, nou te ajoute yon nouvo antre ki montre nouvo ELB nan sèvis Kubernetes ak yon pwa 0. Lè sa a, nou mete Time To Live (TTL) nan antre a mete a 0. Apre sa, ansyen ak nouvo pwa yo te. tou dousman ajiste, epi evantyèlman 100% nan chaj la te voye nan yon nouvo sèvè. Apre chanjman an te fini, valè TTL la tounen nan yon nivo ki pi bon.

Modil Java nou te genyen yo te kapab fè fas ak DNS TTL ki ba, men aplikasyon Node yo pa t 'kapab. Youn nan enjenyè yo reekri yon pati nan kòd pisin koneksyon an epi vlope l nan yon manadjè ki mete ajou pisin yo chak 60 segonn. Apwòch la chwazi a te travay trè byen epi san okenn degradasyon pèfòmans aparan.

Leson

Limit yo nan twal la rezo

Nan maten byen bonè 8 janvye 2019, platfòm Tinder la te fè aksidan san atann. An repons a yon ogmantasyon ki pa gen rapò nan latansi platfòm pi bonè maten sa a, kantite gous ak nœuds nan gwoup la te ogmante. Sa a te lakòz kachèt ARP yo te fin itilize sou tout nœuds nou yo.

Gen twa opsyon Linux ki gen rapò ak kachèt ARP:

Tinder tranzisyon pou Kubernetes
(sous)

gc_thresh3 - sa a se yon limit difisil. Aparans "tablo vwazen debòde" antre nan boutèy demi lit la te vle di ke menm apre koleksyon fatra synchrone (GC), pa te gen ase espas nan kachèt ARP pou estoke antre vwazen an. Nan ka sa a, nwayo a tou senpleman jete pake a nèt.

Nou itilize Flanèl kòm yon twal rezo nan Kubernetes. Pake yo transmèt sou VXLAN. VXLAN se yon tinèl L2 ki monte sou tèt yon rezo L3. Teknoloji a itilize MAC-in-UDP (MAC Address-in-User Datagram Protocol) ankapsulasyon epi li pèmèt ekspansyon segman rezo Kouch 2. Pwotokòl transpò sou rezo sant done fizik la se IP plis UDP.

Tinder tranzisyon pou Kubernetes
Figi 2–1. Dyagram flanèl (sous)

Tinder tranzisyon pou Kubernetes
Figi 2–2. pake VXLAN (sous)

Chak ne travayè Kubernetes asiyen yon espas adrès vityèl ak yon mask /24 ki soti nan yon blòk pi gwo /9. Pou chak ne sa a se vle di yon sèl antre nan tab la routage, yon sèl antre nan tab la ARP (sou koòdone nan flannel.1), ak yon antre nan tab la switching (FDB). Yo ajoute premye fwa yon ne travayè yo kòmanse oswa chak fwa yo dekouvri yon nouvo ne.

Anplis de sa, kominikasyon node-pod (oswa pod-pod) finalman ale nan koòdone la eth0 (jan yo montre nan dyagram flanèl ki anwo a). Sa a lakòz yon antre adisyonèl nan tablo ARP pou chak sous korespondan ak destinasyon lame.

Nan anviwònman nou an, kalite kominikasyon sa a trè komen. Pou objè sèvis nan Kubernetes, yo kreye yon ELB epi Kubernetes anrejistre chak ne ak ELB la. ELB pa konnen anyen sou gous ak ne chwazi a pa ka destinasyon final pake a. Pwen an se ke lè yon ne resevwa yon pake ki soti nan ELB a, li konsidere li pran an kont règ yo iptables pou yon sèvis espesifik ak owaza chwazi yon gous sou yon lòt ne.

Nan moman echèk la, te gen 605 nœuds nan gwoup la. Pou rezon ki endike anwo a, sa a te ase simonte siyifikasyon an gc_thresh3, ki se default la. Lè sa rive, pa sèlman pakè yo kòmanse tonbe, men tout espas adrès vityèl Flannel la ak yon mask /24 disparèt nan tab ARP la. Kominikasyon nœud-gous ak demann DNS entèwonp (DNS akomode nan yon gwoup; li pita nan atik sa a pou plis detay).

Pou rezoud pwoblèm sa a, ou bezwen ogmante valè yo gc_thresh1, gc_thresh2 и gc_thresh3 epi rekòmanse Flannel pou re-anrejistre rezo ki manke yo.

Okazyon DNS inatandi

Pandan pwosesis migrasyon an, nou aktivman itilize DNS pou jere trafik epi piti piti transfere sèvis soti nan ansyen enfrastrikti a nan Kubernetes. Nou mete valè TTL relativman ba pou RecordSets ki asosye nan Route53. Lè ansyen enfrastrikti a te kouri sou ka EC2, konfigirasyon rezolisyon nou an te lonje dwèt sou Amazon DNS. Nou te pran sa pou yo akòde ak enpak TTL ki ba a sou sèvis nou yo ak sèvis Amazon (tankou DynamoDB) te ale lajman inapèsi.

Kòm nou te imigre sèvis nan Kubernetes, nou te jwenn ke DNS t ap trete 250 mil demann pou chak segonn. Kòm yon rezilta, aplikasyon yo te kòmanse fè eksperyans timeout konstan ak grav pou demann DNS. Sa te rive malgre efò enkwayab pou optimize ak chanje founisè dns nan CoreDNS (ki nan pik chaj te rive nan 1000 gous kouri sou 120 nwayo).

Pandan n ap fè rechèch sou lòt kòz ak solisyon posib, nou dekouvri yon atik, ki dekri kondisyon ras ki afekte kad filtraj pake a filtè nèt nan Linux. Timeout yo nou obsève, makonnen ak yon kontwa ogmante insert_failed nan koòdone nan Flannel yo te konsistan avèk rezilta yo nan atik la.

Pwoblèm nan rive nan etap Tradiksyon Adrès Rezo Sous ak Destinasyon (SNAT ak DNAT) ak antre ki vin apre nan tablo a. kontre. Youn nan solisyon yo te diskite anndan ak sijere pa kominote a se te deplase DNS a nan ne travayè a tèt li. Nan ka sa:

  • SNAT pa nesesè paske trafik la rete andedan nœud la. Li pa bezwen achemine nan koòdone la eth0.
  • DNAT pa nesesè paske IP destinasyon an se lokal nan ne a, epi li pa yon gous chwazi owaza dapre règleman yo. iptables.

Nou te deside rete ak apwòch sa a. CoreDNS te deplwaye kòm yon DaemonSet nan Kubernetes epi nou te aplike yon sèvè DNS ne lokal nan rezolisyon.conf chak gous pa mete yon drapo --cluster-dns kòmandman kubelet . Solisyon sa a te tounen efikas pou DNS timeouts.

Sepandan, nou toujou wè pèt pake ak yon ogmantasyon nan kontwa an insert_failed nan koòdone nan flanèl. Sa a te kontinye apre solisyon an te aplike paske nou te kapab elimine SNAT ak/oswa DNAT pou trafik DNS sèlman. Kondisyon ras yo te konsève pou lòt kalite trafik. Erezman, pi fò nan pake nou yo se TCP, epi si yon pwoblèm rive yo tou senpleman retransmèt. Nou toujou ap eseye jwenn yon solisyon apwopriye pou tout kalite trafik.

Sèvi ak Envoy pou pi bon balans chaj

Pandan nou te imigre sèvis backend nan Kubernetes, nou te kòmanse soufri chaj dezekilib ant gous yo. Nou te jwenn ke HTTP Keepalive te lakòz koneksyon ELB yo pann sou premye gous yo pare nan chak deplwaman woule soti. Kidonk, gwo kantite trafik la te pase nan yon ti pousantaj gous ki disponib. Premye solisyon nou te teste a te mete MaxSurge a 100% sou nouvo deplwaman pou pi move senaryo. Efè a te tounen ensiyifyan ak san pwomès an tèm de pi gwo deplwaman.

Yon lòt solisyon nou te itilize se te ogmante atifisyèlman demann resous pou sèvis enpòtan yo. Nan ka sa a, gous yo mete tou pre ta gen plis espas pou manevwe konpare ak lòt gous lou. Li pa ta travay nan yon tan long tou paske li ta yon fatra nan resous. Anplis de sa, aplikasyon Node nou yo te yon sèl-threaded epi, kòmsadwa, te kapab itilize sèlman yon nwayo. Sèl solisyon reyèl la se te sèvi ak pi bon balans chaj.

Nou gen lontan te vle konplètman apresye anvwaye. Sitiyasyon aktyèl la te pèmèt nou deplwaye li nan yon fason trè limite epi jwenn rezilta imedya. Envoy se yon prokurasyon segondè-pèfòmans, sous ouvè, kouch XNUMX ki fèt pou gwo aplikasyon SOA. Li ka aplike teknik avanse balanse chaj, ki gen ladan retry otomatik, disjoncteurs, ak limit pousantaj mondyal. (Remak. trad.: Ou ka li plis sou sa nan atik sa a sou Istio, ki baze sou Envoy.)

Nou te vini ak konfigirasyon sa a: gen yon sidecar Envoy pou chak gous ak yon sèl wout, epi konekte gwoup la nan veso a lokalman atravè pò. Pou minimize potansyèl kaskad epi kenbe yon ti reyon frape, nou te itilize yon flòt gous devan Envoy, youn pou chak Zòn Disponibilite (AZ) pou chak sèvis. Yo te konte sou yon senp motè dekouvèt sèvis ekri pa youn nan enjenyè nou yo ki te tou senpleman retounen yon lis gous nan chak AZ pou yon sèvis bay yo.

Anvwaye devan sèvis yo te itilize mekanis dekouvèt sèvis sa a ak yon sèl gwoup ak wout en. Nou fikse delè adekwat, ogmante tout paramèt disjoncteurs yo, epi nou ajoute konfigirasyon minim eseye pou ede ak yon sèl echèk epi asire deplwaman lis. Nou te mete yon TCP ELB devan chak anvwaye sèvis sa yo. Menm si keepalive ki soti nan kouch proxy prensipal nou an te kole sou kèk gous Envoy, yo te toujou kapab jere chay la pi byen epi yo te konfigirasyon pou balanse atravè minimum_request nan backend la.

Pou deplwaman, nou te itilize zen preStop sou tou de gous aplikasyon ak gous sidecar. Kwòk la te deklanche yon erè nan tcheke estati pwen final admin ki sitiye sou veso sidecar la epi li te ale nan dòmi pou yon ti tan pou pèmèt koneksyon aktif sispann.

Youn nan rezon ki fè nou te kapab deplase tèlman vit se akòz mezi detaye ke nou te kapab fasilman entegre nan yon enstalasyon tipik Prometheus. Sa a te pèmèt nou wè egzakteman sa k ap pase pandan nou te ajiste paramèt konfigirasyon yo ak redistribiye trafik.

Rezilta yo te imedya ak evidan. Nou te kòmanse ak sèvis ki pi dezekilib yo, ak nan moman sa a li opere devan 12 sèvis ki pi enpòtan nan gwoup la. Ane sa a nou ap planifye yon tranzisyon nan yon may sèvis konplè ak dekouvèt sèvis pi avanse, rupture sikwi, deteksyon outlier, limit to ak trase.

Tinder tranzisyon pou Kubernetes
Figi 3–1. CPU dirèksyon nan yon sèl sèvis pandan tranzisyon an nan Envoy

Tinder tranzisyon pou Kubernetes

Tinder tranzisyon pou Kubernetes

Rezilta final la

Atravè eksperyans sa a ak rechèch adisyonèl, nou te konstwi yon ekip enfrastrikti solid ak ladrès solid nan konsepsyon, deplwaye, ak opere gwo gwoup Kubernetes. Tout enjenyè Tinder kounye a gen konesans ak eksperyans pou pake resipyan ak deplwaye aplikasyon pou Kubernetes.

Lè nesesite pou kapasite adisyonèl te parèt sou ansyen enfrastrikti a, nou te oblije tann plizyè minit pou nouvo enstans EC2 yo te lanse. Koulye a, veso yo kòmanse kouri epi yo kòmanse trete trafik nan kèk segonn olye pou yo minit. Orè plizyè resipyan sou yon sèl egzanp EC2 bay tou amelyore konsantrasyon orizontal. Kòm yon rezilta, nou prevwa yon rediksyon enpòtan nan depans EC2019 nan 2 konpare ak ane pase.

Migrasyon an te pran prèske dezan, men nou te konplete li nan mwa mas 2019. Kounye a, platfòm Tinder la kouri sèlman sou yon gwoup Kubernetes ki gen 200 sèvis, 1000 nœuds, 15 gous ak 000 kontenè k ap kouri. Enfrastrikti se pa sèl domèn ekip operasyon yo ankò. Tout enjenyè nou yo pataje responsablite sa a epi kontwole pwosesis pou konstwi ak deplwaye aplikasyon yo lè l sèvi avèk kòd sèlman.

PS soti nan tradiktè

Li tou yon seri de atik sou blog nou an:

Sous: www.habr.com

Add nouvo kòmantè