Бозгашт ба microservices бо Istio. Қисми 1

Бозгашт ба microservices бо Istio. Қисми 1

Шарҳ. тарҷума.: Шабакаҳои хидматрасонӣ бешубҳа як ҳалли мувофиқ дар инфрасохтори муосир барои замимаҳои пас аз меъмории микросервис табдил ёфтанд. Гарчанде ки Истио метавонад дар забони бисёре аз муҳандисони DevOps бошад, он як маҳсулоти хеле нав аст, ки гарчанде аз ҷиҳати қобилиятҳои пешниҳодкардаи он ҳамаҷониба бошад ҳам, барои шинос шудан бо вақти зиёд лозим аст. Муҳандиси олмонӣ Ринор Малоку, ки масъули роёниши абрӣ барои муштариёни калон дар ширкати телекоммуникатсионии Orange Networks мебошад, як қатор маводҳои олиҷанобро навиштааст, ки ба шумо имкон медиҳанд, ки ба Истио зуд ва амиқ ғарқ шавед. Вай саргузашти худро аз он оғоз мекунад, ки Истио умуман чӣ кор карда метавонад ва чӣ тавр шумо онро бо чашмони худ зуд дидан мумкин аст.

Истио — Лоиҳаи кушодаасос, ки дар ҳамкорӣ бо дастаҳои Google, IBM ва Lyft таҳия шудааст. Он мушкилотеро, ки дар барномаҳои микросервисҳо ба вуҷуд меоянд, ҳал мекунад, ба монанди:

  • Идоракунии трафик: танаффусҳо, кӯшишҳои такрорӣ, мувозинати сарборӣ;
  • Амният: аутентификатсия ва иҷозати корбари ниҳоӣ;
  • Мушоҳидашаванда: пайгирӣ, назорат, сабт.

Ҳамаи инҳоро дар сатҳи барнома ҳал кардан мумкин аст, аммо баъд аз он хидматҳои шумо дигар “микро” нестанд. Ҳама кӯшишҳои иловагӣ барои ҳалли ин мушкилот сарфи беҳудаи захираҳои ширкат мебошанд, ки метавонанд мустақиман барои арзиши тиҷорат истифода шаванд. Биёед як мисолро дида бароем:

Менеҷери лоиҳа: Барои илова кардани хусусияти фикру мулоҳиза чӣ қадар вақт лозим аст?
Таҳиягар: Ду спринт.

Депутат: Чӣ?.. Ин танҳо CRUD аст!
R: Иҷрои CRUD қисми осон аст, аммо мо ба ҳар ҳол бояд корбарон ва хидматҳоро тасдиқ ва иҷозат диҳем. Азбаски шабака эътимоднок аст, шумо бояд дархостҳои такрориро иҷро кунед, инчунин намунаи барқгиранда дар мизоҷон. Инчунин, барои боварӣ ҳосил кардани он, ки тамоми система аз кор набарояд, ба шумо мӯҳлатҳои вақт ва болопӯшҳо (барои тафсилоти бештар дар бораи ҳарду намунаи зикршуда, ба баъд дар мақола нигаред - тақрибан тарҷума.), ва барои ошкор кардани мушкилот, мониторинг, пайгирӣ, […]

Депутат: Оҳ, биёед ин хусусиятро ба хидмати Маҳсулот ворид кунем.

Ман фикр мекунам, ки идея равшан аст: миқдори қадамҳо ва кӯшишҳо барои илова кардани як хидмат хеле бузург аст. Дар ин мақола, мо дида мебароем, ки чӣ тавр Istio тамоми мураккабии дар боло зикршударо (ки барои мантиқи тиҷорат пешбинӣ нашудааст) аз хидматҳо хориҷ мекунад.

Бозгашт ба microservices бо Istio. Қисми 1

эрод гирифтан: Ин мақола тахмин мекунад, ки шумо дониши кории Kubernetes доред. Дар акси ҳол, ман хонданро тавсия медиҳам муаррифии ман ба Кубернетес ва танҳо пас аз он ба хондани ин мавод идома диҳед.

Истио идея

Дар ҷаҳони бидуни Истио як хидмат ба дигараш дархостҳои мустақим мекунад ва дар сурати ноком шудан, хидмат бояд онро худаш ҳал кунад: кӯшиши нав кунад, вақтро таъмин кунад, сӯзандоруро кушояд ва ғайра.

Бозгашт ба microservices бо Istio. Қисми 1
Трафики шабакавӣ дар Кубернетес

Истио як ҳалли махсусеро пешниҳод мекунад, ки комилан аз хидматҳо ҷудо карда шудааст ва бо дахолат ба алоқаи шабакавӣ фаъолият мекунад. Ва ин тавр амал мекунад:

  • таҳаммулпазирии хатогиҳо: Дар асоси рамзи вазъ дар посух, он мефаҳмад, ки оё дархост ноком шудааст ва онро дубора иҷро мекунад.
  • Намоиши канарӣ: танҳо фоизи муайяни дархостҳоро ба версияи нави хидмат равона мекунад.
  • Мониторинг ва ченакҳо: Барои посух додан ба хидмат чанд вақт лозим шуд?
  • Мушоҳида ва пайгирӣ: Ба ҳар як дархост сарлавҳаҳои махсус илова мекунад ва онҳоро дар саросари кластер пайгирӣ мекунад.
  • Амният: Токени JWT-ро дарёфт мекунад, корбаронро тасдиқ мекунад ва иҷозат медиҳад.

Инҳо танҳо чанде аз имкониятҳо ҳастанд (дар ҳақиқат танҳо чанде!) Акнун биёед ба тафсилоти техникӣ ғарқ шавем!

Меъмории Истио

Истио тамоми трафики шабакаро боздошта, ба он як қатор қоидаҳоро татбиқ намуда, прокси интеллектуалиро дар шакли контейнери паҳлӯ ба ҳар як подкаст ворид мекунад. Прокси-проксиҳо, ки тамоми қобилиятҳоро фаъол мекунанд, a Ҳавопаймои маълумот, ва онҳо метавонанд бо истифода аз динамикӣ танзим карда шаванд Ҳавопаймои идоракунӣ.

Ҳавопаймои маълумот

Проксиҳои ба pods воридшуда имкон медиҳанд, ки Istio ба осонӣ ба талаботҳои ба мо ниёздошта ҷавобгӯ бошад. Масалан, биёед функсияҳои такрорӣ ва ноқилро тафтиш кунем.

Бозгашт ба microservices бо Istio. Қисми 1
Чӣ тавр озмоишҳои такрорӣ ва шикастани схемаҳо дар Envoy амалӣ карда мешаванд

Барои ҷамъбаст:

  1. Энди (мо дар бораи прокси воқеъ дар як контейнери паҳлӯӣ, ки ҳамчун тақсим карда мешавад маҳсулоти алоҳида - тахминан. тарҷума.) дархостро ба марҳилаи якуми хидмати B мефиристад ва ноком мешавад.
  2. Фиристодаи Сидекар бори дигар кӯшиш мекунад (аз нав кӯшиш кунед). (1)
  3. Дархост ноком мешавад ва ба прокси, ки онро даъват кардааст, баргардонида мешавад.
  4. Ин Circuit Breaker-ро мекушояд ва хидмати навбатиро барои дархостҳои минбаъда даъват мекунад. (2)

Ин маънои онро дорад, ки ба шумо лозим нест, ки китобхонаи дигари Retry -ро истифода баред, ба шумо лозим нест, ки амалисозии Circuit Breaking and Service Discovery-ро бо забони барномасозии X, Y ё Z созед. Ҳамаи ин ва бисёр чизҳои дигар аз қуттӣ дастрасанд дар Истио ва талаб намекунад Не тағйирот дар код.

Аҷоиб! Акнун шумо метавонед бо Истио ба саёҳат рафтан мехоҳед, аммо шумо ҳоло ҳам шубҳа доред, саволҳои кушод доред. Агар ин як ҳалли универсалӣ барои ҳама ҳолатҳои ҳаёт бошад, пас шумо шубҳаи табиӣ доред: дар ниҳоят, ҳамаи ин гуна қарорҳо дар асл барои ҳама ҳолатҳо мувофиқ нестанд.

Ва дар ниҳоят шумо мепурсед: "Оё онро танзим кардан мумкин аст?"

Акнун шумо ба сафари бахрй тайёред, биёед бо самолёти идоракунй шинос шавем.

Ҳавопаймои идоракунӣ

Он аз се ҷузъ иборат аст: Pilot, Миксер и Citadel, ки якҷоя кор мекунанд, то фиристодагонро барои масири трафик, татбиқи сиёсатҳо ва ҷамъоварии маълумоти телеметрӣ танзим кунанд. Схематикӣ ҳамааш чунин менамояд:

Бозгашт ба microservices бо Istio. Қисми 1
Таъсири мутақобилаи ҳавопаймои идоракунӣ бо ҳавопаймои додаҳо

Фиристодагон (яъне ҳавопаймои маълумот) бо истифода аз танзим карда мешаванд Kubernetes CRD (Таърифи захираҳои фармоишӣ), ки аз ҷониби Истио муайян карда шудааст ва махсусан барои ин мақсад пешбинӣ шудааст. Ин барои шумо чӣ маъно дорад, ки онҳо танҳо як манбаи дигари Кубернетес бо синтаксиси шинос ба назар мерасанд. Пас аз офарида шудан, ин захира аз ҷониби ҳавопаймои идоракунӣ гирифта мешавад ва ба фиристодагон татбиқ карда мешавад.

Муносибати хизматрасонӣ ба Истио

Мо муносибати Истиро бо хадамот тавсиф кардем, аммо баръакс: хидматҳо ба Истио чӣ гуна иртибот доранд?

Рости гап, хадамот аз ҳузури Истио чун моҳӣ аз об огоҳанд, вақте аз худ мепурсанд: «Ба ҳар ҳол об чист?».

Бозгашт ба microservices бо Istio. Қисми 1
Масал Виктория Димитракопулос: — Об ба шумо чй тавр маъкул аст? - Ба ҳар ҳол об чист?

Ҳамин тариқ, шумо метавонед як кластери корӣ гиред ва пас аз ҷойгиркунии ҷузъҳои Istio, хидматҳои дар он ҷойгиршуда корро идома медиҳанд ва пас аз нест кардани ин ҷузъҳо ҳама чиз дубора хуб мешавад. Маълум аст, ки дар ин ҳолат шумо имкониятҳои пешниҳодкардаи Истиоро аз даст медиҳед.

Назарияи кифоя — биёед ин донишро дар амал татбик кунем!

Истио дар амал

Истио кластери Kubernetes бо ҳадди ақал 4 vCPU ва 8 ГБ RAM дастрасро талаб мекунад. Барои зуд таъсис додани кластер ва риояи дастурҳои мақола, ман тавсия медиҳам Google Cloud Platform, ки ба корбарони нав пешниҳод мекунад озод $300.

Пас аз сохтани кластер ва танзими дастрасӣ ба Kubernetes тавассути утилитаи консол, шумо метавонед Istio -ро тавассути мудири бастаи Helm насб кунед.

Монтажи руль

Мизоҷи Helm -ро дар компютери худ насб кунед, тавре ки дар ҳуҷҷатҳои расмӣ. Мо инро барои тавлиди қолибҳо барои насби Istio дар фасли оянда истифода хоҳем кард.

Насб кардани Istio

Захираҳои Истиро аз барориши охирин (пайванди аслии муаллиф ба версияи 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-system қодир мешавад Running ё Completedбо иҷро кардани фармони зерин:

$ kubectl get pods -n istio-system

Ҳоло мо омодаем, ки дар фасли оянда идома диҳем, ки дар он ҷо мо барномаро ба кор меандозем.

Архитектураи барномаи таҳлили эҳсосот

Биёед мисоли барномаи microservice Analysis Sentiment Analysis-ро истифода барем, ки дар боло зикр шудааст Мақолаи муқаддимавӣ ба Kubernetes. Барои дар амал нишон додани имко-ниятхои Истио кифоя мураккаб аст.

Ин барнома аз чаҳор хидматрасонии хурд иборат аст:

  1. хизматрасонӣ SA-Фронтенд, ки ба фронти барномаи Reactjs хизмат мерасонад;
  2. хизматрасонӣ SA-WebApp, ки ба дархостҳои Таҳлили эҳсосот хидмат мекунад;
  3. хизматрасонӣ SA-Мантиқ, ки худаш ичро мекунад таҳлили эҳсосот;
  4. хизматрасонӣ SA-Мулоқот, ки аз корбарон дар бораи дурустии таҳлил фикру мулоҳизаҳо мегирад.

Бозгашт ба microservices бо Istio. Қисми 1

Дар ин диаграмма, ба ғайр аз хидматҳо, мо инчунин Controller Ingress-ро мебинем, ки дар Кубернетес дархостҳои воридотӣ ба хидматҳои мувофиқро равона мекунад. Истио як консепсияи шабеҳро дар дохили Gateway Ingress-и худ истифода мебарад, ки тафсилоти бештари он пас аз он хоҳад буд.

Иҷрои барнома бо прокси аз 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

Ба таври визуалӣ он чунин менамояд:

Бозгашт ба microservices бо 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 идома медиҳем (ман онро ҳамчун EXTERNAL-IP меномам), аз ин рӯ, барои роҳат мо арзишро ба тағирёбанда менависем:

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

Агар шумо ҳоло кӯшиш кунед, ки ба ин IP тавассути браузер дастрасӣ пайдо кунед, шумо хатогии хидмати дастнорасро мегиред, зеро бо нобаёнӣ Istio ҳама трафики воридотро маҳкам мекунад, Дарвоза ҳанӯз муайян нашудааст.

Манбаи дарвоза

Gateway як CRD (Таърифи захираҳои фармоишӣ) дар Kubernetes мебошад, ки пас аз насб кардани Istio дар кластер муайян карда мешавад ва имкон медиҳад, ки бандарҳо, протоколҳо ва ҳостҳоро муайян кунад, ки мо мехоҳем трафики даромадро иҷозат диҳем.

Дар ҳолати мо, мо мехоҳем трафики HTTP-ро дар порти 80 барои ҳама ҳостҳо иҷозат диҳем. Вазифа бо таърифи зерин амалӣ карда мешавад (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. Бо ин селектор мо метавонем муайян кунем, ки конфигуратсияро ба кадом Gateway ворид кардан лозим аст. Дар ҳолати мо, ин контролери Gateway Ingress аст, ки ба таври нобаёнӣ дар Istio насб шудааст.

Конфигуратсия тавассути занги фармони зерин татбиқ карда мешавад:

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

Дарвоза ҳоло имкон медиҳад, ки ба порти 80 дастрасӣ пайдо кунад, аммо намедонад, ки дархостҳоро ба куҷо равона кунад. Барои ин ба шумо лозим меояд Хидматҳои виртуалӣ.

Манбаи VirtualService

VirtualService ба Ingress Gateway мегӯяд, ки чӣ гуна масири дархостҳоеро, ки дар дохили кластер иҷозат дода шудаанд, нишон медиҳад.

Дархостҳо ба замимаи мо, ки тавассути http-gateway меоянд, бояд ба хадамоти sa-frontend, sa-web-app ва sa-feedback фиристода шаванд:

Бозгашт ба microservices бо Istio. Қисми 1
Роҳҳое, ки бояд бо VirtualServices танзим карда шаванд

Биёед дархостҳоеро бубинем, ки бояд ба SA-Frontend фиристода шаванд:

  • Мутобиқати дақиқ дар роҳ / бояд ба SA-Frontend барои гирифтани index.html фиристода шавад;
  • Роҳҳои пешакӣ /static/* бояд ба SA-Frontend фиристода шавад, то файлҳои статикиро, ки дар фронт истифода мешаванд, ба монанди CSS ва JavaScript;
  • Роҳҳое, ки бо ифодаи муқаррарӣ мувофиқанд '^.*.(ico|png|jpg)$', бояд ба СА-Фронтенд фиристода шавад, зеро Инҳо тасвирҳое ҳастанд, ки дар саҳифа нишон дода шудаанд.

Амалисозӣ тавассути конфигуратсияи зерин ба даст оварда мешавад (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-Feedback-ро дар бар мегирад, аммо дар ин ҷо барои мухтасар дар мақола кӯтоҳ карда шудааст.

Биёед бо занг задан VirtualService истифода кунем:


эрод гирифтан: Вақте ки мо захираҳои Istio-ро истифода мебарем, сервери Kubernetes API ҳодисаеро эҷод мекунад, ки аз ҷониби ҳавопаймои идоракунии Istio қабул карда мешавад ва пас аз он конфигуратсияи нав ба ҳар як прокси фиристодаи подшоҳ татбиқ мешавад. Ва нозири Gateway Ingress ба назар мерасад, ки фиристодаи дигаре аст, ки дар ҳавопаймои идоракунӣ танзим карда шудааст. Ҳамаи ин дар диаграмма чунин менамояд:

Бозгашт ба microservices бо Istio. Қисми 1
Конфигуратсияи Istio-IngressGateway барои масири дархост

Замимаи таҳлили эҳсосот ҳоло дастрас аст http://{EXTERNAL-IP}/. Парво накунед, агар шумо ҳолати ёфт нашуд: Баъзан барои эътибор пайдо кардани конфигуратсия ва навсозии кэшҳои Envoy каме бештар вақт лозим мешавад.

Пеш аз идома додан, барои тавлиди трафик каме бо барнома бозӣ кунед. (ҳузури он барои возеҳият дар амалҳои минбаъда зарур аст - тақрибан тарҷума.).

Киали: мушоҳидашаванда

Барои ворид шудан ба интерфейси маъмурии Kiali, фармони зеринро иҷро кунед:


... ва кушода http://localhost:20001/, ворид шудан ба сифати admin/admin. Дар ин ҷо шумо бисёр хусусиятҳои муфидро хоҳед ёфт, масалан, барои санҷидани конфигуратсияи ҷузъҳои Истио, визуализатсияи хидматҳо бо истифода аз иттилооте, ки аз боздоштани дархостҳои шабакавӣ ҷамъоварӣ шудааст, ба саволҳои "Кӣ бо кӣ тамос мегирад?", "Кадом версияи хидмат аз сар мегузаронад?" нокомиҳо?» ва ғайра. Умуман, пеш аз гузаштан ба визуализатсияи метрика бо Grafana, қобилиятҳои Kiali-ро омӯзед.

Бозгашт ба microservices бо Istio. Қисми 1

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

Метрикҳои дар Истио ҷамъовардашуда ба Prometheus дохил мешаванд ва бо Grafana визуалӣ карда мешаванд. Барои ворид шудан ба интерфейси маъмурии Grafana, фармони зерро иҷро кунед ва сипас кушоед http://localhost:3000/:


Ба меню пахш кунед хона чапи боло ва интихоб Панели хидматрасонии Истио дар кунҷи чапи боло, бо хидмат оғоз кунед sa-web-appБарои дидани нишондиҳандаҳои ҷамъоварӣ:

Бозгашт ба microservices бо Istio. Қисми 1

Он чизе ки моро дар ин ҷо интизор аст, иҷрои холӣ ва комилан дилгиркунанда аст - роҳбарият ҳеҷ гоҳ инро тасдиқ намекунад. Биёед бо фармони зерин як бори хурд эҷод кунем:


Ҳоло мо графикҳои хеле зебо дорем ва илова бар онҳо, асбобҳои аҷоиби Prometheus барои мониторинг ва Grafana барои визуализатсияи ченакҳо, ки ба мо имкон медиҳанд, ки дар бораи кор, саломатӣ, беҳбудиҳо / таназзули хидматҳо бо мурури замон маълумот гирем.

Ниҳоят, биёед ба пайгирии дархостҳо дар хидматҳо назар андозем.

Ҷейгер: пайгирӣ

Мо ба пайгирӣ ниёз дорем, зеро чӣ қадаре ки хидматҳои мо бештар бошанд, расидан ба сабаби нокомӣ ҳамон қадар мушкилтар мешавад. Биёед як парвандаи оддиро аз расми зер бубинем:

Бозгашт ба microservices бо Istio. Қисми 1
Намунаи маъмулии дархости тасодуфии ноком

Дархост меояд, меафтад - сабаб чист? Аввалин хидмат? Ё дуюм? Дар ҳарду истисноҳо мавҷуданд - биёед ба гузоришҳои ҳар як назар андозем. Шумо чанд вақт худро бо ин кор дастгир кардаед? Кори мо назар ба таҳиягарон бештар ба детективҳои нармафзор монанд аст...

Ин як мушкили маъмул дар хидматрасонии микросервис аст ва тавассути системаҳои пайгирии тақсимшуда ҳал карда мешавад, ки дар он хидматҳо сарлавҳаи беназирро ба ҳамдигар мегузаранд ва пас аз он ин маълумот ба системаи пайгирӣ интиқол дода мешавад, ки он бо маълумоти дархост муқоиса карда мешавад. Инак як мисол:

Бозгашт ба microservices бо Istio. Қисми 1
TraceId барои муайян кардани дархост истифода мешавад

Istio Jaeger Tracer-ро истифода мебарад, ки чаҳорчӯбаи API-и аз фурӯшанда мустақили OpenTracing -ро амалӣ мекунад. Шумо метавонед ба интерфейси корбари Jaeger бо фармони зерин дастрасӣ пайдо кунед:


Акнун ба http://localhost:16686/ ва хидматро интихоб кунед sa-web-app. Агар хидмат дар менюи афтанда нишон дода нашавад, фаъолиятро дар саҳифа нишон диҳед/таҷдид кунед ва интерфейсро навсозӣ кунед. Баъд аз ин, тугмаро пахш кунед Пайдо кардани пайҳо, ки пайраҳои охиринро нишон медиҳад - дилхоҳро интихоб кунед - маълумоти муфассал дар бораи ҳамаи пайҳо пайдо мешавад:

Бозгашт ба microservices бо Istio. Қисми 1

Ин нишон медиҳад:

  1. Дархост ворид мешавад истио-ingressgateway (ин аввалин муомила бо яке аз хадамот аст ва барои дархост ID Trace тавлид мешавад), пас аз он шлюз дархостро ба хидмат мефиристад sa-web-app.
  2. Дар хидмат sa-web-app дархост аз ҷониби мошини фиристодашуда гирифта мешавад, дар фосила "кӯдак" эҷод карда мешавад (бинобар ин мо онро дар пайҳо мебинем) ва ба контейнер равона карда мешавад. sa-web-app. (Span - воҳиди мантиқии кор дар Jaeger, ки дорои ном, вақти оғози амалиёт ва давомнокии он мебошад. Фосилаҳо метавонанд лона ва фармоиш дода шаванд. Графикаи асикликии равонашуда пайро ташкил медиҳад. — тахминан. тарҷума.)
  3. Дар ин ҷо дархост бо усул коркард карда мешавад Таҳлили эҳсосот. Ин пайҳо аллакай аз ҷониби барнома тавлид шудаанд, яъне. онҳо тағйироти кодро талаб мекарданд.
  4. Аз ин лаҳза дархости POST оғоз мешавад са-мантик. ID Trace бояд аз sa-web-app.
  5. ...

эрод гирифтан: Дар қадами 4, барнома бояд сарлавҳаҳои аз ҷониби Istio тавлидшударо бубинад ва онҳоро ба дархостҳои минбаъда, тавре ки дар тасвири зер нишон дода шудааст, интиқол диҳад:

Бозгашт ба microservices бо Istio. Қисми 1
$A) Истио барои интиқоли сарлавҳаҳо масъул аст; (B) Хизматҳо барои сарлавҳаҳо масъуланд

Истио аксари корҳоро иҷро мекунад, зеро ... сарлавҳаҳоро барои дархостҳои воридотӣ тавлид мекунад, дар ҳар як паҳлӯи паҳлӯӣ фосилаҳои нав эҷод мекунад ва онҳоро интиқол медиҳад. Аммо, бидуни кор бо сарлавҳаҳои дохили хидматҳо, роҳи пайгирии дархост пурра гум мешавад.

Сарлавҳаҳои зерин бояд ба назар гирифта шаванд:


Ин кори душвор нест, аммо барои содда кардани татбиқи он аллакай вуҷуд дорад бисьёр китобхонахо - масалан, дар хидмати sa-web-app, муштарии RestTemplate ин сарлавҳаҳоро интиқол медиҳад, агар шумо танҳо китобхонаҳои Jaeger ва OpenTracing -ро ба нашъамандии ӯ.

Дар хотир доред, ки барномаи таҳлили эҳсосот амалияҳоро дар Flask, Spring ва ASP.NET Core нишон медиҳад.

Акнун, ки маълум аст, ки мо аз қуттӣ чӣ мебароем (ё қариб аз қуттӣ), биёед ба масири дақиқи танзимшуда, идоракунии трафики шабака, амният ва ғайра назар кунем!

Шарҳ. тарҷума.: Дар ин бора дар қисми навбатии маводҳои Истио аз Ринор Малоку мутолиа кунед, ки тарҷумаҳои онҳо дар ояндаи наздик дар блоги мо хоҳанд буд. UPDATE (14 март): Қисми дуюм аллакай нашр шудааст.

PS аз тарҷумон

Инчунин дар блоги мо хонед:

Манбаъ: will.com