Lura għall-mikroservizzi b'Istio. Parti 1

Lura għall-mikroservizzi b'Istio. Parti 1

Nota. transl.: Il-malji tas-servizz definittivament saru soluzzjoni rilevanti fl-infrastruttura moderna għall-applikazzjonijiet li jsegwu l-arkitettura tal-mikroservizz. Filwaqt li Istio jista 'jkun fuq fomm ħafna inġiniera DevOps, huwa prodott pjuttost ġdid li, filwaqt li huwa komprensiv f'termini tal-kapaċitajiet li jipprovdi, jista' jeħtieġ ammont sinifikanti ta 'żmien biex wieħed jiffamiljarizza ruħu miegħu. L-inġinier Ġermaniż Rinor Maloku, li huwa responsabbli għall-cloud computing għal klijenti kbar fil-kumpanija tat-telekomunikazzjoni Orange Networks, kiteb serje mill-isbaħ ta 'materjali li jippermettulek tgħaddas malajr u fil-fond f'Istio. Jibda l-istorja tiegħu b’dak li jista’ jagħmel Istio b’mod ġenerali u kif tista’ malajr taraha b’għajnejk.

Istio — Proġett Open Source żviluppat b'kollaborazzjoni ma' timijiet minn Google, IBM u Lyft. Issolvi l-kumplessitajiet li jinqalgħu fl-applikazzjonijiet ibbażati fuq mikroservizzi, bħal:

  • Ġestjoni tat-Traffiku: timeouts, tentattivi mill-ġdid, ibbilanċjar tat-tagħbija;
  • sigurtà: awtentikazzjoni u awtorizzazzjoni tal-utent finali;
  • Osservabbiltà: traċċar, monitoraġġ, illoggjar.

Dawn kollha jistgħu jiġu solvuti fil-livell tal-applikazzjoni, iżda wara s-servizzi tiegħek ma jibqgħux "mikro". L-isforz żejjed kollu biex issolvi dawn il-problemi huwa ħela ta 'riżorsi tal-kumpanija li jistgħu jintużaw direttament għall-valur tan-negozju. Ejja nħarsu lejn eżempju:

Maniġer tal-Proġett: Kemm iddum biex iżżid karatteristika ta' feedback?
Żviluppatur: Żewġ sprints.

MP: X'?.. Huwa biss GĦADD!
R: Li tagħmel CRUD hija l-parti faċli, iżda għad għandna bżonn nawtentikaw u nawtorizzaw l-utenti u s-servizzi. Peress li n-netwerk mhuwiex affidabbli, ser ikollok bżonn timplimenta talbiet ripetuti, kif ukoll mudell ta 'circuit breaker fil-klijenti. Ukoll, biex tiżgura li s-sistema kollha ma tiġġarrafx, ser ikollok bżonn timeouts u paratiji (għal aktar dettalji dwar iż-żewġ mudelli imsemmija, ara aktar tard fl-artiklu - trad. approx.), u sabiex jinstabu problemi, monitoraġġ, traċċar, […]

MP: Oh, allura ejja biss daħħal din il-karatteristika fis-servizz tal-Prodott.

Naħseb li l-idea hija ċara: l-ammont ta 'passi u sforz meħtieġ biex jiżdied servizz wieħed huwa enormi. F'dan l-artikolu, ser inħarsu lejn kif Istio tneħħi l-kumplessità kollha msemmija hawn fuq (li mhix maħsuba li tkun loġika tan-negozju) mis-servizzi.

Lura għall-mikroservizzi b'Istio. Parti 1

Innota: Dan l-artikolu jassumi li għandek għarfien tax-xogħol ta' Kubernetes. Inkella, nirrakkomanda qari l-introduzzjoni tiegħi għal Kubernetes u wara biss kompli aqra dan il-materjal.

Istio idea

F’dinja mingħajr Istio, servizz wieħed jagħmel talbiet diretti lil ieħor, u f’każ ta’ falliment, is-servizz irid jieħu ħsiebu hu stess: jagħmel tentattiv ġdid, jipprovdi timeout, jiftaħ circuit breaker, eċċ.

Lura għall-mikroservizzi b'Istio. Parti 1
Traffiku tan-netwerk f'Kubernetes

Istio joffri soluzzjoni speċjalizzata, kompletament separata mis-servizzi u li taħdem billi tinterferixxi mal-komunikazzjoni tan-netwerk. U għalhekk timplimenta:

  • tolleranza għall-ħsarat: Ibbażat fuq il-kodiċi tal-istatus fir-rispons, jifhem jekk it-talba fallietx u terġa' tesegwixxiha.
  • It-tnedija tal-Kanarji: jirridirezzjona biss perċentwal fiss ta' talbiet lejn il-verżjoni l-ġdida tas-servizz.
  • Monitoraġġ u metriċi: Kemm dam biex is-servizz iwieġeb?
  • Traċċar u Osservabbiltà: Iżżid headers speċjali għal kull talba u traċċahom madwar il-cluster.
  • sigurtà: Jiġbor it-token JWT, jawtentika u jawtorizza lill-utenti.

Dawn huma biss ftit mill-possibbiltajiet (verament ftit biss!) Li jqanqluk. Issa ejja ngħaddu fid-dettalji tekniċi!

Istio arkitettura

Istio jinterċetta t-traffiku kollu tan-netwerk u japplika sett ta 'regoli għalih, billi jdaħħal prokura intelliġenti fil-forma ta' kontenitur sidecar f'kull pod. Prokuri li jattivaw il-kapaċitajiet kollha jiffurmaw a Ajru tad-Data, u jistgħu jiġu kkonfigurati b'mod dinamiku bl-użu Pjan ta 'Kontroll.

Ajru tad-Data

Prokuri mdaħħla fil-miżwed jippermettu lil Istio biex tissodisfa faċilment ir-rekwiżiti li għandna bżonn. Pereżempju, ejja niċċekkjaw il-funzjonijiet mill-ġdid u tal-interruttur.

Lura għall-mikroservizzi b'Istio. Parti 1
Kif jiġu implimentati mill-ġdid tentattivi u circuit breaking f'Envoy

Fil-qosor:

  1. mibgħut (Qed nitkellmu dwar prokura li tinsab f'kontenitur sidecar, li huwa mqassam bħala prodott separat - madwar. trad.) jibgħat talba lill-ewwel istanza tas-servizz B u jonqos.
  2. L-Envoy Sidecar jerġa' jipprova (erġa pprova). (1)
  3. It-talba tonqos u tintbagħat lura lill-prokuratur li sejħilha.
  4. Dan jiftaħ Circuit Breaker u jsejjaħ is-servizz li jmiss għal talbiet sussegwenti. (2)

Dan ifisser li m'għandekx għalfejn tuża librerija oħra Retry, m'għandekx għalfejn tagħmel l-implimentazzjoni tiegħek ta' Circuit Breaking u Service Discovery fil-lingwa ta 'programmar X, Y jew Z. Dan kollu u ħafna aktar huwa disponibbli barra mill-kaxxa. f'Istio u ma teħtieġx ebda bidliet fil-kodiċi.

Kbir! Issa forsi trid tmur fuq vjaġġ ma’ Istio, imma għad għandek xi dubji, mistoqsijiet miftuħa. Jekk din hija soluzzjoni universali għall-okkażjonijiet kollha fil-ħajja, allura għandek suspett naturali: wara kollox, is-soluzzjonijiet kollha bħal dawn fir-realtà jirriżultaw li mhumiex adattati għal kwalunkwe każ.

U fl-aħħar tistaqsi: "Huwa customizable?"

Issa int lest għall-vjaġġ bil-baħar, ejja niffamiljarizzaw ruħhom mal-Pjan ta 'Kontroll.

Pjan ta 'Kontroll

Tikkonsisti fi tliet komponenti: Pilota, Mixer и Citadel, li jaħdmu flimkien biex jiġu kkonfigurati l-Mibgħuta biex iwasslu t-traffiku, jinfurzaw il-politiki, u jiġbru data tat-telemetrija. Skematikament kollox jidher bħal dan:

Lura għall-mikroservizzi b'Istio. Parti 1
Interazzjoni tal-Pjan ta' Kontroll mal-Pjan tad-Data

Mibgħuta (jiġifieri pjan tad-dejta) huma kkonfigurati bl-użu Kubernetes CRD (Definizzjonijiet tar-Riżorsi Doganali) definiti minn Istio u maħsuba speċifikament għal dan il-għan. Dak li jfisser għalik huwa li jidhru li huma biss riżors ieħor f'Kubernetes b'sintassi familjari. Ladarba tinħoloq, din ir-riżorsa tinġabar mill-ajruplan tal-kontroll u tiġi applikata lill-Mibgħuta.

Relazzjoni ta' servizzi lil Istio

Iddeskrivejna r-relazzjoni ta' Istio mas-servizzi, iżda mhux bil-maqlub: is-servizzi kif jirrelataw ma' Istio?

Biex inkun onest, is-servizzi huma konxji tal-preżenza ta' Istio daqskemm huma l-ħut tal-ilma meta jistaqsu lilhom infushom, "X'inhu l-ilma xorta waħda?"

Lura għall-mikroservizzi b'Istio. Parti 1
Illustrazzjoni Victoria Dimitrakopoulos: - Kif tħobb l-ilma? - X'inhu l-ilma xorta waħda?

Għalhekk, tista 'tieħu cluster ta' ħidma u wara li tuża l-komponenti Istio, is-servizzi li jinsabu fih se jkomplu jaħdmu, u wara li tneħħi dawn il-komponenti, kollox jerġa 'jkun tajjeb. Huwa ċar li f'dan il-każ inti titlef il-kapaċitajiet ipprovduti minn Istio.

Biżżejjed teorija - ejja npoġġu dan l-għarfien fil-prattika!

Istio fil-prattika

Istio jeħtieġ cluster Kubernetes b'mill-inqas 4 vCPUs u 8 GB ta 'RAM disponibbli. Biex twaqqaf malajr cluster u ssegwi l-istruzzjonijiet mill-artiklu, nirrakkomanda li tuża Google Cloud Platform, li toffri utenti ġodda b'xejn $300.

Wara li ħoloq cluster u kkonfigurat l-aċċess għal Kubernetes permezz tal-utilità tal-console, tista 'tinstalla Istio permezz tal-maniġer tal-pakkett Helm.

Installazzjoni tat-tmun

Installa l-klijent Helm fuq il-kompjuter tiegħek, kif deskritt fi dokumentazzjoni uffiċjali. Aħna se nużaw dan biex niġġeneraw mudelli għall-installazzjoni ta 'Istio fit-taqsima li jmiss.

Installazzjoni Istio

Niżżel ir-riżorsi Istio minn aħħar rilaxx (il-link tal-awtur oriġinali għall-verżjoni 1.0.5 nbidlet għal dik attwali, jiġifieri 1.0.6 - approx. trad.), estratti l-kontenut f'direttorju wieħed, li minn issa 'l quddiem se nsejjaħ [istio-resources].

Biex tidentifika faċilment ir-riżorsi Istio, oħloq namespace fil-cluster K8s istio-system:

$ kubectl create namespace istio-system

Imla l-installazzjoni billi tmur fid-direttorju [istio-resources] u tmexxi l-kmand:

$ helm template install/kubernetes/helm/istio 
  --set global.mtls.enabled=false 
  --set tracing.enabled=true 
  --set kiali.enabled=true 
  --set grafana.enabled=true 
  --namespace istio-system > istio.yaml

Dan il-kmand joħroġ il-komponenti ewlenin ta 'Istio għal fajl istio.yaml. Aħna mmodifikajna l-mudell standard biex jixirqu lilna nfusna, billi speċifikaw il-parametri li ġejjin:

  • global.mtls.enabled installat fi false (jiġifieri l-awtentikazzjoni mTLS hija diżattivata - madwar)biex tissimplifika l-proċess tad-dating tagħna;
  • tracing.enabled jinkludi t-traċċar tat-talbiet bl-użu ta' Jaeger;
  • kiali.enabled jinstalla Kiali fi cluster biex jivviżwalizza s-servizzi u t-traffiku;
  • grafana.enabled jinstalla Grafana biex jivviżwalizza l-metriċi miġbura.

Ejja nużaw ir-riżorsi ġenerati bil-kmand:

$ kubectl apply -f istio.yaml

L-installazzjoni ta 'Istio fuq il-cluster hija kompluta! Stenna sakemm il-miżwed kollha jkunu fl-ispazju tal-isem istio-system se tkun kapaċi Running jew Completedbilli tmexxi l-kmand hawn taħt:

$ kubectl get pods -n istio-system

Issa aħna lesti li nkomplu fit-taqsima li jmiss, fejn se ndaħħlu l-applikazzjoni u taħdem.

Arkitettura tal-applikazzjoni tal-Analiżi tas-Sentiment

Ejja nużaw l-eżempju tal-applikazzjoni tal-mikroservizz tal-Analiżi tas-Sentiment użata fl-imsemmi diġà Artiklu ta' introduzzjoni għal Kubernetes. Huwa kumpless biżżejjed biex juri l-kapaċitajiet ta 'Istio fil-prattika.

L-applikazzjoni tikkonsisti f'erba' mikroservizzi:

  1. Servizz SA-Frontend, li jservi l-frontend ta 'applikazzjoni Reactjs;
  2. Servizz SA-WebApp, li jservi mistoqsijiet dwar l-Analiżi tas-Sentiment;
  3. Servizz SA-loġika, li twettaq innifsu analiżi tas-sentiment;
  4. Servizz SA-Feedback, li tirċievi feedback mill-utenti dwar l-eżattezza tal-analiżi.

Lura għall-mikroservizzi b'Istio. Parti 1

F'din id-dijagramma, minbarra s-servizzi, naraw ukoll il-Kontrollur tad-Dħul, li f'Kubernetes iwassal it-talbiet deħlin għas-servizzi xierqa. Istio juża kunċett simili fi ħdan Ingress Gateway tiegħu, aktar dettalji dwaru se jsegwu.

Tmexxi applikazzjoni bi prokura minn Istio

Għal aktar operazzjonijiet imsemmija fl-artikolu, kklona r-repożitorju tiegħek istio-ħakma. Fiha l-applikazzjoni u l-manifesti għal Kubernetes u Istio.

Daħħal sidecars

L-inserzjoni tista 'ssir awtomatikament jew bl-idejn. Biex awtomatikament daħħal kontenituri sidecar, ser ikollok bżonn li tissettja tikketta għall-ispazju tal-isem istio-injection=enabled, li jsir bil-kmand li ġej:

$ kubectl label namespace default istio-injection=enabled
namespace/default labeled

Issa kull pod li se jiġi skjerat fl-ispazju tal-isem default (default) se tirċievi l-kontenitur sidecar tagħha. Biex tivverifika dan, ejja niskjeraw l-applikazzjoni tat-test billi tmur fid-direttorju tal-għeruq tar-repożitorju [istio-mastery] u tmexxi l-kmand li ġej:

$ kubectl apply -f resource-manifests/kube
persistentvolumeclaim/sqlite-pvc created
deployment.extensions/sa-feedback created
service/sa-feedback created
deployment.extensions/sa-frontend created
service/sa-frontend created
deployment.extensions/sa-logic created
service/sa-logic created
deployment.extensions/sa-web-app created
service/sa-web-app created

Wara li wżajt is-servizzi, ejja niċċekkjaw li l-imżiewed għandhom żewġ kontenituri (bis-servizz innifsu u s-sidecar tiegħu) billi tħaddem il-kmand kubectl get pods u tiżgura li taħt il-kolonna READY valur speċifikat 2/2, li jissimbolizzaw li ż-żewġ kontenituri qed jaħdmu:

$ kubectl get pods
NAME                           READY     STATUS    RESTARTS   AGE
sa-feedback-55f5dc4d9c-c9wfv   2/2       Running   0          12m
sa-frontend-558f8986-hhkj9     2/2       Running   0          12m
sa-logic-568498cb4d-2sjwj      2/2       Running   0          12m
sa-logic-568498cb4d-p4f8c      2/2       Running   0          12m
sa-web-app-599cf47c7c-s7cvd    2/2       Running   0          12m

Viżwalment jidher bħal dan:

Lura għall-mikroservizzi b'Istio. Parti 1
Prokura mibgħuta f'wieħed mill-imżiewed

Issa li l-applikazzjoni tkun qed taħdem, ser ikollna nħallu t-traffiku li jkun dieħel jidħol fl-applikazzjoni.

Ingress Gateway

L-aħjar prattika biex jinkiseb dan (jippermetti t-traffiku fil-cluster) hija permezz Ingress Gateway f'Istio, li jinsab fit-"tarf" tar-raggruppament u jippermettilek li tippermetti karatteristiċi ta 'Istio bħal rotta, ibbilanċjar tat-tagħbija, sigurtà u monitoraġġ għat-traffiku li jkun dieħel.

Il-komponent Ingress Gateway u s-servizz li jgħaddih esternament ġew installati fil-cluster waqt l-installazzjoni Istio. Biex issir taf l-indirizz IP estern tas-servizz, mexxi:

$ kubectl get svc -n istio-system -l istio=ingressgateway
NAME                   TYPE           CLUSTER-IP     EXTERNAL-IP
istio-ingressgateway   LoadBalancer   10.0.132.127   13.93.30.120

Se nkomplu naċċessaw l-applikazzjoni billi nużaw din l-IP (se nirreferi għaliha bħala ESTERNI-IP), għalhekk għall-konvenjenza se nikteb il-valur f'varjabbli:

$ EXTERNAL_IP=$(kubectl get svc -n istio-system 
  -l app=istio-ingressgateway 
  -o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}')

Jekk tipprova taċċessa din l-IP permezz ta' browser issa, tirċievi żball Servizz Mhux Disponibbli, għaliex b'mod awtomatiku Istio jimblokka t-traffiku kollu li jkun dieħel, Gateway għadu ma ġiex definit.

Riżorsa Gateway

Gateway huwa CRD (Custom Resource Definition) f'Kubernetes, definit wara l-installazzjoni ta' Istio fil-cluster u li jippermetti l-abbiltà li tispeċifika l-portijiet, il-protokoll u l-hosts li għalihom irridu nippermettu t-traffiku deħlin.

Fil-każ tagħna, irridu nippermettu traffiku HTTP fuq il-port 80 għall-hosts kollha. Il-kompitu huwa implimentat bid-definizzjoni li ġejja (http-gateway.yaml):

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: http-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
- "*"

Din il-konfigurazzjoni ma teħtieġ l-ebda spjegazzjoni ħlief għas-selettur istio: ingressgateway. B'dan is-selettur nistgħu nispeċifikaw għal liema Ingress Gateway napplikaw il-konfigurazzjoni għalih. Fil-każ tagħna, dan huwa l-kontrollur Ingress Gateway, li kien installat awtomatikament f'Istio.

Il-konfigurazzjoni tiġi applikata billi ssejjaħ il-kmand li ġej:

$ kubectl apply -f resource-manifests/istio/http-gateway.yaml gateway.networking.istio.io/http-gateway created

Il-portal issa jippermetti l-aċċess għall-port 80, iżda m'għandu l-ebda idea ta 'minn imexxi t-talbiet. Għal dan ser ikollok bżonn Servizzi Virtwali.

Riżors VirtualService

Il-VirtualService jgħid lill-Ingress Gateway kif id-direzzjoni tat-talbiet li huma permessi fi ħdan il-cluster.

It-talbiet lill-applikazzjoni tagħna li jiġu permezz ta' http-gateway għandhom jintbagħtu lis-servizzi sa-frontend, sa-web-app u sa-feedback:

Lura għall-mikroservizzi b'Istio. Parti 1
Rotot li jeħtieġ li jiġu kkonfigurati ma VirtualServices

Ejja nħarsu lejn it-talbiet li għandhom jintbagħtu lil SA-Frontend:

  • Taqbila eżatta tul it-triq / għandha tintbagħat lil SA-Frontend biex tikseb index.html;
  • Mogħdijiet prefissati /static/* għandhom jintbagħtu lil SA-Frontend biex jirċievu fajls statiċi użati fil-frontend, bħal CSS u JavaScript;
  • Mogħdijiet imqabbla b'espressjoni regolari '^.*.(ico|png|jpg)$', għandhom jintbagħtu lil SA-Frontend, għaliex Dawn huma l-istampi murija fuq il-paġna.

L-implimentazzjoni tinkiseb bil-konfigurazzjoni li ġejja (sa-virtualservice-external.yaml):

kind: VirtualService
metadata:
  name: sa-external-services
spec:
  hosts:
  - "*"
  gateways:
  - http-gateway                      # 1
  http:
  - match:
    - uri:
        exact: /
    - uri:
        exact: /callback
    - uri:
        prefix: /static
    - uri:
        regex: '^.*.(ico|png|jpg)

Важные моменты:

  1. Этот VirtualService относится к запросам, приходящим через http-gateway;
  2. В destination определяется сервис, куда отправляются запросы.
Примечание: Конфигурация выше хранится в файле sa-virtualservice-external.yaml, который также содержит настройки для маршрутизации в SA-WebApp и SA-Feedback, но был сокращён здесь в статье для лаконичности. Применим VirtualService вызовом:
$ kubectl apply -f resource-manifests/istio/sa-virtualservice-external.yaml
virtualservice.networking.istio.io/sa-external-services created

Примечание: Когда мы применяем ресурсы Istio, Kubernetes API Server создаёт событие, которое получает Istio Control Plane, и уже после этого новая конфигурация применяется к прокси-серверам Envoy каждого pod'а. А контроллер Ingress Gateway представляется очередным Envoy, сконфигурированным в Control Plane. Всё это на схеме выглядит так:

Назад к микросервисам вместе с Istio. Часть 1
Конфигурация Istio-IngressGateway для маршрутизации запросов

Приложение Sentiment Analysis стало доступным по http://{EXTERNAL-IP}/. Не переживайте, если вы получаете статус Not Found: иногда требуется чуть больше времени для того, чтобы конфигурация вступила в силу и кэши Envoy обновились.

Перед тем, как продолжить, поработайте немного с приложением, чтобы сгенерировать трафик (его наличие необходимо для наглядности в последующих действиях — прим. перев.).

Kiali : наблюдаемость

Чтобы попасть в административный интерфейс Kiali, выполните следующую команду:

$ kubectl port-forward 
    $(kubectl get pod -n istio-system -l app=kiali 
    -o jsonpath='{.items[0].metadata.name}') 
    -n istio-system 20001

… и откройте http://localhost:20001/, залогинившись под admin/admin. Здесь вы найдете множество полезных возможностей, например, для проверки конфигурации компонентов Istio, визуализации сервисов по информации, собранной при перехвате сетевых запросов, получения ответов на вопросы «Кто к кому обращается?», «У какой версии сервиса возникают сбои?» и т.п. В общем, изучите возможности Kiali перед тем, как двигаться дальше — к визуализации метрик с Grafana.

Назад к микросервисам вместе с Istio. Часть 1

Grafana: визуализация метрик

Собранные в Istio метрики попадают в Prometheus и визуализируются с Grafana. Чтобы попасть в административный интерфейс Grafana, выполните команду ниже, после чего откройте http://localhost:3000/:

$ kubectl -n istio-system port-forward 
    $(kubectl -n istio-system get pod -l app=grafana 
    -o jsonpath={.items[0].metadata.name}) 3000

Кликнув на меню Home слева сверху и выбрав Istio Service Dashboard в левом верхнем углу, начните с сервиса sa-web-app, чтобы посмотреть на собранные метрики:

Назад к микросервисам вместе с Istio. Часть 1

Здесь нас ждёт пустое и совершенно скучное представление — руководство никогда такое не одобрит. Давайте же создадим небольшую нагрузку следующей командой:

$ while true; do 
    curl -i http://$EXTERNAL_IP/sentiment 
    -H "Content-type: application/json" 
    -d '{"sentence": "I love yogobella"}'; 
    sleep .8; done

Вот теперь у нас гораздо более симпатичные графики, а в дополнение к ним — замечательные инструменты Prometheus для мониторинга и Grafana для визуализации метрик, что позволят нам узнать о производительности, состоянии здоровья, улучшениях/деградации в работе сервисов на протяжении времени.

Наконец, посмотрим на трассировку запросов в сервисах.

Jaeger : трассировка

Трассировка нам потребуется, потому что чем больше у нас сервисов, тем сложнее добраться до причины сбоя. Посмотрим на простой случай из картинки ниже:

Назад к микросервисам вместе с Istio. Часть 1
Типовой пример случайного неудачного запроса

Запрос приходит, падает — в чём же причина? Первый сервис? Или второй? Исключения есть в обоих — давайте посмотрим на логи каждого. Как часто вы ловили себя за таким занятием? Наша работа больше похожа на детективов программного обеспечения, а не разработчиков…

Это широко распространённая проблема в микросервисах и решается она распределёнными системами трассировки, в которых сервисы передают друг другу уникальный заголовок, после чего эта информация перенаправляется в систему трассировки, где она сопоставляется с данными запроса. Вот иллюстрация:

Назад к микросервисам вместе с Istio. Часть 1
Для идентификации запроса используется TraceId

В Istio используется Jaeger Tracer, который реализует независимый от вендоров фреймворк OpenTracing API. Получить доступ к пользовательского интерфейсу Jaeger можно следующей командой:

$ kubectl port-forward -n istio-system 
    $(kubectl get pod -n istio-system -l app=jaeger 
    -o jsonpath='{.items[0].metadata.name}') 16686

Теперь зайдите на http://localhost:16686/ и выберите сервис sa-web-app. Если сервис не показан в выпадающем меню — проявите/сгенерируйте активность на странице и обновите интерфейс. После этого нажмите на кнопку Find Traces, которая покажет самые последние трейсы — выберите любой — покажется детализированная информация по всем трейсам:

Назад к микросервисам вместе с Istio. Часть 1

Этот трейс показывает:

  1. Запрос приходит в istio-ingressgateway (это первое взаимодействие с одним из сервисов, и для запроса генерируется Trace ID), после чего шлюз направляет запрос в сервис sa-web-app.
  2. В сервисе sa-web-app запрос подхватывается Envoy sidecar'ом, создаётся «ребёнок» в span'е (поэтому мы видим его в трейсах) и перенаправляется в контейнер sa-web-app. (Span — логическая единица работы в Jaeger, имеющая название, время начало операции и её продолжительность. Span'ы могут быть вложенными и упорядоченными. Ориентированный ациклический граф из span'ов образует trace. — прим. перев.)
  3. Здесь запрос обрабатывается методом sentimentAnalysis. Эти трейсы уже сгенерированы приложением, т.е. для них потребовались изменения в коде.
  4. С этого момента инициируется POST-запрос в sa-logic. Trace ID должен быть проброшен из sa-web-app.

Примечание: На 4 шаге приложение должно увидеть заголовки, сгенерированные Istio, и передать их в последующие запросы, как показано на изображении ниже:

Назад к микросервисам вместе с Istio. Часть 1
(A) За проброс заголовков отвечает Istio; (B) За заголовки отвечают сервисы

Istio делает основную работу, т.к. генерирует заголовки для входящих запросов, создаёт новые span'ы в каждом sidecare'е и пробрасывает их. Однако без работы с заголовками внутри сервисов полный путь трассировки запроса будет утерян.

Необходимо учитывать (пробрасывать) следующие заголовки:

x-request-id
x-b3-traceid
x-b3-spanid
x-b3-parentspanid
x-b3-sampled
x-b3-flags
x-ot-span-context

Это несложная задача, однако для упрощения её реализации уже существует множество библиотек — например, в сервисе sa-web-app клиент RestTemplate пробрасывает эти заголовки, если просто добавить библиотеки Jaeger и OpenTracing в его зависимости.

Заметьте, что приложение Sentiment Analysis демонстрирует реализации на Flask, Spring и ASP.NET Core.

Теперь, когда стало ясно, что мы получаем из коробки (или почти «из коробки»), рассмотрим вопросы тонко настраиваемой маршрутизации, управления сетевым трафиком, безопасности и т.п.!

Прим. перев.: об этом читайте в следующей части материалов по Istio от Rinor Maloku, переводы которых последуют в нашем блоге в ближайшее время. UPDATE (14 марта): Вторая часть уже опубликована.

P.S. от переводчика

Читайте также в нашем блоге:

Источник: habr.com

route:
- destination:
host: sa-frontend # 2
port:
number: 80

Punti importanti:

  1. Dan is-Servizz Virtwali jirreferi għal talbiet li jiġu http-gateway;
  2. В destination Is-servizz li lejh jintbagħtu t-talbiet huwa determinat.

Innota: Il-konfigurazzjoni ta' hawn fuq hija maħżuna f'fajl sa-virtualservice-external.yaml, li fih ukoll settings għar-routing f'SA-WebApp u SA-Feedback, iżda tqassar hawn fl-artiklu għall-qosor.

Ejja napplikaw VirtualService billi ċċempel:


Innota: Meta nikkunsmaw ir-riżorsi Istio, is-Server API Kubernetes joħloq avveniment li jiġi riċevut mill-Pjan ta 'Kontroll Istio, u wara dan il-konfigurazzjoni l-ġdida tiġi applikata għall-prokuri tal-Envoy ta' kull pod. U l-kontrollur tal-Ingress Gateway jidher li huwa Mibgħut ieħor konfigurat fil-Pjan ta 'Kontroll. Dan kollu jidher bħal dan fid-dijagramma:

Lura għall-mikroservizzi b'Istio. Parti 1
Istio-IngressGateway konfigurazzjoni għar-rotta tat-talba

Applikazzjoni Analiżi Sentiment issa hija disponibbli fuq http://{EXTERNAL-IP}/. Tinkwetax jekk ikollok status Mhux misjub: Xi drabi tieħu ftit itwal biex il-konfigurazzjoni tidħol fis-seħħ u l-caches tal-Envoy biex jaġġornaw.

Qabel ma tipproċedi, ilgħab ftit bl-app biex tiġġenera t-traffiku. (il-preżenza tagħha hija meħtieġa għaċ-ċarezza f'azzjonijiet sussegwenti - madwar trad.).

Kiali: osservabilità

Biex tasal għall-interface amministrattiva Kiali, mexxi l-kmand li ġej:


... u miftuħa http://localhost:20001/, tidħol bħala admin/admin. Hawnhekk issib ħafna karatteristiċi utli, pereżempju, biex tiċċekkja l-konfigurazzjoni tal-komponenti Istio, tivisualizza s-servizzi billi tuża informazzjoni miġbura mill-interċettazzjoni tat-talbiet tan-netwerk, tikseb tweġibiet għall-mistoqsijiet "Min qed jikkuntattja lil min?", "Liema verżjoni tas-servizz qed tesperjenza. fallimenti?” u l-bqija. B'mod ġenerali, esplora l-kapaċitajiet ta 'Kalii qabel ma tgħaddi għall-viżwalizzazzjoni tal-metriċi ma' Grafana.

Lura għall-mikroservizzi b'Istio. Parti 1

Grafana: viżwalizzazzjoni metrika

Il-metriċi miġbura f'Istio jidħlu fi Prometheus u jiġu viżwalizzati ma' Grafana. Biex tasal għall-interface amministrattiva Grafana, mexxi l-kmand hawn taħt u mbagħad iftaħ http://localhost:3000/:


Ikklikkja fuq il-menu home fuq ix-xellug u l-għażla Istio Service Dashboard fir-rokna tax-xellug ta 'fuq, ibda bis-servizz sa-web-appbiex tħares lejn il-metriċi miġbura:

Lura għall-mikroservizzi b'Istio. Parti 1

Dak li jistenniena hawn huwa prestazzjoni vojta u kompletament boring - il-maniġment qatt mhu se japprova dan. Ejja noħolqu tagħbija żgħira bil-kmand li ġej:


Issa għandna graffs ferm isbaħ, u minbarra dawn, għodod mill-isbaħ Prometheus għall-monitoraġġ u Grafana għall-viżwalizzazzjoni tal-metriċi li jippermettulna nitgħallmu dwar il-prestazzjoni, is-saħħa, titjib / degradazzjoni fis-servizzi maż-żmien.

Fl-aħħarnett, ejja nħarsu lejn it-talbiet tat-traċċar fis-servizzi.

Jaeger: traċċar

Ikollna bżonn it-traċċar għax aktar ma jkollna servizzi, iktar ikun diffiċli li naslu għall-kawża tal-falliment. Ejja nħarsu lejn każ sempliċi mill-istampa hawn taħt:

Lura għall-mikroservizzi b'Istio. Parti 1
Eżempju tipiku ta' talba falluta każwali

It-talba tiġi, taqa - x'inhi r-raġuni? L-ewwel servizz? Jew it-tieni waħda? Hemm eċċezzjonijiet fit-tnejn - ejja nħarsu lejn ir-zkuk ta 'kull wieħed. Kemm-il darba qbadt lilek innifsek tagħmel dan? Ix-xogħol tagħna huwa aktar bħal ditektifs tas-softwer milli żviluppaturi...

Din hija problema komuni fil-mikroservizzi u tissolva permezz ta 'sistemi ta' traċċar distribwiti, li fihom is-servizzi jgħaddu header uniku lil xulxin, u wara din l-informazzjoni tintbagħat lis-sistema ta 'traċċar, fejn titqabbel mad-dejta tat-talba. Hawn illustrazzjoni:

Lura għall-mikroservizzi b'Istio. Parti 1
TraceId jintuża biex jidentifika t-talba

Istio juża Jaeger Tracer, li jimplimenta l-qafas tal-API OpenTracing indipendenti mill-bejjiegħ. Tista' taċċessa l-interface tal-utent Jaeger bil-kmand li ġej:


Issa mur http://localhost:16686/ u agħżel servizz sa-web-app. Jekk is-servizz ma jintwerax fil-menu drop-down, uri/iġġenera attività fuq il-paġna u aġġorna l-interface. Wara dan, ikklikkja fuq il-buttuna Sib Traċċi, li se turi l-aħħar traċċi - agħżel kwalunkwe - se tidher informazzjoni dettaljata dwar it-traċċi kollha:

Lura għall-mikroservizzi b'Istio. Parti 1

Din it-traċċa turi:

  1. It-talba tidħol istio-ingressgateway (din hija l-ewwel interazzjoni ma 'wieħed mis-servizzi, u Trace ID tiġi ġġenerata għat-talba), wara li l-gateway jibgħat it-talba lis-servizz sa-web-app.
  2. Fis-servizz sa-web-app it-talba tinġabar mis-sidecar tal-Envoy, tinħoloq "tifel" fil-medda (għalhekk narawha fit-traċċi) u ridiretta lejn il-kontenitur sa-web-app. (Span - unità loġika tax-xogħol f'Jaeger, li għandha isem, il-ħin tal-bidu tal-operazzjoni u t-tul tagħha. Spans jistgħu jiġu nested u ordnati. Grafika aċiklika diretta ta 'firxiet tifforma traċċa. — madwar. trad.)
  3. Hawnhekk it-talba tiġi pproċessata bil-metodu sentimentAnaliżi. Dawn it-traċċi diġà huma ġġenerati mill-applikazzjoni, i.e. kienu jeħtieġu bidliet fil-kodiċi.
  4. Minn dan il-mument 'il quddiem, tinbeda talba POST fi sa-loġika. Traċċa ID trid tintbagħat minn sa-web-app.
  5. ...

Innota: Fil-pass 4, l-applikazzjoni għandha tara l-intestaturi ġġenerati minn Istio u tgħaddihom għal talbiet sussegwenti kif muri fl-immaġni hawn taħt:

Lura għall-mikroservizzi b'Istio. Parti 1
(A) Istio huwa responsabbli biex jibgħat headers; (B) Is-servizzi huma responsabbli għall-headers

Istio jagħmel ħafna mix-xogħol għax... jiġġenera headers għal talbiet deħlin, joħloq medda ġdida f'kull sidecare u jgħaddihom. Madankollu, mingħajr ma taħdem ma 'headers ġewwa s-servizzi, il-mogħdija sħiħa tat-traċċa tat-talba tintilef.

Għandhom jitqiesu l-intestaturi li ġejjin:


Din mhix kompitu diffiċli, iżda biex tissimplifika l-implimentazzjoni tagħha diġà hemm ħafna libreriji - pereżempju, fis-servizz sa-web-app, il-klijent RestTemplate jgħaddi dawn l-intestaturi jekk sempliċement iżżid il-libreriji Jaeger u OpenTracing ma' il-vizzji tiegħu.

Innota li l-applikazzjoni tal-Analiżi tas-Sentiment turi implimentazzjonijiet f'Flask, Spring, u ASP.NET Core.

Issa li huwa ċar dak li noħorġu mill-kaxxa (jew kważi barra mill-kaxxa), ejja nħarsu lejn ir-rotot irfinat, il-ġestjoni tat-traffiku tan-netwerk, is-sigurtà, eċċ.!

Nota. transl.: Aqra dwar dan fil-parti li jmiss tal-materjali dwar Istio minn Rinor Maloku, it-traduzzjonijiet tagħhom se jsegwu fuq il-blog tagħna fil-futur qarib. UPDATE (14 ta' Marzu): It-tieni parti diġà ġie ppubblikat.

PS minn traduttur

Aqra wkoll fuq il-blog tagħna:

Sors: www.habr.com