Traceroute ja jÀlgimine Istios: mikroteenused ja ebakindluse pÔhimÔte

Heisenbergi ebamugavuse printsiip ĂŒtleb, et ei saa samaaegselt mÔÔta objekti asukohta ja selle kiirus. Kui objekt liigub, pole tal asukohta. Kui asukoht on olemas – tĂ€hendab, et tal pole kiirus.

Traceroute ja jÀlgimine Istios: mikroteenused ja ebakindluse pÔhimÔte

Mis puudutab mikroteenuseid Red Hat OpenShifti (ja Kubernetes'i) platvormil, siis tĂ€nu sobivale avatud lĂ€htekoodiga tarkvarale saavad nad samal ajal edastada teavet oma jĂ”udluse ja toimivuse kohta. See ei vaidlusta vanameest Heisenbergi, kuid kaotab ebamugavuse pilve rakenduste haldamisel. Istio vĂ”imaldab hĂ”lpsasti korraldada selliste rakenduste jĂ€lgimist ja monitooringut, et kĂ”ik pĂŒsiks kontrolli all.

MÀÀratleme terminoloogia

Pod jĂ€lgimine JĂ€lgimise (Tracing) all mĂ”istame sĂŒsteemi tegevuse logimist. See kĂ”lab ĂŒsna ĂŒldiselt, kuid tĂ”eliselt ĂŒks olulisemaid reegleid on siin visata jĂ€lgimisandmed vastavasse salvestusruumi, ilma et oleks vaja nende vormindamisega muretseda. Ning kogu andmete otsimise ja analĂŒĂŒsi töö lasub nende tarbija Ă”lul. Istios kasutatakse jĂ€lgimissĂŒsteemi Jaeger, mis rakendab OpenTracing'i andmemudelit.

JĂ€lgedeks JĂ€lgedeks (Traces, ja sĂ”na "jĂ€ljed" kasutatakse siin tĂ€henduses "mĂ€rgid", nagu nĂ€iteks ballistilise ekspertiisi puhul) nimetame andmeid, mis kirjeldavad tĂ€ielikult pĂ€ringu vĂ”i tĂ¶Ă¶ĂŒlesande kulgemist, nagu öeldakse, "algusest lĂ”puni". NĂ€iteks kĂ”ik, mis toimub hetkel, kui kasutaja vajutab nuppu veebilehel, ja kuni andmete tagastamiseni, sealhulgas kĂ”ik kaasatud mikroteenused. Üks jĂ€lg kirjeldab tĂ€ielikult (vĂ”i mudeldab) pĂ€ringu kulgemist edasi-tagasi. Jaegeri liideses jagunevad jĂ€ljed ajakava jĂ€rgi nagu ahel, mida saab jagada eraldi lĂŒli. Ainult selle asemel, et lĂŒlid oleksid ahelas, koosneb jĂ€lg nn span'idest.

Span – see on intervall tĂ¶Ă¶ĂŒlesande algusest kuni selle lĂ”puni. JĂ€tkates analoogiat, vĂ”ib öelda, et iga span on eraldi ahela lĂŒli. Span'il vĂ”ib olla (vĂ”i mitte olla) ĂŒks vĂ”i mitu alam-spani. Seega on kĂ”ige ĂŒlemise taseme span (root span) sama ĂŒldine kestus nagu jĂ€lg, millele see kuulub.

JĂ€lgimine – see, this is the actual observation of your system – through the eyes, via the UI or through automation tools. The basis of monitoring lies in tracing data. In Istio, monitoring is implemented using Prometheus and has the corresponding UI. Prometheus supports automatic monitoring with alert notifications and Alert Managers.

We keep score

To enable tracing, the application must create a collection of spans. They then need to be exported to Jaeger so it can create a visual representation of the trace. Among other things, these spans label the name of the operation, as well as timestamp markers for its start and end. The transmission of spans is carried out by redirecting the HTTP request headers meant for Jaeger from incoming requests to outgoing requests. Depending on the programming language used, this may require slight modifications to the application's source code. Below is an example of Java code (using the Spring Boot framework) that adds B3 (Zipkin-style) headers to your request in the Spring configuration class:

Traceroute ja jÀlgimine Istios: mikroteenused ja ebakindluse pÔhimÔte
The following header settings are used:

Traceroute ja jÀlgimine Istios: mikroteenused ja ebakindluse pÔhimÔte
If you are using Java, you can leave the code unchanged and simply add a few lines to the Maven POM file and set environment variables. Here are the lines to add to the POM.XML file to integrate the Jaeger Tracer Resolver:

Traceroute ja jÀlgimine Istios: mikroteenused ja ebakindluse pÔhimÔte
And the corresponding environment variables are set in the Dockerfile:

Traceroute ja jÀlgimine Istios: mikroteenused ja ebakindluse pÔhimÔte
That's it, everything is set up now, and our microservices will start generating trace data.

Taking a general look

Istio includes a simple control panel based on Grafana. Once everything is configured and running on the Red Hat OpenShift PaaS platform (in our example, Red Hat OpenShift and Kubernetes are deployed on minishift), this panel can be launched with the following command:

open "$(minishift openshift service grafana -u)\/d\/1\/istio-dashboard?refresh=5⩝Id=1"

The Grafana panel allows for a quick assessment of the system's performance. A snippet of this panel is shown in the picture below:

Traceroute ja jÀlgimine Istios: mikroteenused ja ebakindluse pÔhimÔte
Siit on nĂ€ha, et klienditeeninduse mikroteenus kutsub vĂ€lja eelistuste mikroteenuse versioon 1, mis omakorda kutsub vĂ€lja soovituste mikroteenuseid versioon 1 ja 2. Grafana armatuurlaud sisaldab Dashboard Row plokki kĂ”rgetasemeliste mÔÔdikute jaoks, nagu globaalne pĂ€ringute maht, eduka pĂ€ringu osakaal, 4xx vead. Lisaks on seal Server Mesh esitus, kus on graafikud iga teenuse jaoks ja Services Row plokk, et vaadata ĂŒksikasjalikke andmeid iga konteineri kohta igas teenuses.

NĂŒĂŒd kaevame sĂŒgavamale

Korralikult seadistatud Istio jĂ€lgimine vĂ”imaldab otse vĂ€lja vĂ”tta sĂŒsteemi jĂ”udluse analĂŒĂŒs. Jaegeri kasutajaliideses saab jĂ€lgimisi vaadata ja nĂ€ha, kui kaugele ja sĂŒgavale need ulatuvad, samuti visuaalselt tuvastada jĂ”udluse kitsaskohti. Kui kasutada Red Hat OpenShift platvormil minishift, kĂ€ivitatakse Jaegeri kasutajaliides jĂ€rgmise kĂ€suga:

minishift openshift service jaeger-query --in-browser

Traceroute ja jÀlgimine Istios: mikroteenused ja ebakindluse pÔhimÔte
Mida saab sellel ekraanil jÀlgimise kohta öelda:

  • See jaguneb 7 span'iks.
  • Kogu töötlusaeg on 6.99 ms.
  • Mikroteenusele soovitus, mis on ahela viimane, kulub 0.69 ms.

Selle tĂŒĂŒpi diagrammid aitavad kiiresti mĂ”ista olukorda, kui mĂ”ni vĂ€hem oluline teenus mĂ”jutab kogu sĂŒsteemi jĂ”udlust.

NĂŒĂŒd keerame ĂŒlesande keerukamaks ja kĂ€ivitame kaks eksemplari mikroteenust soovitus:v2 kĂ€suga oc scale —replicas=2 deployment/recommendation-v2. Siin on, millised pod'id pĂ€rast seda meil on:

Traceroute ja jÀlgimine Istios: mikroteenused ja ebakindluse pÔhimÔte
Kui nĂŒĂŒd lĂŒlituda tagasi Jaegerisse ja avada soovituste teenuse span, nĂ€eme, kuhu pod'id jagunevad. Nii saame hĂ”lpsasti tuvastada tĂ”rkeid konkreetse pod'i tasemel. Selleks tuleb vaadata node_id vĂ€lja:

Traceroute ja jÀlgimine Istios: mikroteenused ja ebakindluse pÔhimÔte

Kuhu ja kuidas kÔik liigub

NĂŒĂŒd liigume Prometheuse liidesesse ja ootuspĂ€raselt nĂ€eme seal, et pĂ€ringud teise ja esimese versiooni vahel jagunevad suhtega 2:1, rangelt vastavalt töökindlate pod'ide arvule. Lisaks muutub see graafik dĂŒnaamiliselt, kui pod'e ĂŒles-alla skaleerida, mis on eriti kasulik Canary Deployment'i puhul (me vaatame selle rakendusskeemi lĂ€hemalt jĂ€rgmine kord).

Traceroute ja jÀlgimine Istios: mikroteenused ja ebakindluse pÔhimÔte

KÔik on alles alguses

Tegelikult puudutasime tĂ€na vaid kergelt Jaegeri, Grafana ja Prometheuse vÀÀrtuslikku teavet. See oli meie eesmĂ€rk – suunata teid Ă”igesse suunda ja avada Istio perspektiive.

Ja pidage meeles, et see kĂ”ik on juba Istios sisse ehitatud. Teatud programmeerimiskeelte (nt Java) ja raamistike (nt Spring Boot) kasutamisel saab kĂ”ik selle realiseerida, puutumata rakenduste koodi. Jah, koodi tuleb veidi kohandada, kui kasutate teisi keeli, eelkĂ”ige Nodejs vĂ”i C#. Kuid kuna jĂ€lgitavus (loe: "tracing") on usaldusvÀÀrsete pilvesĂŒsteemide loomise ĂŒks peamisi tingimusi, peate koodi igal juhul muutma, olgu teil Istio vĂ”i mitte. Miks mitte investeerida oma pingutusi tugevamalt?

KasvĂ”i selleks, et alati vastata kĂŒsimustele "kus?" ja "kui kiiresti?" 100% kindlusega.

Kaosetehnika Istios: see oli nii kavandatud

Asjade purustamise oskus aitab tagada, et need ei puruneks

Tarkvara testimine ei ole mitte ainult keeruline, vaid ka oluline. Samas on korrektsete testide (nt kas funktsioon tagastab Ă”ige tulemuse) tegemine ĂŒks asi, aga testi tegemine ebastabiilses vĂ”rgus on hoopis teine ĂŒlesanne (tihti arvatakse, et vĂ”rk töötab alati tĂ”rgeteta, ja see on esimene kaheksast valeideest jaotatud arvutuste kohta). Üks selle ĂŒlesande keerukustest seisneb selles, kuidas sĂŒsteemis tĂ”rkeid simuleerida vĂ”i neid tahtlikult pĂ”hjustada, tehes nn fault injection'i. Seda saab teha rakenduse algkoodi modifitseerimise teel. Kuid siis testite mitte oma algset koodi, vaid selle versiooni, mis simuleerib tĂ”rkeid. Tulemuseks on risk sattuda fault injection'i surmavatesse embustesse ja silmitsi seista geizenbug'idega – tĂ”rked, mis kaovad katsetamise katsete ajal.

Ja nĂŒĂŒd nĂ€itame, kuidas Istio aitab nendest raskustest hĂ”lpsasti ĂŒle saada.

Kuidas kÔik vÀlja nÀeb, kui kÔik on suurepÀrane

Vaatame jĂ€rgmist stsenaariumi: meil on kaks pod'i meie soovituste mikroteenusele, mille vĂ”tsime Istio Ă”pikust. Üks pod on tĂ€histatud kui v1 ja teine kui v2. Nagu nĂ€eme, töötab kĂ”ik praegu suurepĂ€raselt:

Traceroute ja jÀlgimine Istios: mikroteenused ja ebakindluse pÔhimÔte
(Muide, number paremal – see on lihtsalt iga pod'i kĂ”nede loendur)

Aga me ei vaja tegelikult seda, eks? Proovime kÔik purustada, puudutamata allika koodi.

Teeme mikroteenuse töö katkestusi

Allpool on yaml-fail Istio marsruutimisse reegli kohta, mis katkub pooled korrad (vea) serverilt 503):

Traceroute ja jÀlgimine Istios: mikroteenused ja ebakindluse pÔhimÔte
Pange tÀhele, et oleme selgelt mÀÀranud, et pooled korrad peab tagastama vea 503.

Nii nĂ€eb vĂ€lja ekraanipilt tsĂŒkli kĂ€ivitamisel curl kĂ€sust pĂ€rast reegli aktiveerimist, et simuleerida katkestusi. Nagu nĂ€eme, tagastab pool pĂ€ringutest vea 503, olenemata sellest, millisele pod'ile – v1 vĂ”i v2 – need saadetakse:

Traceroute ja jÀlgimine Istios: mikroteenused ja ebakindluse pÔhimÔte
TavapÀrase töö taastamiseks piisab reegli eemaldamisest, meie puhul kÀsuga istioctl delete routerule recommendation-503 -n tutorial. Siin Tutorial on Red Hat OpenShift'i projekti nimi, kus meie Istio Ôpetus toimub.

Toome sisse kunstlikud viivitused

Kunstlikud vead 503 aitavad testida sĂŒsteemi tĂ”rgetele vastupidavust, kuid vĂ”ime ennustada ja töödelda viivitusi peaks teid veelgi enam muljet avaldama. Ja tegelikus elus juhtuvad viivitused sageli rohkem kui tĂ”rked. Aeglaselt töötav mikroteenus on mĂŒrk, millest kannatab kogu sĂŒsteem. Istio abil saab testida viivituste töötlemise koodi, muutes seda samal ajal mitte. Alustame nĂ€itamisega, kuidas seda teha kunstlikult sisse toodud vĂ”rgu viivituste korral.

Pange tĂ€hele, et pĂ€rast sellist testimist vĂ”ib teil olla vajadus (vĂ”i soov) oma koodi tĂ€iustada. Hea uudis on see, et sel juhul tegutsete proaktiivselt, mitte reaktiivselt. Just nii peaks arengutsĂŒkkel vĂ€lja nĂ€gema: kodeerimine-testimine-tagasiside-kodeerimine-testimine


Nii nĂ€eb vĂ€lja reegel, mis
 Kuigi tead, mis? Istio on nii lihtne, ja see yaml-fail on nii arusaadav, et kĂ”ik selles nĂ€ites rÀÀgib enda eest, vaata lihtsalt:

Traceroute ja jÀlgimine Istios: mikroteenused ja ebakindluse pÔhimÔte
Pooles juhtudel tekib meil 7-sekundiline viivitus. Ja see ei ole vĂ”rreldav sellega, kui me lisaksime lĂ€htekoodi kĂ€su sleep, sest Istio viivitab pĂ€ringu tĂ”eliselt 7 sekundiks. Kuna Istio toetab Jaegeri jĂ€lgimist, on see viivitus hĂ€sti nĂ€htav Jaegeri kasutajaliideses, nagu on nĂ€idatud alloleval ekraanipildil. Pöörake tĂ€helepanu pika pĂ€ringu pĂ”hja paremas servas – selle kestus on 7,02 sekundit:

Traceroute ja jÀlgimine Istios: mikroteenused ja ebakindluse pÔhimÔte
See stsenaarium vÔimaldab testida koodi vÔrgu viivituste tingimustes. Ja on selge, et kui me selle reegli eemaldame, kaotame me kunstliku viivituse. Korrame, et oleme kÔik selle teinud, mitte puutudes lÀhtekoodi.

Ära tagane ega anna alla

Teine kasulik funktsioon Istios, mis puudutab kaose inseneritete, on teenusele korduvad pĂ€ringud mÀÀratud arvu kordi. Idee on selles, et me ei peata katseid, kui esimene pĂ€ring lĂ”ppeb veaga 503 – ja siis, vĂ”ib-olla, N-ndal korral me Ă”nnestume. VĂ”ib-olla on teenus lihtsalt mingil pĂ”hjusel ĂŒhtĂ€kki madalal. Jah, selle pĂ”hjuse tuleks vĂ€lja leida ja kĂ”rvaldada. Kuid see on hiljem, nĂŒĂŒd proovime teha nii, et sĂŒsteem jĂ€tkab tööd.

Nii et tahame, et teenus aeg-ajalt annaks vea 503, ja Istio proovib seejĂ€rel selle ĂŒhenduse loomist. Siin on ilmne vajadus genereerida viga 503, puutumatult koodi...

Peatu, oota! Me tegime just seda.

See fail muudab nii, et teenus recommendation-v2 annab pooled juhtudest vea 503:

Traceroute ja jÀlgimine Istios: mikroteenused ja ebakindluse pÔhimÔte
On ilmne, et osa pÀringutest lÔppeb ebaÔnnestumisega:

Traceroute ja jÀlgimine Istios: mikroteenused ja ebakindluse pÔhimÔte
Ja nĂŒĂŒd rakendame Istio Retry-funktsiooni:

Traceroute ja jÀlgimine Istios: mikroteenused ja ebakindluse pÔhimÔte
See marsruutimisreegel teeb kolm kordust kahe sekundi intervalliga ja peaks vÀhendama (ja ideaalis tÀielikult kÔrvaldama) vead 503:

Traceroute ja jÀlgimine Istios: mikroteenused ja ebakindluse pÔhimÔte
KokkuvĂ”ttes oleme teinud nii, et Istio, kĂ”igepealt, genereerib vea 503 pooltele pĂ€ringutele. Teiseks, sama Istio teeb kolme katset teenusega uuesti ĂŒhenduse loomise korral vea 503 esinedes. Tulemus on lihtsalt suurepĂ€rane. Nii et kasutades Retry-funktsiooni, tĂ€itsime oma lubaduse mitte taganeda ega alla anda.

Ja jah, me tegime seda jÀlle, tÀiesti puutumatult koodi. KÔik, mida me vajasime, olid kaks Istio marsruurimisreeglit:

Traceroute ja jÀlgimine Istios: mikroteenused ja ebakindluse pÔhimÔte

Kuidas kasutaja mitte petta vĂ”i seitse ĂŒhte ei oota

Ja nĂŒĂŒd keerame olukorra pea peale ja vaatame stsenaariumi, kus mitte taganeda ja mitte alla anda tasub ainult mingil kindlal ajal. Ja siis tuleb lihtsalt lĂ”petada katseid pĂ€ringu töötlemiseks, et mitte sundida kĂ”iki ootama mingit ĂŒhte pidurdavat teenust. TeisisĂ”nu, me ei kaitse kaotatud positsiooni, vaid loovume tagavaraliinile, et mitte petta veebisaidi kasutajat ja mitte sundida teda teadmatuses viibima.

Istios saab seada pĂ€ringu töötlemise ajaĂŒletuse. Kui teenus ĂŒletab selle aja, tagastatakse viga 504 (Gateway Timeout) – see kĂ”ik toimub jĂ€lle Istio konfiguratsiooni kaudu. Kuid me peame teenuse lĂ€htekoodi lisama kĂ€su sleep (ja seejĂ€rel loomulikult tĂ€itma rebuild ja redeploy), et simuleerida teenuse aeglast tööd. Kahjuks muud moodi ei saa.

Nii et me lisasime kolmesekundilise sleep kĂ€su soovitus teenuse koodis v2, koostasime vastava pildi ĂŒmber ja tegime konteineri redeploy, nĂŒĂŒd lisame aegumise jĂ€rgmise Istio suunamisreegliga:

Traceroute ja jÀlgimine Istios: mikroteenused ja ebakindluse pÔhimÔte
Eelmisel ekraanipildil on nĂ€ha, et me loobume katsetest ĂŒhendust vĂ”tta soovitus teenusega, kui me ei saa vastust ĂŒhe sekundi jooksul, st enne, kui ilmneb viga 504. PĂ€rast selle suunamisreegli rakendamist (ja kolme sekundi sleep'i lisamist soovitus teenuse koodi v2), saame jĂ€rgmise tulemuse:

Traceroute ja jÀlgimine Istios: mikroteenused ja ebakindluse pÔhimÔte
Korratakse, aga aega saab seada, puudutamata lĂ€htekoodi. Ja siin on veel ĂŒks boonus, et nĂŒĂŒd saate oma koodi kohandada nii, et see reageeriks ajaĂŒletusele, ja lihtsalt testida seda tĂ€iustamist Istio abil.

Ja nĂŒĂŒd kĂ”ik koos

Veidi kaose tekitamine Istio abil on suurepĂ€rane viis oma koodi ja sĂŒsteemi usaldusvÀÀrsuse testimiseks. Tagasirikka, bulkhead ja circuit breaker mudelid, kunstlike riketeni ja viivitusteni viimise mehhanismid, samuti uuesti kutsed ja aegumised on vĂ€ga kasulikud talitlushĂ€iretega pilvesĂŒsteemide loomiseks. Koos Kubernetes'e ja Red Hat OpenShift'iga aitavad need tööriistad kindlalt tulevikku vastu vĂ”tta.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster