Yn ôl i microservices gydag Istio. Rhan 1

Yn ôl i microservices gydag Istio. Rhan 1

Nodyn. traws.: Mae rhwyllau gwasanaeth yn bendant wedi dod yn bwnc llosg yn seilwaith heddiw ar gyfer ceisiadau yn dilyn pensaernïaeth microservice. Er y gallai Istio fod ar radar llawer o beirianwyr DevOps, mae'n gynnyrch gweddol newydd a all, er ei fod yn gymhleth o ran y nodweddion y mae'n eu darparu, gymryd cryn dipyn o amser i ddod i adnabod. Mae'r peiriannydd Almaeneg Rinor Maloku, sy'n gyfrifol am gyfrifiadura cwmwl ar gyfer cleientiaid mawr yn y cwmni telathrebu Orange Networks, wedi ysgrifennu cyfres wych o ddeunyddiau sy'n eich galluogi i blymio'n gyflym ac yn ddwfn i Istio. Mae'n dechrau ei stori gyda'r hyn y gall Istio ei wneud a sut y gallwch chi ei weld yn gyflym â'ch llygaid eich hun.

Istio — Prosiect Ffynhonnell Agored, a ddatblygwyd mewn cydweithrediad â thimau o Google, IBM a Lyft. Mae'n datrys y cymhlethdodau sy'n codi mewn cymwysiadau yn seiliedig ar ficrowasanaethau, er enghraifft, megis:

  • rheoli traffig: goramser, ail geisio, cydbwyso llwythi;
  • diogelwch: dilysu ac awdurdodi defnyddiwr terfynol;
  • arsylwi: olrhain, monitro, logio.

Gellir datrys pob un ohonynt ar lefel y cais, fodd bynnag ar ôl hynny ni fydd eich gwasanaethau bellach yn "micro". Mae'r holl ymdrech ychwanegol i fynd i'r afael â'r materion hyn yn wastraff adnoddau cwmni y gellid eu defnyddio'n uniongyrchol ar gyfer gwerth busnes. Ystyriwch enghraifft:

Rheolwr Prosiect: Pa mor hir mae'n ei gymryd i ychwanegu nodwedd adborth?
Datblygwr: Dau sbrint.

MP: Beth?.. Dim ond CRUD ydyw!
R: Gwneud CRUD yw rhan hawdd y dasg, ond mae angen i ni ddilysu ac awdurdodi defnyddwyr a gwasanaethau o hyd. Gan fod y rhwydwaith yn annibynadwy, bydd angen i chi weithredu ceisiadau dro ar ôl tro, yn ogystal â patrwm torrwr cylched mewn cleientiaid. Hefyd, i wneud yn siŵr nad oedd y system gyfan yn chwalu, seibiannau a swmp-bennau (Gweler yn ddiweddarach yn yr erthygl am ragor o fanylion am y ddau batrwm a grybwyllir.), ac er mwyn canfod problemau, monitro, olrhain, […]

MP: O, gadewch i ni roi'r nodwedd hon yn y gwasanaeth Cynnyrch bryd hynny.

Rwy'n meddwl bod y syniad yn glir: mae'r camau a'r ymdrech sydd eu hangen i ychwanegu un gwasanaeth yn enfawr. Yn yr erthygl hon, byddwn yn edrych ar sut mae Istio yn dileu'r holl gymhlethdodau a grybwyllir uchod (heb eu targedu gan resymeg busnes) o wasanaethau.

Yn ôl i microservices gydag Istio. Rhan 1

Nodyn: Mae'r erthygl yn cymryd yn ganiataol bod gennych wybodaeth ymarferol o Kubernetes. Fel arall, rwy'n argymell darllen fy nghyflwyniad i Kubernetes a dim ond wedyn parhau i ddarllen y deunydd hwn.

Syniad Istio

Mewn byd heb Istio, mae un gwasanaeth yn gwneud ceisiadau uniongyrchol i un arall, ac mewn achos o fethiant, rhaid i'r gwasanaeth ei drin ei hun: gwneud ymgais newydd, darparu ar gyfer terfyn amser, agor torrwr cylched, ac ati.

Yn ôl i microservices gydag Istio. Rhan 1
Traffig rhwydwaith yn Kubernetes

Mae Istio, ar y llaw arall, yn cynnig datrysiad arbenigol sy'n gwbl ar wahân i wasanaethau a swyddogaethau trwy ymyrryd â rhyngweithio rhwydwaith. Ac felly mae'n gweithredu:

  • goddefgarwch fai: yn seiliedig ar y cod statws yn yr ymateb, mae'n deall os methodd y cais ac yn ei ailgyflwyno.
  • Rholiadau Dedwydd: yn ailgyfeirio dim ond canran sefydlog o geisiadau i'r fersiwn newydd o'r gwasanaeth.
  • Monitro a Metrigau: faint o amser gymerodd hi i'r gwasanaeth ymateb?
  • Olrhain ac arsylwi: Yn ychwanegu penawdau arbennig at bob cais ac yn eu holrhain ar draws y clwstwr.
  • diogelwch: Yn adalw tocyn JWT, yn dilysu ac yn awdurdodi defnyddwyr.

Dyma rai yn unig o'r posibiliadau (dim ond rhai!) i'ch cynhyrfu. Nawr gadewch i ni blymio i mewn i'r manylion technegol!

Pensaernïaeth

Mae Istio yn rhyng-gipio'r holl draffig rhwydwaith ac yn cymhwyso set o reolau iddo, gan fewnosod dirprwy smart ar ffurf cynhwysydd car ochr ym mhob pod. Mae dirprwyon sy'n actifadu pob posibilrwydd yn ffurfio a Awyren Data, a gellir eu haddasu'n ddeinamig gyda Plân Rheoli.

Awyren Data

Mae'r dirprwyon sy'n cael eu gosod yn y codennau'n caniatáu i Istio gyflawni'r gofynion sydd eu hangen arnom yn hawdd. Er enghraifft, gadewch i ni wirio swyddogaethau ailgynnig a thorrwr cylched.

Yn ôl i microservices gydag Istio. Rhan 1
Sut mae reries a thorri cylched yn cael eu gweithredu yn Envoy

I grynhoi:

  1. Gennad (rydym yn sôn am ddirprwy sydd wedi'i leoli mewn cynhwysydd car ochr, sy'n cael ei ddosbarthu a sut cynnyrch ar wahân - tua. cyfieithu.) yn anfon cais at y lle cyntaf o wasanaeth B ac yn methu.
  2. Mae Cennad Sidecar yn ceisio eto (ailgeisio). (1)
  3. Mae'r cais a fethwyd yn cael ei ddychwelyd i'r dirprwy a'i galwodd.
  4. Mae hyn yn agor y Circuit Breaker ac yn galw'r gwasanaeth nesaf ar gyfer ceisiadau dilynol. (2)

Mae hyn yn golygu nad oes rhaid i chi ddefnyddio'r llyfrgell Retry nesaf, nid oes rhaid i chi wneud eich gweithrediad eich hun o Torri Cylchdaith a Darganfod Gwasanaeth yn yr iaith raglennu X, Y neu Z. Mae hyn i gyd a mwy ar gael allan o'r blwch yn Istio ac nid oes angen dim newidiadau cod.

Gwych! Nawr efallai yr hoffech chi fynd ar daith gydag Istio, ond mae yna rai amheuon o hyd, cwestiynau agored. Os yw hwn yn ateb cyffredinol ar gyfer pob achlysur mewn bywyd, yna mae gennych amheuaeth gyfreithlon: wedi'r cyfan, mewn gwirionedd nid yw pob datrysiad o'r fath yn addas ar gyfer unrhyw achos.

Ac yn olaf rydych chi'n gofyn: "A yw'n addasadwy?"

Nawr rydych chi'n barod am fordaith ar y môr - a gadewch i ni ddod yn gyfarwydd â Control Plane.

Plân Rheoli

Mae'n cynnwys tair cydran: Peilot, Cymysgydd и Citadel, sydd gyda'i gilydd yn ffurfweddu Cenhadon i gyfeirio traffig, gorfodi polisïau, a chasglu data telemetreg. Yn sgematig, mae'r cyfan yn edrych fel hyn:

Yn ôl i microservices gydag Istio. Rhan 1
Rhyngweithio Awyren Reoli ag Awyren Ddata

Mae cenhadon (h.y. awyren ddata) wedi'u ffurfweddu â Kubernetes CRD (Diffiniadau Adnoddau Cwsmer) wedi'u diffinio gan Istio ac wedi'u cynllunio'n benodol at y diben hwn. Beth mae hyn yn ei olygu i chi yw eu bod yn adnodd arall yn Kubernetes gyda chystrawen gyfarwydd. Unwaith y caiff ei greu, bydd yr adnodd hwn yn cael ei godi gan yr awyren reoli a'i gymhwyso i Genhadon.

Perthynas gwasanaethau ag Istio

Rydym wedi disgrifio perthynas Istio â gwasanaethau, ond nid y ffordd arall o gwmpas: sut mae gwasanaethau yn berthnasol i Istio?

A dweud y gwir, mae gwasanaethau'n gwybod am bresenoldeb Istio yn ogystal â physgod yn gwybod am ddŵr, pan fyddant yn gofyn i'w hunain: “Beth yw dŵr beth bynnag?”.

Yn ôl i microservices gydag Istio. Rhan 1
Darlun Victoria Dimitrakopoulos: Sut ydych chi'n hoffi'r dŵr? - Beth yw dŵr beth bynnag?

Felly, gallwch chi gymryd clwstwr gweithio ac ar ôl defnyddio'r cydrannau Istio, bydd y gwasanaethau ynddo yn parhau i weithio, ac ar ôl cael gwared ar y cydrannau hyn, bydd popeth yn iawn eto. Mae'n amlwg yn yr achos hwn y byddwch yn colli'r cyfleoedd a ddarperir gan Istio.

Digon o theori - gadewch i ni roi'r wybodaeth hon ar waith!

Istio yn ymarferol

Mae Istio angen clwstwr Kubernetes gydag o leiaf 4 vCPUs ac 8 GB o RAM ar gael. Er mwyn codi'r clwstwr yn gyflym a dilyn y cyfarwyddiadau o'r erthygl, rwy'n argymell defnyddio Platfform Google Cloud, sy'n cynnig defnyddwyr newydd am ddim $300.

Ar ôl creu'r clwstwr a sefydlu mynediad i Kubernetes trwy'r cyfleustodau consol, gallwch chi osod Istio trwy'r rheolwr pecyn Helm.

Gosod Helm

Gosodwch y cleient Helm ar eich cyfrifiadur fel y disgrifir yn dogfennaeth swyddogol. Byddwn yn ei ddefnyddio i gynhyrchu templedi ar gyfer gosod Istio yn yr adran nesaf.

Gosodiad

Lawrlwythwch adnoddau Istio o datganiad diweddaraf (mae dolen yr awdur gwreiddiol i fersiwn 1.0.5 wedi'i newid i'r un gyfredol, h.y. 1.0.6 - tua. cyfieithiad.), tynnwch y cynnwys i un cyfeiriadur, y byddaf yn cyfeirio ato fel [istio-resources].

Er mwyn adnabod adnoddau Istio yn hawdd, crëwch le enw yn y clwstwr K8s istio-system:

$ kubectl create namespace istio-system

Cwblhewch y gosodiad trwy lywio i'r cyfeiriadur [istio-resources] a rhedeg y gorchymyn:

$ 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

Bydd y gorchymyn hwn yn allbynnu cydrannau allweddol Istio i ffeil istio.yaml. Rydym wedi addasu'r templed safonol i ni ein hunain trwy nodi'r paramedrau canlynol:

  • global.mtls.enabled gosod i mewn false (h.y. dilysiad mTLS wedi'i analluogi - tua. transl.)i symleiddio ein proses dyddio;
  • tracing.enabled galluogi olrhain ceisiadau gyda Jaeger;
  • kiali.enabled yn gosod Kiali mewn clwstwr i ddelweddu gwasanaethau a thraffig;
  • grafana.enabled yn gosod Grafana i ddelweddu'r metrigau a gasglwyd.

Cymhwyswch yr adnoddau a gynhyrchir gyda'r gorchymyn:

$ kubectl apply -f istio.yaml

Mae gosod Istio yn y clwstwr wedi'i gwblhau! Arhoswch nes bod pob cod yn y gofod enw istio-system yn gallu Running neu Completedtrwy redeg y gorchymyn isod:

$ kubectl get pods -n istio-system

Rydym nawr yn barod i barhau i'r adran nesaf, lle byddwn yn codi ac yn rhedeg y cais.

Saernïaeth Cymhwysiad Dadansoddiad Sentiment

Gadewch i ni ddefnyddio'r enghraifft o'r cymhwysiad microwasanaeth Dadansoddi Teimlad a ddefnyddiwyd yn y crybwyllwyd eisoes Erthygl cyflwyniad i Kubernetes..... Mae’n ddigon cymhleth i ddangos posibiliadau Istio yn ymarferol.

Mae'r cais yn cynnwys pedwar microwasanaeth:

  1. Gwasanaeth SA-Flaen, sy'n gwasanaethu'r cais pen blaen ar Reactjs;
  2. Gwasanaeth SA WebApp, sy'n gwasanaethu ymholiadau Dadansoddi Teimladau;
  3. Gwasanaeth Rhesymeg SAsy'n perfformio ei hun dadansoddi teimlad;
  4. Gwasanaeth Adborth SA, sy'n derbyn adborth gan ddefnyddwyr ar gywirdeb y dadansoddiad a gyflawnir.

Yn ôl i microservices gydag Istio. Rhan 1

Yn y diagram hwn, yn ogystal â gwasanaethau, rydym hefyd yn gweld y Rheolwr Ingress, sydd yn Kubernetes yn cyfeirio ceisiadau sy'n dod i mewn i'r gwasanaethau cyfatebol. Mae Istio yn defnyddio cysyniad tebyg fel rhan o'r Porth Ingress, a bydd manylion am hyn yn dilyn.

Lansio cais gyda dirprwy gan Istio

Ar gyfer gweithrediadau pellach a grybwyllir yn yr erthygl, cloniwch eich ystorfa istio-feistrolaeth. Mae'n cynnwys y cymhwysiad a'r maniffestau ar gyfer Kubernetes ac Istio.

Mewnosod ceir ochr

Gellir mewnosod yn awtomatig neu â llaw. I fewnosod cynwysyddion ceir ochr yn awtomatig, mae angen i chi osod y label i'r gofod enw istio-injection=enabled, sy'n cael ei wneud gan y gorchymyn canlynol:

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

Nawr mae pob pod a fydd yn cael ei ddefnyddio yn y gofod enw rhagosodedig (default) Bydd yn cael ei cynhwysydd sidecar. I wirio hyn, gadewch i ni ddefnyddio cais prawf trwy fynd i gyfeiriadur gwraidd yr ystorfa [istio-mastery] a rhedeg y gorchymyn canlynol:

$ 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

Ar ôl defnyddio'r gwasanaethau, gwiriwch fod gan y codennau ddau gynhwysydd (gyda'r gwasanaeth ei hun a'i gar ochr) trwy redeg y gorchymyn kubectl get pods a gwneud yn siwr hynny o dan y golofn READY gwerth penodedig 2/2, sy'n symbol o fod y ddau gynhwysydd yn rhedeg:

$ 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

Yn weledol mae'n edrych fel hyn:

Yn ôl i microservices gydag Istio. Rhan 1
Cenhadwr dirprwy yn un o'r codennau

Nawr bod y cais yn weithredol, mae angen i ni ganiatáu i draffig sy'n dod i mewn ddod i mewn i'r cais.

Porth Mynediad

Yr arfer gorau i gyflawni hyn (caniatáu traffig yn y clwstwr) yw drwy Porth Mynediad yn Istio, sydd wedi'i leoli ar “ymyl” y clwstwr ac sy'n eich galluogi i alluogi nodweddion Istio fel llwybro, cydbwyso llwythi, diogelwch, a monitro ar gyfer traffig sy'n dod i mewn.

Gosodwyd cydran Ingress Gateway a'r gwasanaeth sy'n ei anfon ymlaen ar y clwstwr yn ystod gosodiad Istio. I ddarganfod cyfeiriad IP allanol gwasanaeth, rhedwch:

$ 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

Byddwn yn parhau i gael mynediad i'r cais gan ddefnyddio'r IP hwn (byddaf yn cyfeirio ato fel EXTERNAL-IP), felly er hwylustod, byddwn yn ysgrifennu'r gwerth i newidyn:

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

Os ceisiwch gyrchu'r IP hwn trwy borwr nawr, fe gewch wall Gwasanaeth Ddim ar gael, oherwydd yn ddiofyn mae Istio yn rhwystro'r holl draffig sy'n dod i mewnnes bod Gateway wedi'i ddiffinio.

Adnodd porth

Mae Gateway yn CRD (Diffiniad Adnoddau Cwsmer) yn Kubernetes, wedi'i ddiffinio ar ôl gosod Istio mewn clwstwr a galluogi'r gallu i nodi porthladdoedd, protocol, a gwesteiwyr yr ydym am ganiatáu traffig sy'n dod i mewn ar eu cyfer.

Yn ein hachos ni, rydym am ganiatáu traffig HTTP ar borthladd 80 ar gyfer pob gwesteiwr. Gwireddir y broblem gan y diffiniad canlynol (http-porth.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:
- "*"

Nid oes angen esboniad ar y ffurfweddiad hwn ac eithrio'r dewisydd istio: ingressgateway. Gyda'r dewisydd hwn, gallwn nodi pa Borth Ingress i gymhwyso'r ffurfweddiad iddo. Yn ein hachos ni, dyma'r rheolydd Ingress Gateway, a osodwyd yn ddiofyn yn Istio.

Cymhwysir y ffurfweddiad trwy alw'r gorchymyn canlynol:

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

Mae'r porth bellach yn caniatáu mynediad i borthladd 80 ond nid oes ganddo syniad ble i gyfeirio'r ceisiadau. Ar gyfer hyn bydd angen Gwasanaethau Rhithiol.

Adnodd Gwasanaeth Rhithwir

Mae'r Gwasanaeth Rhithwir yn dweud wrth y Porth Ingress sut i gyfeirio ceisiadau a ganiateir o fewn y clwstwr.

Rhaid anfon ceisiadau i'n cais sy'n dod trwy'r http-gateway i'r gwasanaethau sa-frontend, sa-web-app a sa-feedback:

Yn ôl i microservices gydag Istio. Rhan 1
Llwybrau i'w ffurfweddu gyda Gwasanaethau Rhithwir

Ystyriwch y ceisiadau y dylid eu hanfon at SA-Frontend:

  • Cydweddiad union ar hyd y ffordd / dylid ei anfon i SA-Frontend i gael index.html;
  • Llwybrau gyda rhagddodiad /static/* dylid ei anfon i SA-Frontend i ddefnyddio ffeiliau statig yn y blaen, fel CSS a JavaScript;
  • Llwybrau sy'n cyfateb i'r mynegiant rheolaidd '^.*.(ico|png|jpg)$', rhaid ei anfon i SA-Frontend, oherwydd Dyma'r lluniau sy'n cael eu harddangos ar y dudalen.

Cyflawnir y gweithrediad trwy'r cyfluniad canlynol (sa-rhithwasanaeth-allanol.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

Pwyntiau pwysig:

  1. Mae'r Gwasanaeth Rhithwir hwn yn cyfeirio at geisiadau sy'n dod drwodd http-porth;
  2. В destination yn diffinio'r gwasanaeth yr anfonir y ceisiadau iddo.

Nodyn: Mae'r ffurfweddiad uchod yn cael ei storio mewn ffeil sa-virtualservice-external.yaml, sydd hefyd yn cynnwys gosodiadau ar gyfer llwybro i SA-WebApp ac SA-Adborth, ond sydd wedi'i fyrhau yma yn yr erthygl er mwyn bod yn gryno.

Gwnewch gais am Wasanaeth Rhithwir trwy ffonio:


Nodyn: Pan fyddwn yn cymhwyso adnoddau Istio, mae Gweinydd API Kubernetes yn tanio digwyddiad y mae'r Plane Rheoli Istio yn ei dderbyn, ac ar ôl hynny, mae'r cyfluniad newydd yn cael ei gymhwyso i ddirprwyon Envoy pob pod. Ac mae'n ymddangos bod rheolwr Ingress Gateway yn Gennad arall sydd wedi'i ffurfweddu yn yr Awyren Reoli. Mae hyn i gyd yn edrych fel hyn yn y diagram:

Yn ôl i microservices gydag Istio. Rhan 1
Ffurfweddiad Istio-IngressGateway ar gyfer llwybro ceisiadau

Mae Dadansoddi Teimlad bellach ar gael ar http://{EXTERNAL-IP}/. Peidiwch â phoeni os cewch statws Heb ei Ddarganfod: weithiau mae'n cymryd ychydig mwy o amser i'r cyfluniad ddod i rym ac i'r caches Envoy ddiweddaru.

Cyn symud ymlaen, chwaraewch ychydig gyda'r cais i gynhyrchu traffig (mae ei bresenoldeb yn angenrheidiol er mwyn eglurder mewn gweithredoedd dilynol - tua. transl.).

Kiali: arsylwi

I gyrraedd rhyngwyneb gweinyddol Kiali, rhedwch y gorchymyn canlynol:


…ac yn agored http://localhost:20001/trwy fewngofnodi fel admin/admin. Yma fe welwch lawer o nodweddion defnyddiol, er enghraifft, i wirio cyfluniad cydrannau Istio, delweddu gwasanaethau o'r wybodaeth a gasglwyd trwy ryng-gipio ceisiadau rhwydwaith, cael atebion i'r cwestiynau "Pwy sy'n cysylltu â phwy?", "Pa fersiwn o'r gwasanaeth sy'n profi methiannau?” ac yn y blaen. Yn gyffredinol, archwiliwch bosibiliadau Kiali cyn symud ymlaen i ddelweddu metrigau gyda Grafana.

Yn ôl i microservices gydag Istio. Rhan 1

Grafana: delweddu metrigau

Mae'r metrigau a gasglwyd yn Istio yn gorffen yn Prometheus ac yn cael eu delweddu gyda Grafana. I gyrraedd rhyngwyneb gweinyddol Grafana, rhedeg y gorchymyn isod, yna agor http://localhost:3000/:


Trwy glicio ar y ddewislen Hafan chwith uchaf a dewiswch Dangosfwrdd Gwasanaeth Istio yn y gornel chwith uchaf, dechreuwch gyda'r gwasanaeth sa-we-appi weld y metrigau a gasglwyd:

Yn ôl i microservices gydag Istio. Rhan 1

Yma rydym yn aros am berfformiad gwag a hollol ddiflas - ni fydd rheolwyr byth yn cymeradwyo hyn. Gadewch i ni greu llwyth bach gyda'r gorchymyn canlynol:


Nawr mae gennym ni graffiau llawer harddach, ac yn ogystal â nhw, yr offer gwych Prometheus ar gyfer monitro a Grafana ar gyfer delweddu metrigau, a fydd yn caniatáu inni ddysgu am berfformiad, statws iechyd, gwelliannau / diraddiad mewn gwasanaethau dros amser.

Yn olaf, gadewch i ni edrych ar olrhain ceisiadau mewn gwasanaethau.

Jaeger: olrhain

Bydd angen olrhain, oherwydd po fwyaf o wasanaethau sydd gennym, y mwyaf anodd yw hi i gyrraedd achos y methiant. Edrychwn ar achos syml o'r llun isod:

Yn ôl i microservices gydag Istio. Rhan 1
Enghraifft nodweddiadol o gais a fethwyd ar hap

Cais yn dod, yn disgyn - beth yw'r rheswm? Gwasanaeth cyntaf? Neu yn ail? Mae yna eithriadau yn y ddau - gadewch i ni edrych ar logiau pob un. Pa mor aml ydych chi wedi dal eich hun yn gwneud hyn? Mae ein swydd yn debycach i dditectifs meddalwedd na datblygwyr…

Mae hon yn broblem eang mewn microwasanaethau ac fe'i datrysir gan systemau olrhain gwasgaredig, lle mae gwasanaethau'n trosglwyddo pennawd unigryw i'w gilydd, ac ar ôl hynny mae'r wybodaeth hon yn cael ei hailgyfeirio i'r system olrhain, lle caiff ei chymharu â data'r cais. Dyma enghraifft:

Yn ôl i microservices gydag Istio. Rhan 1
Defnyddir TraceId i nodi'r cais

Mae Istio yn defnyddio Jaeger Tracer, sy'n gweithredu fframwaith API OpenTracing sy'n annibynnol ar werthwyr. Gallwch gyrchu rhyngwyneb defnyddiwr Jaeger gyda'r gorchymyn canlynol:


Nawr ewch i http://localhost:16686/ a dewis gwasanaeth sa-we-app. Os na ddangosir y gwasanaeth yn y gwymplen, dangoswch/cynhyrchwch weithgaredd ar y dudalen a diweddarwch y rhyngwyneb. Ar ôl hynny cliciwch ar y botwm Dod o hyd i olion, a fydd yn dangos yr olion mwyaf diweddar - dewiswch unrhyw - bydd gwybodaeth fanwl am yr holl olion yn ymddangos:

Yn ôl i microservices gydag Istio. Rhan 1

Mae'r olrhain hwn yn dangos:

  1. Daw'r cais i mewn istio-porth mynediad (dyma'r rhyngweithiad cyntaf ag un o'r gwasanaethau, a chynhyrchir Trace ID ar gyfer y cais), ac ar ôl hynny mae'r porth yn anfon y cais i'r gwasanaeth sa-we-app.
  2. Mewn gwasanaeth sa-we-app mae'r cais yn cael ei godi gan gar ochr yr Envoy, mae "plentyn" yn cael ei greu yn y rhychwant (dyna pam rydyn ni'n ei weld mewn olion) a'i ailgyfeirio i'r cynhwysydd sa-we-app. (Rhychwant - uned waith resymegol yn Jaeger, gydag enw, amser cychwyn y llawdriniaeth a'i hyd. Gellir nythu ac archebu rhychwantau. Mae graff acyclic cyfeiriedig o rychwantau yn ffurfio olin. - tua. cyfieithu.)
  3. Yma mae'r cais yn cael ei brosesu gan y dull Dadansoddi sentiment. Mae'r olion hyn eisoes yn cael eu cynhyrchu gan y cais, h.y. roedd angen newidiadau cod arnynt.
  4. O'r foment hon, mae cais POST yn cael ei gychwyn yn sa-rhesymeg. Rhaid anfon ID Olrhain ymlaen o sa-we-app.
  5. ...

Nodyn: Yng ngham 4, dylai'r cais weld y penawdau a gynhyrchir gan Istio a'u trosglwyddo i geisiadau dilynol, fel y dangosir yn y ddelwedd isod:

Yn ôl i microservices gydag Istio. Rhan 1
(A) Cyfrifoldeb Istio yw anfon penawdau ymlaen; (B) Gwasanaethau sy'n gyfrifol am benawdau

Mae Istio yn gwneud y rhan fwyaf o'r gwaith oherwydd yn cynhyrchu penawdau ar gyfer ceisiadau sy'n dod i mewn, yn creu rhychwantau newydd ym mhob gofal ochr ac yn eu hanfon ymlaen. Fodd bynnag, heb weithio gyda phenawdau y tu mewn i wasanaethau, bydd y llwybr olrhain cais llawn yn cael ei golli.

Rhaid ystyried y penawdau canlynol (anfon ymlaen):


Mae hon yn dasg syml, ond i symleiddio ei gweithredu, mae eisoes llawer o lyfrgelloedd - er enghraifft, yn y gwasanaeth sa-web-app, mae cleient RestTemplate yn anfon y penawdau hyn ymlaen os ydych chi'n ychwanegu'r llyfrgelloedd Jaeger ac OpenTracing at ei dibyniaethau.

Sylwch fod y cymhwysiad Dadansoddi Teimlad yn dangos gweithrediadau yn Fflasg, Gwanwyn, ac ASP.NET Core.

Nawr ei bod hi'n glir beth rydyn ni'n ei gael allan o'r bocs (neu bron allan o'r bocs), gadewch i ni edrych ar fireinio llwybro, rheoli traffig rhwydwaith, diogelwch, a mwy!

Nodyn. traws.: darllenwch am hyn yn y rhan nesaf o ddeunyddiau ar Istio gan Rinor Maloku, y bydd y cyfieithiadau ohonynt yn dilyn ar ein blog yn y dyfodol agos. Y NEWYDDION DIWEDDARAF (Mawrth 14eg): Ail ran cyhoeddwyd eisoes.

PS gan y cyfieithydd

Darllenwch hefyd ar ein blog:

Ffynhonnell: hab.com