Istio ilə mikroservislərə qayıdın. 1-ci hissə

Istio ilə mikroservislərə qayıdın. 1-ci hissə

Qeyd. tərcümə.: Xidmət şəbəkələri mikroservis arxitekturasından sonra tətbiqlər üçün bugünkü infrastrukturda mütləq aktual mövzuya çevrilmişdir. Istio bir çox DevOps mühəndisinin radarında olsa da, təqdim etdiyi xüsusiyyətlər baxımından mürəkkəb olsa da, tanış olmaq üçün xeyli vaxt tələb edə bilən kifayət qədər yeni bir məhsuldur. Orange Networks telekommunikasiya şirkətində böyük müştərilər üçün bulud hesablamalarına cavabdeh olan alman mühəndis Rinor Maloku sizə Istio-ya tez və dərindən dalmağa imkan verən gözəl materiallar silsiləsi yazıb. O, hekayəsinə Istionun nə edə biləcəyi və onu öz gözlərinizlə necə tez görə biləcəyinizlə başlayır.

İstio — Google, IBM və Lyft komandaları ilə əməkdaşlıqda hazırlanmış Open Source-layihəsi. Mikroservislərə əsaslanan tətbiqlərdə yaranan mürəkkəblikləri həll edir, məsələn:

  • trafikin idarə edilməsi: fasilələr, təkrar cəhdlər, yük balansı;
  • təhlükəsizlik: son istifadəçinin autentifikasiyası və avtorizasiyası;
  • müşahidə qabiliyyəti: izləmə, monitorinq, giriş.

Onların hamısı tətbiq səviyyəsində həll edilə bilər, lakin bundan sonra xidmətləriniz artıq "mikro" olmayacaq. Bu problemləri həll etmək üçün bütün əlavə səylər birbaşa biznes dəyəri üçün istifadə edilə bilən şirkət resurslarının israfıdır. Məsələni nəzərdən keçirək:

Layihə meneceri: Əlaqə funksiyasını əlavə etmək nə qədər vaxt aparır?
İnkişaf etdirici: İki sprint.

Deputat: Nə?.. Bu, sadəcə olaraq CRUD-dur!
R: CRUD-u yerinə yetirmək tapşırığın asan hissəsidir, lakin biz hələ də istifadəçilərin və xidmətlərin autentifikasiyasını və icazəsini verməliyik. Şəbəkə etibarsız olduğundan, təkrar sorğuları, eləcə də həyata keçirməli olacaqsınız dövrə açarı nümunəsi müştərilərdə. Həmçinin, bütün sistemin qəzaya uğramadığından əmin olmaq üçün, fasilələr və qabarcıqlar (Hər iki qeyd olunan nümunə haqqında daha ətraflı məlumat üçün məqalədə daha sonra baxın.)və problemləri aşkar etmək üçün monitorinq, izləmə, […]

MP: Oh, gəlin bu xüsusiyyəti Məhsul xidmətinə daxil edək.

Düşünürəm ki, ideya aydındır: tək bir xidmət əlavə etmək üçün tələb olunan addımların və səylərin miqdarı böyükdür. Bu yazıda Istio-nun yuxarıda qeyd olunan bütün mürəkkəbliyi (biznes məntiqi ilə hədəflənməyən) xidmətlərdən necə aradan qaldırdığına nəzər salacağıq.

Istio ilə mikroservislərə qayıdın. 1-ci hissə

Qeyd: Məqalədə Kubernetes haqqında iş biliyə malik olduğunuz güman edilir. Əks halda oxumağı məsləhət görürəm Kuberneteslə tanışlığım və yalnız bundan sonra bu materialı oxumağa davam edin.

Istio ideyası

Istio olmayan bir dünyada bir xidmət digərinə birbaşa sorğular göndərir və uğursuzluq halında xidmət bunu özü idarə etməlidir: yeni cəhd edin, fasilə təmin edin, elektrik açarını açın və s.

Istio ilə mikroservislərə qayıdın. 1-ci hissə
Kubernetesdə şəbəkə trafiki

Istio isə şəbəkənin qarşılıqlı əlaqəsinə müdaxilə edərək xidmətlərdən və funksiyalardan tamamilə ayrı olan xüsusi bir həll təklif edir. Və beləliklə həyata keçirir:

  • xətaya dözümlülük: cavabdakı status koduna əsasən sorğunun uğursuz olub olmadığını anlayır və onu yenidən göndərir.
  • Canary Rollouts: sorğuların yalnız sabit faizini xidmətin yeni versiyasına yönləndirir.
  • Monitorinq və Metriklər: xidmətin cavab verməsi nə qədər çəkdi?
  • İzləmə və müşahidə qabiliyyəti: Hər sorğuya xüsusi başlıqlar əlavə edir və onları klaster üzrə izləyir.
  • təhlükəsizlik: JWT tokenini əldə edir, istifadəçiləri autentifikasiya edir və icazə verir.

Bunlar sizi maraqlandıran imkanlardan yalnız bir neçəsidir (həqiqətən də bir neçəsidir!). İndi texniki detallara keçək!

Memarlıq

Istio bütün şəbəkə trafikini kəsir və ona bir sıra qaydalar tətbiq edir, hər bir podda yan avtomobil konteyneri şəklində ağıllı bir proxy daxil edir. Bütün imkanları aktivləşdirən proksilər a Məlumat təyyarəsi, və onlar dinamik olaraq tənzimlənə bilər Nəzarət Planı.

Məlumat təyyarəsi

Podlara daxil edilən proksilər Istio-ya ehtiyacımız olan tələblərə asanlıqla nail olmağa imkan verir. Məsələn, təkrar cəhdləri və elektrik açarı funksiyalarını yoxlayaq.

Istio ilə mikroservislərə qayıdın. 1-ci hissə
Envoy-da təkrar cəhdlər və dövrə qırılması necə həyata keçirilir

Xülasə:

  1. elçi (söhbət yan vaqon konteynerində yerləşən bir proxydən gedir, hansı paylanır və necə ayrı məhsul - təqribən. tərcümə.) B xidmətinin birinci instansiyasına sorğu göndərir və uğursuz olur.
  2. Elçi Sidecar yenidən cəhd edir (yenidən cəhd). (1)
  3. Uğursuz sorğu onu çağıran proksiyə qaytarılır.
  4. Bu, Circuit Breaker-i açır və sonrakı sorğular üçün növbəti xidməti çağırır. (2)

Bu o deməkdir ki, siz növbəti Yenidən Sınaq kitabxanasından istifadə etməli deyilsiniz, X, Y və ya Z proqramlaşdırma dilində Circuit Breaking və Service Discovery proqramlarınızı özünüz həyata keçirməli deyilsiniz. qutusu Istio və tələb etmir heç bir kod dəyişiklikləri.

Əla! İndi Istio ilə səyahətə çıxmaq istəyə bilərsiniz, lakin hələ də bəzi şübhələr, açıq suallar var. Əgər bu, həyatın bütün halları üçün universal bir həlldirsə, onda sizin haqlı bir şübhəniz var: bütün bu cür həllər əslində heç bir iş üçün uyğun deyil.

Və nəhayət soruşursunuz: "Bu, fərdiləşdirilə bilərmi?"

İndi siz dəniz səyahətinə hazırsınız - gəlin Control Plane ilə tanış olaq.

Nəzarət Planı

Üç komponentdən ibarətdir: Pilot, Qarışdırıcı и Citadel, bu birlikdə Envoyları trafiki yönləndirmək, siyasətləri tətbiq etmək və telemetriya məlumatlarını toplamaq üçün konfiqurasiya edir. Sxematik olaraq, hər şey belə görünür:

Istio ilə mikroservislərə qayıdın. 1-ci hissə
İdarəetmə müstəvisinin məlumat müstəvisi ilə qarşılıqlı əlaqəsi

Elçilər (yəni məlumat müstəvisi) ilə konfiqurasiya edilir Kubernetes CRD (Xüsusi Resurs Tərifləri) Istio tərəfindən müəyyən edilmiş və xüsusi olaraq bu məqsəd üçün hazırlanmışdır. Bunun sizin üçün mənası odur ki, onlar Kubernetesdə tanış sintaksisi olan başqa bir mənbədir. Yaradılandan sonra bu resurs idarəetmə təyyarəsi tərəfindən götürüləcək və Elçilərə tətbiq olunacaq.

Xidmətlərin Istio ilə əlaqəsi

Biz Istio-nun xidmətlərlə əlaqəsini təsvir etdik, lakin əksinə deyil: xidmətlərin Istio ilə necə əlaqəsi var?

Düzünü desəm, xidmətlər İstionun varlığından xəbərdar olduğu kimi, balıqlar da özlərinə sual verəndə su haqqında bilirlər: “Hər halda su nədir?”.

Istio ilə mikroservislərə qayıdın. 1-ci hissə
İllüstrasiya Viktoriya Dimitrakopulos: Suyu necə sevirsən? - Onsuz da su nədir?

Beləliklə, bir işçi klaster götürə bilərsiniz və Istio komponentlərini yerləşdirdikdən sonra içindəki xidmətlər işləməyə davam edəcək və bu komponentləri çıxardıqdan sonra hər şey yenidən yaxşı olacaq. Aydın məsələdir ki, bu halda İstionun verdiyi imkanları itirəcəksiniz.

Kifayət qədər nəzəriyyə - gəlin bu biliyi praktikada tətbiq edək!

Istio praktikada

Istio ən azı 4 vCPU və 8 GB RAM mövcud olan Kubernetes klasterini tələb edir. Klasteri tez bir zamanda artırmaq və məqalədəki təlimatlara əməl etmək üçün yeni istifadəçilərə təklif edən Google Bulud Platformasından istifadə etməyi məsləhət görürəm. pulsuz 300 dollar.

Klaster yaratdıqdan və konsol yardım proqramı vasitəsilə Kubernetes-ə girişi qurduqdan sonra Helm paket meneceri vasitəsilə Istio quraşdıra bilərsiniz.

Dəkan quraşdırılması

Helm müştəri-də təsvir olunduğu kimi kompüterinizə quraşdırın rəsmi sənədlər. Növbəti bölmədə Istio quraşdırmaq üçün şablonlar yaratmaq üçün ondan istifadə edəcəyik.

Quraşdırma

İstio resurslarını yükləyin son buraxılış (orijinal müəllifin 1.0.5 versiyasına keçidi indiki birinə dəyişdirilib, yəni 1.0.6 - təqribən tərcümə), məzmunu mən istinad edəcəyim bir kataloqa çıxarın [istio-resources].

Istio resurslarının asan identifikasiyası üçün K8s klasterində ad sahəsi yaradın istio-system:

$ kubectl create namespace istio-system

Kataloqa keçərək quraşdırmanı tamamlayın [istio-resources] və əmri işlədir:

$ 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

Bu əmr Istio-nun əsas komponentlərini fayla çıxaracaq istio.yaml. Aşağıdakı parametrləri göstərərək standart şablonu özümüz üçün dəyişdirdik:

  • global.mtls.enabled quraşdırılıb false (yəni mTLS autentifikasiyası deaktiv edilib - təqribən tərcümə)tanışlıq prosesimizi sadələşdirmək;
  • tracing.enabled Jaeger ilə sorğu izləməyə imkan verir;
  • kiali.enabled xidmətləri və trafiki vizuallaşdırmaq üçün Kiali-ni klasterə quraşdırır;
  • grafana.enabled toplanmış ölçüləri vizuallaşdırmaq üçün Grafana quraşdırır.

Yaradılan resursları komanda ilə tətbiq edin:

$ kubectl apply -f istio.yaml

Istio-nun klasterdə quraşdırılması tamamlandı! Ad sahəsindəki bütün podlar görünənə qədər gözləyin istio-system bacaracaq Running və ya Completedaşağıdakı əmri işlətməklə:

$ kubectl get pods -n istio-system

Biz indi tətbiqi qaldırıb işə salacağımız növbəti bölməyə davam etməyə hazırıq.

Sentiment Analizi Tətbiq Memarlığı

Artıq qeyd olunanlarda istifadə olunan Sentiment Analysis mikroservis tətbiqi nümunəsindən istifadə edək Kubernetes-ə giriş məqaləsi. İstionun imkanlarını praktikada göstərmək üçün kifayət qədər mürəkkəbdir.

Tətbiq dörd mikroservisdən ibarətdir:

  1. Xidmət SA-Cəbhə, Reactjs-də front-end tətbiqinə xidmət edir;
  2. Xidmət SA Veb Tətbiqi, Sentiment Analizi sorğularına xidmət edən;
  3. Xidmət SA Məntiqözünü həyata keçirən hiss təhlili;
  4. Xidmət SA Əlaqə, istifadəçilərdən aparılan təhlilin düzgünlüyünə dair rəy alan.

Istio ilə mikroservislərə qayıdın. 1-ci hissə

Bu diaqramda, xidmətlərə əlavə olaraq, Kubernetes-də daxil olan sorğuları müvafiq xidmətlərə yönləndirən Giriş Nəzarətçisini də görürük. Istio oxşar konsepsiyadan Ingress Gateway-in bir hissəsi kimi istifadə edir, təfərrüatları bundan sonra veriləcəkdir.

Istio-dan proxy ilə proqram işə salınır

Məqalədə qeyd olunan əlavə əməliyyatlar üçün anbarınızı klonlayın ustalıq. O, Kubernetes və Istio üçün tətbiqi və manifestləri ehtiva edir.

Yan arabaların daxil edilməsi

Daxil etmək olar avtomatik olaraq və ya əllə. Yan araba konteynerlərini avtomatik daxil etmək üçün etiketi ad sahəsinə təyin etməlisiniz istio-injection=enabled, bu aşağıdakı əmrlə edilir:

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

İndi standart ad məkanında yerləşdiriləcək hər bir pod (default) yan arabası qabını alacaq. Bunu yoxlamaq üçün anbarın kök qovluğuna keçərək sınaq tətbiqini yerləşdirək [istio-mastery] və aşağıdakı əmri işlədir:

$ 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

Xidmətləri yerləşdirdikdən sonra, əmri işlətməklə podların hər birində iki konteynerin (xidmətin özü və yan arabası ilə) olduğunu yoxlayın. kubectl get pods və sütunun altında olduğundan əmin olun READY dəyər müəyyən edilmişdir 2/2, hər iki konteynerin işlədiyini simvollaşdırır:

$ 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

Vizual olaraq belə görünür:

Istio ilə mikroservislərə qayıdın. 1-ci hissə
Qruplardan birində elçi proxy

Tətbiq işlək vəziyyətdə olduğundan, daxil olan trafikin tətbiqə daxil olmasına icazə verməliyik.

Giriş Gateway

Buna nail olmaq üçün ən yaxşı təcrübə (klasterdə trafikə icazə vermək) vasitəsilə həyata keçirilir Giriş Gateway klasterin "kənarında" yerləşən və marşrutlaşdırma, yük balansı, təhlükəsizlik və gələn trafikin monitorinqi kimi Istio xüsusiyyətlərini aktivləşdirməyə imkan verən Istio-da.

Ingress Gateway komponenti və onu xaricə yönləndirən xidmət Istio quraşdırılması zamanı klasterdə quraşdırılmışdır. Xidmətin xarici IP ünvanını öyrənmək üçün aşağıdakıları yerinə yetirin:

$ 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

Bu IP-dən istifadə edərək proqrama daxil olmağa davam edəcəyik (onu XARİCİ-IP adlandıracağam), rahatlıq üçün dəyişənə dəyəri yazacağıq:

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

İndi brauzer vasitəsilə bu IP-yə daxil olmağa cəhd etsəniz, Xidmət əlçatan deyil xətası alacaqsınız, çünki default olaraq Istio bütün gələn trafiki bloklayırGateway müəyyən edilənə qədər.

Gateway resursu

Gateway Kubernetes-də Istio-nu klasterdə quraşdırdıqdan sonra müəyyən edilən və daxil olan trafikə icazə vermək istədiyimiz portları, protokolları və hostları təyin etmək imkanı verən CRD-dir (Xüsusi Resurs Tərifidir).

Bizim vəziyyətimizdə biz bütün hostlar üçün 80 portunda HTTP trafikinə icazə vermək istəyirik. Problem aşağıdakı təriflə həyata keçirilir (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:
- "*"

Bu konfiqurasiya seçicidən başqa heç bir izahata ehtiyac duyur istio: ingressgateway. Bu seçici ilə konfiqurasiyanın hansı Ingress Gateway-ə tətbiq ediləcəyini təyin edə bilərik. Bizim vəziyyətimizdə bu, Istio-da standart olaraq quraşdırılmış Ingress Gateway nəzarətçisidir.

Konfiqurasiya aşağıdakı əmri çağırmaqla tətbiq olunur:

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

Şlüz indi 80-ci porta giriş imkanı verir, lakin sorğuların hara yönləndiriləcəyi barədə heç bir fikri yoxdur. Bunun üçün sizə lazım olacaq Virtual Xidmətlər.

Virtual xidmət resursu

VirtualService Ingress Gateway-ə klaster daxilində icazə verilən sorğuların necə yönləndiriləcəyini bildirir.

Tətbiqimizə http-şlüzdən gələn sorğular sa-frontend, sa-web-app və sa-reedback xidmətlərinə göndərilməlidir:

Istio ilə mikroservislərə qayıdın. 1-ci hissə
VirtualServices ilə konfiqurasiya ediləcək marşrutlar

SA-Frontend-ə göndərilməli olan sorğuları nəzərdən keçirin:

  • Yol boyu dəqiq uyğunluq / index.html əldə etmək üçün SA-Frontend-ə göndərilməlidir;
  • Prefiksli yollar /static/* CSS və JavaScript kimi frontenddə istifadə olunan statik faylları əldə etmək üçün SA-Frontend-ə göndərilməlidir;
  • Normal ifadəyə uyğun gələn yollar '^.*.(ico|png|jpg)$', SA-Frontend-ə göndərilməlidir, çünki Səhifədə göstərilən şəkillər bunlardır.

Tətbiq aşağıdakı konfiqurasiya ilə əldə edilir (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

Mühüm points:

  1. Bu VirtualService gələn sorğulara aiddir http-gateway;
  2. В destination sorğuların göndərildiyi xidməti müəyyən edir.

Qeyd: Yuxarıdakı konfiqurasiya faylda saxlanılır sa-virtualservice-external.yaml, bu da SA-WebApp və SA-Feedback-ə marşrutlaşdırma parametrlərini ehtiva edir, lakin burada qısalıq üçün məqalədə qısaldılmışdır.

Zəng edərək VirtualService tətbiq edin:


Qeyd: Istio resurslarını tətbiq etdikdə, Kubernetes API Serveri Istio Control Plane-in qəbul etdiyi hadisəni işə salır və bundan sonra yeni konfiqurasiya hər podun Elçi proksisinə tətbiq edilir. Və Ingress Gateway nəzarətçisi İdarə Planında konfiqurasiya edilmiş başqa bir Elçi kimi görünür. Bütün bunlar diaqramda belə görünür:

Istio ilə mikroservislərə qayıdın. 1-ci hissə
Sorğu yönləndirməsi üçün Istio-IngressGateway konfiqurasiyası

Sentiment Analizi indi əlçatandır http://{EXTERNAL-IP}/. Tapılmadı statusu alsanız narahat olmayın: bəzən konfiqurasiyanın qüvvəyə minməsi və Envoy keşlərinin yenilənməsi bir az daha uzun çəkir.

Davam etməzdən əvvəl, trafik yaratmaq üçün proqramla bir az oynayın (onun mövcudluğu sonrakı hərəkətlərdə aydınlıq üçün zəruridir - təqribən tərcümə.).

Kiali: müşahidə qabiliyyəti

Kiali admin interfeysinə daxil olmaq üçün aşağıdakı əmri yerinə yetirin:


...və açın http://localhost:20001/admin/admin kimi daxil olmaqla. Burada siz bir çox faydalı funksiyaları tapa bilərsiniz, məsələn, Istio komponentlərinin konfiqurasiyasını yoxlamaq, şəbəkə sorğularını ələ keçirməklə toplanmış məlumatlardan xidmətləri vizuallaşdırmaq, “Kim kiminlə əlaqə saxlayır?”, “Xidmətin hansı versiyası ilə qarşılaşır?” suallarına cavab almaq. uğursuzluqlar?" və s. Ümumiyyətlə, Grafana ilə ölçüləri vizuallaşdırmağa keçməzdən əvvəl Kialinin imkanlarını araşdırın.

Istio ilə mikroservislərə qayıdın. 1-ci hissə

Grafana: ölçülərin vizuallaşdırılması

Istio-da toplanmış ölçülər Prometeydə başa çatır və Grafana ilə vizuallaşdırılır. Grafana admin interfeysinə daxil olmaq üçün aşağıdakı əmri işə salın, sonra açın http://localhost:3000/:


Menyuya klikləməklə Əsas səhifə yuxarı sol və seçin Istio Xidmət İdarə Paneli yuxarı sol küncdə xidmətlə başlayın sa-web-apptoplanmış göstəricilərə baxmaq üçün:

Istio ilə mikroservislərə qayıdın. 1-ci hissə

Burada biz boş və tamamilə darıxdırıcı bir performans gözləyirik - rəhbərlik bunu heç vaxt təsdiqləməyəcək. Aşağıdakı əmrlə kiçik bir yük yaradaq:


İndi bizdə daha gözəl qrafiklər və onlara əlavə olaraq, monitorinq üçün Prometheus və ölçüləri vizuallaşdırmaq üçün Grafana gözəl alətləri var ki, bu da bizə performans, sağlamlıq vəziyyəti, zamanla xidmətlərin təkmilləşdirilməsi/deqradasiyası haqqında məlumat əldə etməyə imkan verəcək.

Nəhayət, xidmətlərdə sorğu izləməsinə baxaq.

Jaeger: izləmək

Bizə izləmə lazımdır, çünki nə qədər çox xidmətimiz varsa, uğursuzluğun səbəbini tapmaq bir o qədər çətindir. Aşağıdakı şəkildən sadə bir işə baxaq:

Istio ilə mikroservislərə qayıdın. 1-ci hissə
Təsadüfi uğursuz sorğunun tipik nümunəsi

İstək gəlir, düşür - səbəb nədir? İlk xidmət? Yoxsa ikinci? Hər ikisində də istisnalar var - gəlin hər birinin qeydlərinə baxaq. Necə tez-tez özünüzü bu işlə məşğul olmusunuz? Bizim işimiz tərtibatçılardan daha çox proqram detektivlərinə bənzəyir...

Bu, mikroservislərdə geniş yayılmış problemdir və paylanmış izləmə sistemləri ilə həll edilir, bu sistemlərdə xidmətlər bir-birinə unikal başlıq ötürür, bundan sonra bu məlumat axtarış sisteminə yönləndirilir və burada sorğu məlumatları ilə müqayisə edilir. Budur bir illüstrasiya:

Istio ilə mikroservislərə qayıdın. 1-ci hissə
TraceId sorğunu müəyyən etmək üçün istifadə olunur

Istio, satıcıdan müstəqil OpenTracing API çərçivəsini tətbiq edən Jaeger Tracer-dən istifadə edir. Jaeger istifadəçi interfeysinə aşağıdakı əmrlə daxil ola bilərsiniz:


İndi gedin http://localhost:16686/ və xidmət seçin sa-web-app. Xidmət açılan menyuda göstərilmirsə, səhifədə fəaliyyət göstərin/yaradın və interfeysi yeniləyin. Bundan sonra düyməni basın İzləri tapın, ən son izləri göstərəcək - hər hansı birini seçin - bütün izlər haqqında ətraflı məlumat görünəcək:

Istio ilə mikroservislərə qayıdın. 1-ci hissə

Bu iz göstərir:

  1. Müraciət daxil olur istio-ingressgateway (bu xidmətlərdən biri ilə ilk qarşılıqlı əlaqədir və sorğu üçün Trace ID yaradılır), bundan sonra şlüz sorğunu xidmətə göndərir sa-web-app.
  2. Xidmətdə sa-web-app sorğu Elçinin yan arabası tərəfindən götürülür, aralıqda "uşaq" yaradılır (buna görə də biz onu izlərdə görürük) və konteynerə yönləndirilir sa-web-app. (Span - Jaeger-də adı, əməliyyatın başlama vaxtı və müddəti olan məntiqi iş vahidi. Aralıqlar yuvalanıb sifariş verilə bilər. Aralıqların istiqamətlənmiş asiklik qrafiki iz əmələ gətirir. - təqribən. tərcümə.)
  3. Burada sorğu metodla işlənir sentiment analizi. Bu izlər artıq proqram tərəfindən yaradılıb, yəni. kod dəyişiklikləri tələb edirdilər.
  4. Bu andan etibarən POST sorğusu başlayır sa-məntiq. İz ID-si yönləndirilməlidir sa-web-app.
  5. ...

Qeyd: 4-cü addımda proqram Istio tərəfindən yaradılan başlıqları görməli və onları aşağıdakı şəkildə göstərildiyi kimi sonrakı sorğulara ötürməlidir:

Istio ilə mikroservislərə qayıdın. 1-ci hissə
(A) Başlığın yönləndirilməsi Istio-nun məsuliyyətidir; (B) Xidmətlər başlıqlara cavabdehdir

Istio işin böyük hissəsini ona görə edir daxil olan sorğular üçün başlıqlar yaradır, hər yan baxımda yeni aralıqlar yaradır və onları yönləndirir. Bununla belə, xidmətlər daxilində başlıqlarla işləmədən tam sorğu izləmə yolu itiriləcək.

Aşağıdakı başlıqlar nəzərə alınmalıdır (yönləndirilir):


Bu sadə bir işdir, lakin onun həyata keçirilməsini asanlaşdırmaq üçün artıq var çoxlu kitabxanalar - məsələn, sa-web-app xidmətində, sadəcə Jaeger və OpenTracing kitabxanalarını əlavə etsəniz, RestTemplate müştərisi bu başlıqları yönləndirir. onun asılılıqları.

Qeyd edək ki, Sentiment Analysis tətbiqi Flask, Spring və ASP.NET Core-da tətbiqləri nümayiş etdirir.

İndi qutudan (və ya demək olar ki, qutudan) nə əldə etdiyimiz aydındır, gəlin marşrutlaşdırmanın dəqiq tənzimlənməsinə, şəbəkə trafikinin idarə edilməsinə, təhlükəsizlik və daha çox şeyə baxaq!

Qeyd. tərcümə.: bu barədə Rinor Maloku tərəfindən Istio-dakı materialların növbəti hissəsində oxuyun, tərcümələri yaxın gələcəkdə bloqumuzda izləniləcək. UPDATE (14 mart): İkinci hissə artıq dərc olunub.

Tərcüməçidən PS

Bloqumuzda da oxuyun:

Mənbə: www.habr.com