Tinder iyipada si Kubernetes

Akiyesi. itumọ.: Awọn oṣiṣẹ ti iṣẹ Tinder olokiki agbaye laipẹ pin diẹ ninu awọn alaye imọ-ẹrọ ti gbigbe awọn amayederun wọn si Kubernetes. Ilana naa gba to ọdun meji o si yorisi ifilọlẹ ti ipilẹ-ipele ti o tobi pupọ lori awọn K8, ti o ni awọn iṣẹ 200 ti o gbalejo lori awọn apoti 48 ẹgbẹrun. Awọn iṣoro iyanilẹnu wo ni awọn onimọ-ẹrọ Tinder pade ati awọn abajade wo ni wọn wa si? Ka itumọ yii.

Tinder iyipada si Kubernetes

Kí nìdí?

O fẹrẹ to ọdun meji sẹhin, Tinder pinnu lati gbe pẹpẹ rẹ si Kubernetes. Kubernetes yoo gba ẹgbẹ Tinder laaye lati ṣaja ati gbe si iṣelọpọ pẹlu ipa diẹ nipasẹ imuṣiṣẹ aileyipada (imuṣiṣẹ ti ko le yipada). Ni ọran yii, apejọ awọn ohun elo, imuṣiṣẹ wọn, ati awọn amayederun funrararẹ yoo jẹ asọye alailẹgbẹ nipasẹ koodu.

A tun n wa ojutu si iṣoro ti scalability ati iduroṣinṣin. Nigba ti igbelosoke di pataki, a nigbagbogbo ni lati duro fun awọn iṣẹju pupọ fun awọn iṣẹlẹ EC2 tuntun lati yi soke. Ero ti ifilọlẹ awọn apoti ati bẹrẹ sisẹ ijabọ ni iṣẹju-aaya dipo awọn iṣẹju di iwunilori pupọ si wa.

Ilana naa yipada lati nira. Lakoko ijira wa ni ibẹrẹ ọdun 2019, iṣupọ Kubernetes de ibi-pataki ati pe a bẹrẹ si ni alabapade awọn iṣoro pupọ nitori iwọn opopona, iwọn iṣupọ, ati DNS. Ni ọna, a yanju ọpọlọpọ awọn iṣoro ti o nifẹ si ti o ni ibatan si gbigbe awọn iṣẹ 200 ati mimu iṣupọ Kubernetes ti o ni awọn apa 1000, awọn adarọ-ese 15000 ati awọn apoti ṣiṣiṣẹ 48000.

Bawo ni?

Lati Oṣu Kini ọdun 2018, a ti lọ nipasẹ ọpọlọpọ awọn ipele ti ijira. A bẹrẹ nipasẹ gbigbe gbogbo awọn iṣẹ wa ati gbigbe wọn lọ si awọn agbegbe awọsanma idanwo Kubernetes. Bibẹrẹ ni Oṣu Kẹwa, a bẹrẹ ni ọna gbigbe gbogbo awọn iṣẹ ti o wa tẹlẹ si Kubernetes. Ni Oṣu Kẹta ti ọdun to nbọ, a pari iṣiwa naa ati ni bayi Syeed Tinder nṣiṣẹ ni iyasọtọ lori Kubernetes.

Awọn aworan ile fun Kubernetes

A ni ju awọn ibi ipamọ koodu orisun 30 fun awọn iṣẹ microservices ti nṣiṣẹ lori iṣupọ Kubernetes kan. Awọn koodu ti o wa ninu awọn ibi ipamọ wọnyi ni a kọ ni awọn ede oriṣiriṣi (fun apẹẹrẹ, Node.js, Java, Scala, Go) pẹlu awọn agbegbe akoko asiko pupọ fun ede kanna.

Eto kikọ naa jẹ apẹrẹ lati pese isọdi ni kikun “itumọ ọrọ” fun microservice kọọkan. Nigbagbogbo o ni Dockerfile ati atokọ ti awọn aṣẹ ikarahun kan. Akoonu wọn jẹ isọdi patapata, ati ni akoko kanna, gbogbo awọn ipo kikọ wọnyi ni a kọ ni ibamu si ọna kika idiwon. Standardizing Kọ àrà gba ọkan nikan Kọ eto lati mu gbogbo microservices.

Tinder iyipada si Kubernetes
olusin 1-1. Ilana kikọ ti a ṣe iwọn nipasẹ apoti Akole

Lati se aseyori o pọju aitasera laarin runtimes (awọn agbegbe akoko ṣiṣe) Ilana kikọ kanna ni a lo lakoko idagbasoke ati idanwo. A dojuko ipenija ti o nifẹ pupọ: a ni lati ṣe agbekalẹ ọna lati rii daju pe aitasera ti agbegbe kikọ kọja gbogbo pẹpẹ. Lati ṣaṣeyọri eyi, gbogbo awọn ilana apejọ ni a ṣe sinu eiyan pataki kan. Akole.

Imuse eiyan rẹ nilo awọn ilana Docker ilọsiwaju. Akole jogun ID olumulo agbegbe ati awọn aṣiri (bii bọtini SSH, awọn ẹri AWS, ati bẹbẹ lọ) ti o nilo lati wọle si awọn ibi ipamọ Tinder ikọkọ. O gbe awọn ilana agbegbe ti o ni awọn orisun lati tọju awọn ohun-ọṣọ kikọ nipa ti ara. Ọna yii ṣe ilọsiwaju iṣẹ nitori pe o yọkuro iwulo lati daakọ awọn ohun-ọṣọ kikọ laarin apoti Akole ati agbalejo naa. Awọn ohun-ọṣọ itumọ ti o fipamọ le ṣee tun lo laisi iṣeto ni afikun.

Fun diẹ ninu awọn iṣẹ, a ni lati ṣẹda apoti miiran lati ṣe maapu agbegbe akopọ si agbegbe asiko asiko (fun apẹẹrẹ, ile-ikawe Node.js bcrypt n ṣe agbekalẹ awọn ohun-ọṣọ alakomeji pato Syeed lakoko fifi sori ẹrọ). Lakoko ilana ikojọpọ, awọn ibeere le yatọ laarin awọn iṣẹ, ati pe Dockerfile ti o kẹhin jẹ akopọ lori fifo.

Kubernetes iṣupọ faaji ati ijira

Iṣakoso iwọn iṣupọ

A pinnu lati lo kube-aws fun imuṣiṣẹ iṣupọ adaṣe lori awọn iṣẹlẹ Amazon EC2. Ni ibẹrẹ akọkọ, ohun gbogbo ṣiṣẹ ni adagun-odo ti o wọpọ ti awọn apa. A ni kiakia mọ iwulo lati ya awọn ẹru iṣẹ sọtọ nipasẹ iwọn ati iru apẹẹrẹ lati ṣe lilo awọn orisun daradara siwaju sii. Imọran naa ni pe ṣiṣiṣẹ ọpọlọpọ awọn adarọ-ese olona-asapo ti kojọpọ yipada lati jẹ asọtẹlẹ diẹ sii ni awọn ofin ti iṣẹ ju ibagbepo wọn lọ pẹlu nọmba nla ti awọn adarọ-ese-ẹyọkan.

Ni ipari a pinnu lori:

  • m5.4x tobi - fun ibojuwo (Prometheus);
  • c5.4x tobi - fun Node.js iṣẹ-ṣiṣe (ẹrù iṣẹ-ṣiṣe-ẹyọkan);
  • c5.2x tobi - fun Java ati Go (ẹru iṣẹ ṣiṣe lọpọlọpọ);
  • c5.4x tobi - fun igbimọ iṣakoso (awọn apa 3).

Iṣilọ

Ọkan ninu awọn igbesẹ igbaradi fun gbigbe lati awọn amayederun atijọ si Kubernetes ni lati ṣe atunṣe ibaraẹnisọrọ taara ti o wa laarin awọn iṣẹ si awọn iwọntunwọnsi fifuye tuntun (Elastic Load Balancers (ELB). Wọn ṣẹda lori subnet kan pato ti awọsanma aladani foju kan (VPC). Subnet yii ti sopọ si Kubernetes VPC kan. Eyi gba wa laaye lati jade awọn modulu diėdiė, laisi gbero aṣẹ pato ti awọn igbẹkẹle iṣẹ.

Awọn aaye ipari wọnyi ni a ṣẹda nipa lilo awọn eto iwuwo ti awọn igbasilẹ DNS ti o ni awọn CNAME ti o tọka si ELB tuntun kọọkan. Lati yipada, a ṣafikun titẹ sii tuntun ti o tọka si ELB tuntun ti iṣẹ Kubernetes pẹlu iwuwo 0. A lẹhinna ṣeto Aago Lati Gbe (TTL) ti titẹsi ti a ṣeto si 0. Lẹhin eyi, awọn iwọn atijọ ati tuntun jẹ laiyara ni titunse, ati ki o bajẹ 100% ti awọn fifuye ti a rán si titun kan olupin. Lẹhin iyipada ti pari, iye TTL pada si ipele ti o peye diẹ sii.

Awọn modulu Java ti a ni le koju pẹlu TTL DNS kekere, ṣugbọn awọn ohun elo Node ko le. Ọkan ninu awọn onimọ-ẹrọ tun ṣe apakan ti koodu adagun asopọ asopọ ati pe o we sinu oluṣakoso ti o ṣe imudojuiwọn awọn adagun-odo ni gbogbo iṣẹju 60. Ọna ti a yan ṣiṣẹ daradara daradara ati laisi ibajẹ iṣẹ ṣiṣe akiyesi eyikeyi.

Awọn ẹkọ

Awọn ifilelẹ ti awọn Network Fabric

Ni kutukutu owurọ ti Oṣu Kini Ọjọ 8, Ọdun 2019, pẹpẹ Tinder kọlu lairotẹlẹ. Ni idahun si ilosoke ti ko ni ibatan ni idaduro Syeed ni kutukutu owurọ yẹn, nọmba awọn adarọ-ese ati awọn apa inu iṣupọ pọ si. Eyi jẹ ki kaṣe ARP rẹwẹsi lori gbogbo awọn apa wa.

Awọn aṣayan Linux mẹta wa ti o ni ibatan si kaṣe ARP:

Tinder iyipada si Kubernetes
(orisun)

gc_thresh3 - Eleyi jẹ kan lile iye to. Ifarahan ti awọn titẹ sii “tabili aponsedanu” ninu iwe akọọlẹ tumọ si pe paapaa lẹhin ikojọpọ idoti amuṣiṣẹpọ (GC), ko si aaye to ni kaṣe ARP lati tọju titẹsi adugbo. Ni ọran yii, ekuro naa da pakẹti naa silẹ patapata.

A lo Flannel bi asọ nẹtiwọki ni Kubernetes. Awọn apo-iwe ti wa ni gbigbe lori VXLAN. VXLAN jẹ eefin L2 ti a gbe soke lori oke nẹtiwọki L3 kan. Imọ-ẹrọ naa nlo MAC-in-UDP (MAC Adirẹsi-in-User Datagram Protocol) encapsulation ati ki o gba imugboroosi ti Layer 2 nẹtiwọki apa. Ilana irinna lori nẹtiwọọki ile-iṣẹ data ti ara jẹ IP pẹlu UDP.

Tinder iyipada si Kubernetes
Olusin 2–1. aworan atọka Flannel (orisun)

Tinder iyipada si Kubernetes
Olusin 2–2. package VXLAN (orisun)

Ipin oṣiṣẹ Kubernetes kọọkan n pin aaye adirẹsi foju foju kan pẹlu iboju-boju 24 lati bulọọki / 9 nla kan. Fun kọọkan ipade yi ni tumo si ọkan titẹsi ninu awọn afisona tabili, ọkan titẹsi ni ARP tabili (lori flannel.1 ni wiwo), ati ọkan titẹsi ninu awọn iyipada tabili (FDB). Wọn ti wa ni afikun ni igba akọkọ ti ipade osise kan ti bẹrẹ tabi ni igba kọọkan ti a ti ṣe awari ipade tuntun kan.

Ni afikun, node-pod (tabi pod-pod) ibaraẹnisọrọ nikẹhin lọ nipasẹ wiwo eth0 (gẹgẹ bi o ṣe han ninu aworan atọka Flannel loke). Eyi ni abajade ni afikun titẹsi ninu tabili ARP fun orisun kọọkan ti o baamu ati alejo gbigba.

Ni agbegbe wa, iru ibaraẹnisọrọ yii jẹ wọpọ pupọ. Fun awọn nkan iṣẹ ni Kubernetes, ELB ti ṣẹda ati Kubernetes ṣe iforukọsilẹ ipade kọọkan pẹlu ELB. ELB ko mọ nkankan nipa awọn adarọ-ese ati pe ipade ti o yan le ma jẹ opin irin ajo ti soso naa. Koko-ọrọ ni pe nigbati ipade kan ba gba apo kan lati ELB, o ka pe o ṣe akiyesi awọn ofin naa iptables fun iṣẹ kan pato ati laileto yan adarọ ese lori ipade miiran.

Ni akoko ikuna, awọn apa 605 wa ninu iṣupọ naa. Fun awọn idi ti a sọ loke, eyi to lati bori pataki naa gc_thresh3, eyi ti o jẹ aiyipada. Nigbati eyi ba ṣẹlẹ, kii ṣe awọn apo-iwe nikan bẹrẹ lati lọ silẹ, ṣugbọn gbogbo aaye adirẹsi foju Flannel pẹlu iboju-boju kan / 24 parẹ lati tabili ARP. Ibaraẹnisọrọ Node-pod ati awọn ibeere DNS jẹ idilọwọ (DNS ti gbalejo ni iṣupọ kan; ka nigbamii ni nkan yii fun awọn alaye).

Lati yanju isoro yi, o nilo lati mu awọn iye gc_thresh1, gc_thresh2 и gc_thresh3 ki o tun bẹrẹ Flannel lati tun forukọsilẹ awọn nẹtiwọki ti o padanu.

Airotẹlẹ DNS igbelosoke

Lakoko ilana iṣiwa, a lo DNS ni itara lati ṣakoso ijabọ ati gbe awọn iṣẹ diẹdiẹ lati awọn amayederun atijọ si Kubernetes. A ṣeto awọn iye TTL kekere kekere fun Awọn igbasilẹ igbasilẹ ti o somọ ni Route53. Nigbati awọn amayederun atijọ ti nṣiṣẹ lori awọn iṣẹlẹ EC2, iṣeto ipinnu ipinnu wa tọka si Amazon DNS. A gba eyi fun lasan ati ipa ti TTL kekere lori awọn iṣẹ wa ati awọn iṣẹ Amazon (bii DynamoDB) ko ṣe akiyesi pupọ.

Bi a ṣe ṣilọ awọn iṣẹ si Kubernetes, a rii pe DNS n ṣiṣẹ awọn ibeere 250 ẹgbẹrun fun iṣẹju kan. Bi abajade, awọn ohun elo bẹrẹ lati ni iriri igbagbogbo ati awọn akoko to ṣe pataki fun awọn ibeere DNS. Eyi ṣẹlẹ laisi awọn igbiyanju iyalẹnu lati mu ki o yipada olupese DNS si CoreDNS (eyiti o wa ni fifuye tente oke ti awọn adarọ-ese 1000 ti n ṣiṣẹ lori awọn ohun kohun 120).

Lakoko ti o n ṣe iwadii awọn idi miiran ti o ṣeeṣe ati awọn ojutu, a ṣe awari nkan, ti n ṣe apejuwe awọn ipo ere-ije ti o ni ipa lori ilana sisẹ apo àlẹmọ net ni Linux. Awọn akoko ipari ti a ṣakiyesi, papọ pẹlu iṣiro ti n pọ si ifibọ_kuna ni wiwo Flannel ni ibamu pẹlu awọn awari ti nkan naa.

Iṣoro naa waye ni ipele Orisun ati Itumọ Adirẹsi Nẹtiwọọki Nẹtiwọọki (SNAT ati DNAT) ati titẹ sii atẹle sinu tabili adehun. Ọkan ninu awọn agbegbe iṣẹ ti a jiroro ni inu ati imọran nipasẹ agbegbe ni lati gbe DNS si ipade oṣiṣẹ funrararẹ. Fun idi eyi:

  • SNAT ko nilo nitori ijabọ naa duro si inu ipade naa. O ko nilo lati wa ni ipa nipasẹ wiwo eth0.
  • DNAT ko nilo nitori ibiti IP ti nlo jẹ agbegbe si ipade, ati kii ṣe adarọ-ese ti a yan ni ibamu si awọn ofin iptables.

A pinnu lati duro pẹlu ọna yii. CoreDNS ti ran lọ bi DaemonSet ni Kubernetes ati pe a ṣe imuse olupin DNS node agbegbe kan ni yanju.conf kọọkan podu nipa eto a Flag --cluster-dns awọn pipaṣẹ kubelet . Ojutu yii ti jade lati munadoko fun awọn akoko akoko DNS.

Sibẹsibẹ, a tun rii ipadanu soso ati ilosoke ninu counter ifibọ_kuna ni wiwo Flannel. Eyi tẹsiwaju lẹhin imuse iṣẹ-ṣiṣe nitori a ni anfani lati yọkuro SNAT ati/tabi DNAT fun ijabọ DNS nikan. Ije ipo won dabo fun miiran orisi ti ijabọ. Da, julọ ti wa awọn apo-iwe TCP, ati ti o ba a isoro waye ti won ti wa ni nìkan tun. A tun n gbiyanju lati wa ojutu ti o dara fun gbogbo iru awọn ijabọ.

Lilo Aṣoju fun Iwontunwosi Fifuye Dara julọ

Bi a ṣe ṣilọ awọn iṣẹ ẹhin pada si Kubernetes, a bẹrẹ si jiya lati ẹru aiwọnwọnwọn laarin awọn podu. A rii pe HTTP Keepalive jẹ ki awọn asopọ ELB duro lori awọn adarọ ese akọkọ ti imuṣiṣẹ kọọkan ti yiyi jade. Nitorinaa, pupọ julọ ti ijabọ naa lọ nipasẹ ipin kekere ti awọn adarọ-ese ti o wa. Ojutu akọkọ ti a ni idanwo ni ṣeto MaxSurge si 100% lori awọn imuṣiṣẹ tuntun fun awọn oju iṣẹlẹ ọran ti o buruju. Ipa naa ti jade lati jẹ aiṣedeede ati aiṣedeede ni awọn ofin ti awọn imuṣiṣẹ ti o tobi julọ.

Ojutu miiran ti a lo ni lati ṣe alekun awọn ibeere ohun elo fun awọn iṣẹ to ṣe pataki. Ni ọran yii, awọn paadi ti a gbe si nitosi yoo ni yara diẹ sii lati ṣe adaṣe ni akawe si awọn podu eru miiran. Kii yoo ṣiṣẹ ni igba pipẹ boya nitori yoo jẹ adanu awọn orisun. Ni afikun, awọn ohun elo Node wa jẹ asapo ẹyọkan ati, ni ibamu, le lo koko kan nikan. Ojutu gidi nikan ni lati lo iwọntunwọnsi fifuye to dara julọ.

A ti gun fẹ lati ni kikun riri envoy. Ipo ti o wa lọwọlọwọ gba wa laaye lati gbe lọ ni ọna ti o lopin pupọ ati gba awọn esi lẹsẹkẹsẹ. Aṣoju jẹ iṣẹ-giga, orisun-ìmọ, aṣoju Layer-XNUMX apẹrẹ fun awọn ohun elo SOA nla. O le ṣe imuse awọn imuposi iwọntunwọnsi fifuye ilọsiwaju, pẹlu awọn igbiyanju adaṣe adaṣe, awọn fifọ iyika, ati aropin oṣuwọn agbaye. (Akiyesi. itumọ.: O le ka diẹ sii nipa eyi ni Arokọ yi nipa Istio, eyiti o da lori Aṣoju.)

A wa pẹlu iṣeto ni atẹle yii: ni ọkọ ayọkẹlẹ Envoy kan fun podu kọọkan ati ipa-ọna kan, ki o so iṣupọ pọ mọ eiyan ni agbegbe nipasẹ ibudo. Lati dinku cascading ti o pọju ati ṣetọju rediosi to buruju kekere kan, a lo ọkọ oju-omi kekere ti Envoy iwaju-proxy pods, ọkan fun Agbegbe Wiwa (AZ) fun iṣẹ kọọkan. Wọn gbarale ẹrọ wiwa iṣẹ ti o rọrun ti a kọ nipasẹ ọkan ninu awọn onimọ-ẹrọ wa ti o da atokọ awọn adarọ-ese pada ni AZ kọọkan fun iṣẹ ti a fun.

Awọn aṣoju iwaju-iṣẹ lẹhinna lo ẹrọ iṣawari iṣẹ yii pẹlu iṣupọ oke kan ati ipa-ọna. A ṣeto awọn akoko ti o peye, pọ si gbogbo awọn eto fifọ iyika, ati ṣafikun atunto atunwo kekere lati ṣe iranlọwọ pẹlu awọn ikuna ẹyọkan ati rii daju awọn imuṣiṣẹ ti o dara. A gbe TCP ELB kan ni iwaju ti ọkọọkan awọn Aṣoju iwaju-iṣẹ wọnyi. Paapa ti o ba jẹ pe keepalive lati Layer aṣoju akọkọ wa ti di lori diẹ ninu awọn pods Envoy, wọn tun ni anfani lati mu ẹru naa dara julọ ati pe wọn tunto lati dọgbadọgba nipasẹ o kere_request ni ẹhin.

Fun imuṣiṣẹ, a lo kio preStop lori awọn adarọ-ese ohun elo mejeeji ati awọn adarọ-ese ẹgbẹ. Awọn kio jeki ohun ašiše ni yiyewo awọn ipo ti admin endpoint be lori sidecar eiyan ati ki o lọ si sun fun a nigba ti lati gba awọn asopọ ti nṣiṣe lọwọ lati fopin si.

Ọkan ninu awọn idi ti a ni anfani lati gbe ni iyara jẹ nitori awọn metiriki alaye ti a ni anfani lati ṣepọ ni irọrun sinu fifi sori Prometheus aṣoju. Eyi gba wa laaye lati rii gangan ohun ti n ṣẹlẹ lakoko ti a ṣatunṣe awọn aye atunto ati pinpin kaakiri.

Awọn abajade jẹ lẹsẹkẹsẹ ati kedere. A bẹrẹ pẹlu awọn iṣẹ aipin julọ, ati ni akoko ti o nṣiṣẹ ni iwaju awọn iṣẹ pataki 12 ti o ṣe pataki julọ ni iṣupọ. Ni ọdun yii a n gbero iyipada kan si apapo iṣẹ ni kikun pẹlu iṣawari iṣẹ ilọsiwaju diẹ sii, fifọ Circuit, wiwa jade, opin oṣuwọn ati wiwa kakiri.

Tinder iyipada si Kubernetes
Olusin 3–1. Iṣọkan Sipiyu ti iṣẹ kan lakoko iyipada si Aṣoju

Tinder iyipada si Kubernetes

Tinder iyipada si Kubernetes

Abajade ipari

Nipasẹ iriri yii ati iwadii afikun, a ti kọ ẹgbẹ amayederun ti o lagbara pẹlu awọn ọgbọn ti o lagbara ni sisọ, gbigbe, ati ṣiṣiṣẹ awọn iṣupọ Kubernetes nla. Gbogbo awọn ẹlẹrọ Tinder ni bayi ni imọ ati iriri lati ṣajọ awọn apoti ati fi awọn ohun elo ranṣẹ si Kubernetes.

Nigbati iwulo fun agbara afikun dide lori awọn amayederun atijọ, a ni lati duro fun awọn iṣẹju pupọ fun awọn iṣẹlẹ EC2 tuntun lati ṣe ifilọlẹ. Bayi awọn apoti bẹrẹ ṣiṣe ati bẹrẹ sisẹ ijabọ laarin iṣẹju-aaya dipo awọn iṣẹju. Ṣiṣeto awọn apoti lọpọlọpọ lori apẹẹrẹ EC2 kan tun pese ifọkansi petele ti ilọsiwaju. Bi abajade, a ṣe asọtẹlẹ idinku nla ninu awọn idiyele EC2019 ni ọdun 2 ni akawe si ọdun to kọja.

Iṣiwa naa gba fere ọdun meji, ṣugbọn a pari ni Oṣu Kẹta ọdun 2019. Lọwọlọwọ, Syeed Tinder nṣiṣẹ ni iyasọtọ lori iṣupọ Kubernetes ti o ni awọn iṣẹ 200, awọn apa 1000, awọn adarọ-ese 15 ati awọn apoti ṣiṣiṣẹ 000. Awọn amayederun kii ṣe aaye nikan ti awọn ẹgbẹ iṣiṣẹ mọ. Gbogbo awọn onimọ-ẹrọ wa pin ojuse yii ati ṣakoso ilana ti kikọ ati gbigbe awọn ohun elo wọn ni lilo koodu nikan.

PS lati onitumọ

Ka tun kan lẹsẹsẹ awọn nkan lori bulọọgi wa:

orisun: www.habr.com

Fi ọrọìwòye kun