Istio көмегімен микросервистерге оралу. 1 бөлім

Istio көмегімен микросервистерге оралу. 1 бөлім

Ескерту. аударма: Қызмет торлары микросервис архитектурасынан кейінгі қолданбаларға арналған бүгінгі инфрақұрылымның өзекті тақырыбына айналды. Istio көптеген DevOps инженерлерінің радарында болуы мүмкін, бірақ бұл өте жаңа өнім, ол қамтамасыз ететін мүмкіндіктері жағынан күрделі болғанымен, танысу үшін көп уақытты қажет етеді. Orange Networks телекоммуникациялық компаниясында ірі клиенттер үшін бұлтты есептеулерге жауапты неміс инженері Ринор Малоку Istio-ға тез және терең енуге мүмкіндік беретін тамаша материалдар сериясын жазды. Ол өз тарихын Истионың не істей алатынынан және оны өз көзіңізбен қалай тез көруге болатынынан бастайды.

Istio — Google, IBM және Lyft командаларымен бірлесіп жасалған Open Source-жоба. Ол микросервистерге негізделген қолданбаларда туындайтын қиындықтарды шешеді, мысалы:

  • қозғалысты басқару: күту, қайталау, жүктемені теңестіру;
  • Қауіпсіздік: соңғы пайдаланушының аутентификациясы және авторизациясы;
  • Бақылау мүмкіндігі: бақылау, бақылау, журналға түсіру.

Олардың барлығын қолданба деңгейінде шешуге болады, бірақ одан кейін сіздің қызметтеріңіз «микро» болмайды. Осы мәселелерді шешуге жұмсалатын барлық қосымша күш – бұл компания ресурстарын ысырап ету, оны бизнес құны үшін тікелей пайдалануға болады. Мысал қарастырайық:

Жоба менеджері: Кері байланыс мүмкіндігін қосу қанша уақытты алады?
Әзірлеуші: Екі спринт.

Депутат: Не?.. Бұл жай ғана CRUD!
R: CRUD жасау оңай бөлік, бірақ біз әлі де пайдаланушылар мен қызметтерді аутентификациялау және авторизациялауымыз керек. Желі сенімсіз болғандықтан, қайталанатын сұрауларды, сондай-ақ іске асыру қажет болады ажыратқыш үлгісі клиенттерде. Сондай-ақ, бүкіл жүйенің апатқа ұшырамағанына көз жеткізу үшін күту уақыты және қалқандар (Аталған екі үлгі туралы қосымша мәліметтер алу үшін кейінірек мақаланы қараңыз.), және проблемаларды анықтау, бақылау, қадағалау, […]

Депутат: О, бұл мүмкіндікті Өнім қызметіне енгізейік.

Менің ойымша, идея түсінікті: бір қызметті қосу үшін қажетті қадамдар мен күш-жігер көлемі өте үлкен. Бұл мақалада біз Istio жоғарыда аталған барлық күрделілікті (бизнес логикасына бағытталмаған) қызметтерден қалай алып тастайтынын қарастырамыз.

Istio көмегімен микросервистерге оралу. 1 бөлім

ескерту: Мақалада сізде Kubernetes туралы жұмыс білімі бар деп болжанады. Әйтпесе, оқуға кеңес беремін менің Кубернетеске кіріспе содан кейін ғана осы материалды оқуды жалғастырыңыз.

Istio идеясы

Istio жоқ әлемде бір қызмет екіншісіне тікелей сұраулар жасайды және сәтсіздікке ұшыраған жағдайда қызмет оны өзі өңдеуі керек: жаңа әрекет жасау, күту уақытын қамтамасыз ету, автоматты ажыратқышты ашу және т.б.

Istio көмегімен микросервистерге оралу. 1 бөлім
Кубернетестегі желілік трафик

Istio, керісінше, желілік өзара әрекеттесуге кедергі жасау арқылы қызметтер мен функциялардан мүлдем бөлек мамандандырылған шешімді ұсынады. Осылайша ол іске асырады:

  • ақауларға төзімділік: жауаптағы күй кодының негізінде ол сұраудың орындалмағанын түсінеді және оны қайта жібереді.
  • Канариялық прокаттар: қызметтің жаңа нұсқасына сұраулардың белгіленген пайызын ғана қайта бағыттайды.
  • Мониторинг және метрика: қызмет жауап беру үшін қанша уақыт қажет болды?
  • Бақылау және бақылау мүмкіндігі: Әрбір сұрауға арнайы тақырыптарды қосады және оларды кластер бойынша қадағалайды.
  • Қауіпсіздік: JWT таңбалауышын шығарып, пайдаланушыларды аутентификациялайды және авторизациялайды.

Бұл сізді қызықтыратын мүмкіндіктердің бірнешеуі ғана (шын мәнінде бірнешеу!). Енді техникалық мәліметтерге тоқталайық!

Архитектура

Istio барлық желілік трафикті ұстайды және оған ережелер жинағын қолданады, әрбір подкольге бүйірлік контейнер түріндегі смарт проксиді енгізеді. Барлық мүмкіндіктерді белсендіретін проксилер a құрайды Деректер жазықтығы, және олар динамикалық түрде конфигурациялануы мүмкін Бақылау жазықтығы.

Деректер жазықтығы

Қоспаларға енгізілген проксилер Istio-ға бізге қажетті талаптарға оңай қол жеткізуге мүмкіндік береді. Мысалы, қайталау және автоматты ажыратқыш функцияларын тексерейік.

Istio көмегімен микросервистерге оралу. 1 бөлім
Envoy бағдарламасында қайталау және тізбекті үзу қалай жүзеге асырылады

Қортындысы:

  1. өкілі (біз бүйірлік контейнерде орналасқан прокси туралы айтып отырмыз, ол таратылады және қалай бөлек өнім - шамамен. аудар.) В қызметінің бірінші инстанциясына сұрау жібереді және сәтсіз аяқталады.
  2. Envo Sidecar тағы әрекеттеніп жатыр (қайталау). (1)
  3. Сәтсіз сұрау оны шақырған проксиге қайтарылады.
  4. Бұл автоматты ажыратқышты ашады және келесі сұраулар үшін келесі қызметті шақырады. (2)

Бұл келесі қайталау кітапханасын пайдаланудың қажеті жоқ дегенді білдіреді, X, Y немесе Z бағдарламалау тілінде тізбекті үзу және сервисті табуды өз бетінше жасаудың қажеті жоқ. Осының барлығы және т.б. қолжетімді. Istio ішіндегі жәшік және талап етпейді жоқ код өзгереді.

Тамаша! Енді сіз Истиомен саяхатқа шыққыңыз келуі мүмкін, бірақ әлі де кейбір күмәндар, ашық сұрақтар бар. Егер бұл өмірдегі барлық жағдайларға арналған әмбебап шешім болса, онда сізде заңды күдік бар: барлық мұндай шешімдер іс жүзінде кез келген жағдайға жарамайды.

Соңында сіз: «Оны теңшеуге бола ма?» Деп сұрайсыз.

Енді сіз теңіз саяхатына дайынсыз - ал Басқару ұшағымен танысайық.

Бақылау жазықтығы

Ол үш компоненттен тұрады: Ұшқыш, Миксер и Цитадель, ол бірге Өкілдерді трафикті бағыттау, саясаттарды қолдану және телеметрия деректерін жинау үшін теңшейді. Схема бойынша бәрі келесідей көрінеді:

Istio көмегімен микросервистерге оралу. 1 бөлім
Басқару жазықтығының деректер жазықтығымен әрекеттесуі

Өкілдер (яғни деректер жазықтығы) конфигурацияланады Kubernetes CRD (Пайдаланушы ресурс анықтамалары) Istio анықтаған және осы мақсат үшін арнайы әзірленген. Бұл сізге нені білдіреді, олар Кубернетестегі таныс синтаксисі бар басқа ресурс болып табылады. Жасалғаннан кейін бұл ресурс басқару ұшағы арқылы қабылданады және Елшілерге қолданылады.

Қызметтердің Istio-мен байланысы

Біз Istio-ның қызметтермен қарым-қатынасын сипаттадық, бірақ керісінше емес: қызметтердің Istio-ға қандай қатысы бар?

Шынымды айтсам, балықтар өздеріне: «Су деген не?» деп сұрағанда, су туралы білетін сияқты, қызмет көрсетушілер де Истионың бар екенін біледі.

Istio көмегімен микросервистерге оралу. 1 бөлім
Суреттер Виктория Димитракопулос: Сізге су қалай ұнайды? - Су деген не?

Осылайша, сіз жұмыс кластерін ала аласыз және Istio құрамдастарын орналастырғаннан кейін ондағы қызметтер жұмысын жалғастырады және осы құрамдастарды жойғаннан кейін бәрі қайтадан жақсы болады. Бұл жағдайда Истио ұсынған мүмкіндіктерден айырылатыныңыз анық.

Теория жеткілікті - бұл білімді тәжірибеде қолданайық!

Іс жүзінде

Istio кемінде 4 vCPU және 8 ГБ жедел жады бар Kubernetes кластерін қажет етеді. Кластерді жылдам көтеру және мақаладағы нұсқауларды орындау үшін мен жаңа пайдаланушыларға ұсынатын Google Cloud платформасын пайдалануды ұсынамын. тегін $300.

Кластерді жасағаннан және консоль утилитасы арқылы Kubernetes-ке кіруді орнатқаннан кейін, Helm бума менеджері арқылы Istio орнатуға болады.

Рульді орнату

Helm клиентін компьютеріңізге бөлімде сипатталғандай орнатыңыз ресми құжаттама. Біз оны келесі бөлімде Istio орнату үшін үлгілерді жасау үшін қолданамыз.

Istio орнатылуда

Isio ресурстарын мына жерден жүктеп алыңыз соңғы шығарылым (1.0.5 нұсқасына түпнұсқа автордың сілтемесі ағымдағыға өзгертілді, яғни 1.0.6 – шамамен аударма), мазмұнын мен сілтеме жасайтын бір каталогқа шығарып алыңыз [istio-resources].

Istio ресурстарын оңай анықтау үшін K8s кластерінде аттар кеңістігін жасаңыз istio-system:

$ kubectl create namespace istio-system

Каталогқа өту арқылы орнатуды аяқтаңыз [istio-resources] және пәрменді іске қосыңыз:

$ 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

Бұл пәрмен Istio негізгі құрамдастарын файлға шығарады istio.yaml. Біз келесі параметрлерді көрсету арқылы стандартты үлгіні өзгерттік:

  • global.mtls.enabled орнатылған false (яғни, mTLS аутентификациясы өшірілген – шамамен аударма)танысу процесін жеңілдету;
  • tracing.enabled Jaeger көмегімен сұрауды қадағалауға мүмкіндік береді;
  • kiali.enabled қызметтер мен трафикті визуализациялау үшін Kiali жүйесін кластерге орнатады;
  • grafana.enabled жиналған көрсеткіштерді көрсету үшін Grafana орнатады.

Жасалған ресурстарды пәрменмен қолданыңыз:

$ kubectl apply -f istio.yaml

Istio кластерінде орнату аяқталды! Барлық қосқыштар аттар кеңістігінде болғанша күтіңіз istio-system алады Running немесе Completedтөмендегі пәрменді іске қосу арқылы:

$ kubectl get pods -n istio-system

Енді біз қосымшаны көтеріп, іске қосатын келесі бөлімге өтуге дайынбыз.

Сезімдерді талдау қолданбасының архитектурасы

Жоғарыда айтылғанда пайдаланылған Сезім талдау микросервис қолданбасының мысалын қолданайық Кубернетеске кіріспе мақаласы. Istio мүмкіндіктерін іс жүзінде көрсету үшін жеткілікті күрделі.

Қолданба төрт микросервистен тұрады:

  1. қызмет көрсету SA-Фронтенд, ол Reactjs жүйесінде фронтальды қолданбаға қызмет етеді;
  2. қызмет көрсету SA WebApp, ол көңіл-күйді талдау сұрауларына қызмет етеді;
  3. қызмет көрсету SA-логика, ол өзін орындайды көңіл-күйді талдау;
  4. қызмет көрсету SA кері байланыс, ол орындалған талдаудың дәлдігі туралы пайдаланушылардан кері байланыс алады.

Istio көмегімен микросервистерге оралу. 1 бөлім

Бұл диаграммада қызметтерге қоса, біз Kubernetes-те кіріс сұрауларын тиісті қызметтерге бағыттайтын кіріс контроллерін де көреміз. Istio өзінің кіру шлюзінде ұқсас тұжырымдаманы пайдаланады, оның егжей-тегжейлері кейінірек болады.

Istio проксиімен қолданбаны іске қосу

Мақалада айтылған қосымша әрекеттер үшін репозиторийіңізді клондаңыз шеберлік. Онда Kubernetes және Istio қолданбалары мен манифестер бар.

Арбаларды салу

Енгізуге болады автоматты түрде немесе қолмен. Бүйірлік контейнерлерді автоматты түрде енгізу үшін белгіні аттар кеңістігіне орнату керек istio-injection=enabled, ол келесі пәрменмен орындалады:

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

Енді әдепкі аттар кеңістігінде орналастырылатын әрбір подкаст (default) өзінің бүйірлік контейнерін алады. Мұны тексеру үшін репозиторийдің түбірлік каталогына өту арқылы сынақ қолданбасын орналастырайық [istio-mastery] және келесі пәрменді іске қосыңыз:

$ 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

Қызметтерді орнатқаннан кейін, пәрменді іске қосу арқылы бөтелкелердің әрқайсысында екі контейнер бар екенін тексеріңіз (қызметтің өзі және оның бүйірі бар) kubectl get pods және бағанның астында екеніне көз жеткізіңіз READY көрсетілген мән 2/2, екі контейнер де жұмыс істеп тұрғанын білдіреді:

$ 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

Көрнекі түрде ол келесідей көрінеді:

Istio көмегімен микросервистерге оралу. 1 бөлім
Қоспалардың біріндегі өкіл прокси

Қолданба жұмыс істеп тұрған кезде, кіріс трафиктің қолданбаға кіруіне рұқсат беруіміз керек.

Кіру шлюзі

Бұған қол жеткізудің ең жақсы тәжірибесі (кластердегі трафикке рұқсат беру) арқылы жүзеге асырылады Кіру шлюзі Istio ішінде кластердің «шетінде» орналасқан және Istio мүмкіндіктерін қосуға мүмкіндік береді, мысалы, маршруттау, жүктемені теңестіру, қауіпсіздік және кіріс трафикті бақылау.

Ingress Gateway құрамдас бөлігі және оны сыртқа жіберетін қызмет Istio орнату кезінде кластерге орнатылды. Қызметтің сыртқы IP мекенжайын білу үшін келесі әрекеттерді орындаңыз:

$ 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

Біз осы IP арқылы қолданбаға қол жеткізуді жалғастырамыз (оны СЫРТҚЫ-IP деп атаймын), сондықтан ыңғайлы болу үшін мәнді айнымалыға жазамыз:

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

Егер сіз қазір браузер арқылы осы IP мекенжайына кіруге әрекеттенсеңіз, Қызмет қолжетімсіз қатесін аласыз, себебі әдепкі бойынша Istio барлық кіріс трафикті блоктайдышлюз анықталғанша.

Шлюз ресурсы

Шлюз - бұл кластерде Istio орнатқаннан кейін анықталған және кіріс трафикке рұқсат бергіміз келетін порттарды, протоколды және хосттарды көрсету мүмкіндігін беретін Kubernetes жүйесіндегі CRD (Теңшелетін ресурс анықтамасы).

Біздің жағдайда біз барлық хосттар үшін 80 портында HTTP трафикіне рұқсат бергіміз келеді. Тапсырма келесі анықтама арқылы жүзеге асырылады (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:
- "*"

Бұл конфигурация селектордан басқа ешқандай түсіндіруді қажет етпейді istio: ingressgateway. Бұл селектордың көмегімен конфигурацияны қай кіріс шлюзіне қолдану керектігін белгілей аламыз. Біздің жағдайда бұл Istio-да әдепкі бойынша орнатылған Ingress Gateway контроллері.

Конфигурация келесі пәрменді шақыру арқылы қолданылады:

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

Шлюз енді 80 портқа кіруге мүмкіндік береді, бірақ сұрауларды қайда бағыттау керектігін білмейді. Бұл үшін сізге қажет болады Виртуалды қызметтер.

VirtualService ресурсы

VirtualService кіріс шлюзіне кластер ішінде рұқсат етілген сұрауларды қалай бағыттау керектігін айтады.

http-шлюз арқылы келетін біздің қолданбаға сұраулар sa-frontend, sa-web-app және sa-кері байланыс қызметтеріне жіберілуі керек:

Istio көмегімен микросервистерге оралу. 1 бөлім
VirtualServices көмегімен конфигурацияланатын маршруттар

SA-Frontend-ке жіберілетін сұрауларды қарастырыңыз:

  • Жол бойында дәл сәйкестік / index.html алу үшін SA-Frontend-ке жіберу керек;
  • Префиксті жолдар /static/* SA-Frontend сайтына CSS және JavaScript сияқты алдыңғы қатарда пайдаланылатын статикалық файлдарды алу үшін жіберу керек;
  • Тұрақты өрнекке сәйкес келетін жолдар '^.*.(ico|png|jpg)$', SA-Frontend-ке жіберу керек, өйткені Бұл бетте көрсетілген суреттер.

Іске асыру келесі конфигурация арқылы жүзеге асырылады (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

Маңызды ұпайлар:

  1. Бұл VirtualService келіп түсетін сұрауларды білдіреді http-шлюз;
  2. В destination Сұраулар жіберілетін қызмет анықталады.

ескерту: Жоғарыдағы конфигурация файлда сақталады sa-virtualservice-external.yaml, ол сонымен қатар SA-WebApp және SA-Кері байланысқа бағыттау параметрлерін қамтиды, бірақ қысқаша болу үшін осы жерде мақалада қысқартылған.

Қоңырау шалу арқылы VirtualService қолданбасын қолданайық:


ескерту: Istio ресурстарын пайдаланған кезде, Kubernetes API сервері Istio басқару жазықтығымен қабылданатын оқиғаны жасайды, содан кейін жаңа конфигурация әрбір подкасттың Envoy прокси-серверлеріне қолданылады. Ал Ingress Gateway контроллері Басқару жазықтығында конфигурацияланған басқа Елші болып көрінеді. Мұның бәрі диаграммада келесідей көрінеді:

Istio көмегімен микросервистерге оралу. 1 бөлім
Сұраныс бағыттау үшін Istio-IngressGateway конфигурациясы

Сезім талдауы енді қол жетімді http://{EXTERNAL-IP}/. Табылмады күйін алсаңыз, уайымдамаңыз: кейде конфигурацияның күшіне енуі және Envoy кэштерінің жаңартылуы үшін сәл ұзағырақ уақыт қажет.

Жалғастырмас бұрын, трафикті жасау үшін қолданбамен аздап ойнаңыз (оның болуы кейінгі әрекеттерде анық болу үшін қажет – шамамен аудар.).

Киали: бақылау мүмкіндігі

Kiali әкімші интерфейсіне өту үшін келесі пәрменді іске қосыңыз:


... және ашыңыз http://localhost:20001/әкімші/әкімші ретінде кіру арқылы. Мұнда сіз көптеген пайдалы мүмкіндіктерді таба аласыз, мысалы, Istio құрамдастарының конфигурациясын тексеру, желілік сұрауларды ұстау арқылы жиналған ақпараттан қызметтерді визуализациялау, «Кім кіммен байланысып жатыр?», «Қызметтің қай нұсқасын бастан кешіруде?» сұрақтарына жауап алу. сәтсіздіктер?» және т.б. Жалпы, Grafana көмегімен көрсеткіштерді визуализациялауға көшпес бұрын Kiali мүмкіндіктерін зерттеңіз.

Istio көмегімен микросервистерге оралу. 1 бөлім

Графана: метрикалық визуализация

Istio-да жиналған көрсеткіштер Prometheus ішіне кіреді және Grafana көмегімен бейнеленеді. Grafana әкімшілік интерфейсіне өту үшін төмендегі пәрменді іске қосыңыз, содан кейін ашыңыз http://localhost:3000/:


Мәзірді басу арқылы Home жоғарғы сол жақ түймесін басып, таңдаңыз Istio қызмет көрсету тақтасы жоғарғы сол жақ бұрышта қызмет көрсетуден бастаңыз sa-web-appжиналған көрсеткіштерді көру үшін:

Istio көмегімен микросервистерге оралу. 1 бөлім

Мұнда бізді бос және әбден жалықтыратын спектакль күтіп тұр – басшылық мұны ешқашан құптамайды. Келесі пәрменмен шағын жүктемені жасайық:


Қазір бізде әлдеқайда әдемі графиктер бар және оларға қосымша бақылауға арналған Prometheus және метрикаларды визуализациялауға арналған Grafana тамаша құралдары бар, бұл бізге өнімділік, денсаулық жағдайы, уақыт өте келе қызметтердің жақсаруы/деградациясы туралы білуге ​​мүмкіндік береді.

Соңында, қызметтердегі сұранысты қадағалауды қарастырайық.

Джейгер: іздеу

Бізге іздестіру қажет, өйткені бізде неғұрлым көп қызметтер болса, сәтсіздіктің себебін анықтау қиынырақ болады. Төмендегі суреттен қарапайым жағдайды қарастырайық:

Istio көмегімен микросервистерге оралу. 1 бөлім
Кездейсоқ орындалмаған сұраудың әдеттегі мысалы

Өтініш келеді, түседі - себебі неде? Бірінші қызмет? Әлде екінші? Екеуінде де ерекшеліктер бар - әрқайсысының журналдарын қарастырайық. Сіз қаншалықты жиі өзіңізді осылай ұстадыңыз? Біздің жұмысымыз әзірлеушілерге қарағанда бағдарламалық қамтамасыз ету детективтеріне көбірек ұқсайды...

Бұл микросервистерде кең тараған мәселе және қызметтер бір-біріне бірегей тақырыпты беретін бөлінген бақылау жүйелері арқылы шешіледі, содан кейін бұл ақпарат іздеу жүйесіне қайта бағытталады, онда ол сұрау деректерімен салыстырылады. Міне, мысал:

Istio көмегімен микросервистерге оралу. 1 бөлім
TraceId сұрауды анықтау үшін пайдаланылады

Istio жеткізушіге тәуелсіз OpenTracing API құрылымын жүзеге асыратын Jaeger Tracer пайдаланады. Сіз Jaeger пайдаланушы интерфейсіне келесі пәрмен арқылы қол жеткізе аласыз:


Енді өтіңіз http://localhost:16686/ және қызметті таңдаңыз sa-web-app. Егер қызмет ашылмалы мәзірде көрсетілмесе, бетте әрекетті көрсетіңіз/жасыңыз және интерфейсті жаңартыңыз. Осыдан кейін түймені басыңыз Іздерді табыңыз, ол ең соңғы іздерді көрсетеді - кез келген таңдаңыз - барлық жолдар туралы толық ақпарат пайда болады:

Istio көмегімен микросервистерге оралу. 1 бөлім

Бұл із көрсетеді:

  1. Өтініш келеді istio-ingressgateway (бұл қызметтердің бірімен бірінші өзара әрекеттесу және сұрау үшін Trace ID жасалады), содан кейін шлюз сұранысты қызметке жібереді sa-web-app.
  2. Қызметте sa-web-app сұрауды Елші бүйір вагоны алады, аралықта «бала» жасалады (сондықтан біз оны іздерде көреміз) және контейнерге қайта бағытталады sa-web-app. (Span - аты, операцияның басталу уақыты және оның ұзақтығы бар Jaeger жұмысының логикалық бірлігі. Аралықтарды кірістіруге және тапсырыс беруге болады. Аралықтардың бағытталған ациклдік графигі ізді құрайды. — шамамен. аудар.)
  3. Мұнда сұраныс әдіспен өңделеді сезімдік талдау. Бұл іздер қолданба арқылы жасалған, яғни. олар кодты өзгертуді талап етті.
  4. Осы сәттен бастап POST сұрауы іске қосылады са-логика. Бақылау идентификаторын келесіден жіберу керек sa-web-app.
  5. ...

ескерту: 4-қадамда қолданба Istio жасаған тақырыптарды көріп, төмендегі суретте көрсетілгендей оларды келесі сұрауларға жіберуі керек:

Istio көмегімен микросервистерге оралу. 1 бөлім
(A) Тақырыпты қайта жіберу - Istio жауапкершілігі; (B) Қызметтер тақырыптарға жауап береді

Istio жұмыстың негізгі бөлігін жасайды, өйткені кіріс сұраулары үшін тақырыптарды жасайды, әр бүйірлік қызметте жаңа аралықтарды жасайды және оларды алға жібереді. Дегенмен, қызметтер ішіндегі тақырыптармен жұмыс істемей, толық сұрауды бақылау жолы жоғалады.

Келесі тақырыптарды қарастыру керек (жіберу):


Бұл қиын міндет емес, бірақ оны жүзеге асыруды жеңілдету қазірдің өзінде бар көптеген кітапханалар - мысалы, sa-web-app қызметінде Jaeger және OpenTracing кітапханаларын жай ғана қоссаңыз, RestTemplate клиенті осы тақырыптарды қайта жібереді. оның тәуелділіктері.

Сезім талдауы қолданбасы Flask, Spring және ASP.NET Core жүйесінде іске асыруды көрсететінін ескеріңіз.

Енді қораптан не алатынымыз (немесе қораптан шыққаны дерлік) түсінікті болғандықтан, маршруттауды дәл баптауды, желілік трафикті басқаруды, қауіпсіздікті және т.б. қарастырайық!

Ескерту. аударма: Бұл туралы Rinor Maloku ұсынған Istio материалдарының келесі бөлігінде оқыңыз, олардың аудармалары жақын арада біздің блогта жарияланады. UPDATE (14 наурыз): Екінші бөлім қазірдің өзінде жарияланған.

Аудармашыдан PS

Біздің блогта да оқыңыз:

Ақпарат көзі: www.habr.com