Torna à i microservizi cù Istio. Parte 1

Torna à i microservizi cù Istio. Parte 1

Nota. transl.: E rete di serviziu sò definitivamente diventate un tema caldu in l'infrastruttura d'oghje per l'applicazioni chì seguitanu l'architettura di microserviziu. Mentre Istio pò esse nantu à u radar di parechji ingegneri DevOps, hè un pruduttu abbastanza novu chì, mentre cumplessu in termini di funziunalità chì furnisce, pò piglià una quantità significativa di tempu per cunnosce. L'ingegneru tedescu Rinor Maloku, chì hè incaricatu di l'informatica in nuvola per i grandi clienti in a cumpagnia di telecomunicazioni Orange Networks, hà scrittu una maravigliosa serie di materiali chì permettenu di tuffà rapidamente è profondamente in Istio. Cumincia a so storia cù ciò chì Istio pò fà è cumu pudete vede rapidamente cù i vostri ochji.

Istio - Prughjettu Open Source, sviluppatu in cullaburazione cù squadre di Google, IBM è Lyft. Risolve e cumplessità chì sorgenu in l'applicazioni basate nantu à i microservizi, per esempiu, cum'è:

  • gestione di u trafficu: timeouts, tentativi, bilanciamentu di carica;
  • Seguretat: l'autentificazione è l'autorizazione di l'utilizatori finali;
  • osservabilità: traccia, surviglianza, logging.

Tutti ponu esse risolti à u livellu di l'applicazione, ma dopu chì i vostri servizii ùn saranu più "micro". Tuttu u sforzu extra per risolve questi prublemi hè un perdu di risorse di l'impresa chì puderia esse usatu direttamente per u valore di l'affari. Cunsiderate un esempiu:

Project Manager: Quantu tempu ci vole à aghjunghje a funzione di feedback?
Sviluppatore: Dui sprints.

MP : Chì ?.. Hè solu CRUD !
R: Fà CRUD hè a parte faciule di u compitu, ma avemu sempre bisognu di autentificà è autorizà l'utilizatori è i servizii. Siccomu a reta ùn hè micca affidabile, avete bisognu di implementà richieste ripetute, è ancu mudellu di circuit breaker in i clienti. Inoltre, per assicurà chì tuttu u sistema ùn hà micca crash, timeouts è paratie (Vede più tardi in l'articulu per più dettagli nantu à i dui mudelli citati)., è per detectà prublemi, monitoraghju, traccia, [...]

MP: Oh, mettimu sta funzione in u serviziu di u produttu allora.

Pensu chì l'idea hè chjara: a quantità di passi è sforzu necessariu per aghjunghje un serviziu unicu hè enormu. In questu articulu, daremu un ochju à cumu Istio elimina tutte e cumplessità citata sopra (micca mirata da a logica cummerciale) da i servizii.

Torna à i microservizi cù Istio. Parte 1

Vita: L'articulu assume chì avete una cunniscenza di travagliu di Kubernetes. Altrimenti, vi cunsigliu di leghje a mo introduzione à Kubernetes è solu dopu cuntinuà à leghje stu materiale.

Istio idea

In un mondu senza Istio, un serviziu face dumande dirette à l'altru, è in casu di fallimentu, u serviziu deve trattà stessu: fà un novu tentativu, furnisce un timeout, apre un circuit breaker, etc.

Torna à i microservizi cù Istio. Parte 1
U trafficu di a rete in Kubernetes

Istio, invece, offre una soluzione specializata chì hè completamente separata da i servizii è e funzioni interferendu cù l'interazzione di a rete. È cusì mette in opera:

  • tolleranza à i difetti: basatu annantu à u codice di statutu in a risposta, capisce se a dumanda falluta è a rinvia.
  • Rollouts canarini: redirige solu un percentinu fissu di richieste à a nova versione di u serviziu.
  • Monitoraghju è Metriche: quantu tempu hà pigliatu u serviziu per risponde ?
  • Tracciabilità è osservabilità: Aghjunghje intestazioni speciali à ogni dumanda è li traccia in u cluster.
  • Seguretat: Recupera un token JWT, autentifica è autorizeghja l'utilizatori.

Quessi sò solu uni pochi di e pussibilità (veramente solu uni pochi!) Per intrigà. Avà andemu in i dettagli tecnichi !

Architettura

Istio intercepta tuttu u trafficu di a rete è applicà un inseme di regule, inserisce un proxy intelligente in forma di container sidecar in ogni pod. Proxies chì attivanu tutte e pussibulità formanu a Pianu di dati, è ponu esse aghjustate dinamicamente cun Pianu di cuntrollu.

Pianu di dati

I proxy chì sò inseriti in i pods permettenu à Istio di ottene facilmente i bisogni chì avemu bisognu. Per esempiu, cuntrollemu i tentativi è e funzioni di circuit breaker.

Torna à i microservizi cù Istio. Parte 1
Cumu i tentativi è i circuit breaking sò implementati in Envoy

In riassuntu:

  1. imbasciata (Parlemu di un proxy situatu in un containeru sidecar, chì hè distribuitu è ​​cumu pruduttu separatu - ca. trad.) manda una dumanda à a prima istanza di serviziu B è falla.
  2. Envoy Sidecar prova di novu (riprova). (1)
  3. A dumanda falluta hè tornata à u proxy chì l'hà chjamatu.
  4. Questu apre u Circuit Breaker è chjama u prossimu serviziu per e dumande sussegwenti. (2)

Questu significa chì ùn avete micca aduprà a prossima biblioteca di Retry, ùn avete micca bisognu di fà a vostra propria implementazione di Circuit Breaking è Service Discovery in a lingua di prugrammazione X, Y o Z. Tuttu questu è più hè dispunibule fora di u box in Istio è ùn hà micca bisognu no cambiamenti di codice.

Perfettu! Avà pudete vulete andà in un viaghju cù Istio, ma ci sò sempre qualchì dubbiu, dumande aperte. S'ellu hè una suluzione universale per tutti l'occasioni in a vita, allora avete un suspettu legittimu: dopu à tuttu, tutti questi suluzioni sò in fatti micca adattati per ogni casu.

È infine dumandate: "Hè persunalizabile?"

Avà site prontu per un viaghju in mare - è cunniscemu cù Control Plane.

Pianu di cuntrollu

Hè custituitu di trè cumpunenti: Pilotu, Mixer и Citadella, chì inseme cunfiguranu Envoys per indirizzà u trafficu, applicà e pulitiche, è raccoglie dati di telemetria. Schematically, tuttu pare cusì:

Torna à i microservizi cù Istio. Parte 1
Interazione di u pianu di cuntrollu cù u pianu di dati

Envoys (vale à dì u pianu di dati) sò cunfigurati cù Kubernetes CRD (Définitions de ressources personnalisées) définies par Istio et conçues spécifiquement à cet effet. Ciò chì significa per voi hè chì sò solu una altra risorsa in Kubernetes cù una sintassi familiar. Una volta creatu, sta risorsa serà ripresa da u pianu di cuntrollu è appiicata à l'Envoys.

Relazione di servizii à Istio

Avemu discrittu a relazione di Istio cù i servizii, ma micca l'inversu: cumu si liate i servizii à Istio?

Per esse onestu, i servizii cunnoscenu a prisenza d'Istio è i pesci cunnoscenu l'acqua, quand'elli si dumandanu: "Chì hè l'acqua in ogni modu?".

Torna à i microservizi cù Istio. Parte 1
Illustrazione Victoria Dimitrakopoulos: Cumu ti piace l'acqua ? - Chì ghjè l'acqua in ogni modu ?

Cusì, pudete piglià un cluster di travagliu è dopu avè implementatu i cumpunenti Istio, i servizii in questu cuntinueghjanu à travaglià, è dopu avè sguassatu questi cumpunenti, tuttu sarà bè di novu. Hè chjaru chì in questu casu perderà l'oportunità furnite da Istio.

Basta teoria - mettemu in pratica sta cunniscenza !

Istio in pratica

Istio richiede un cluster Kubernetes cù almenu 4 vCPU è 8 GB di RAM dispunibili. Per elevà rapidamente u cluster è seguite l'istruzzioni da l'articulu, ricumandemu d'utilizà Google Cloud Platform, chì offre novi utilizatori gratis $ 300.

Dopu avè creatu u cluster è cunfigurà l'accessu à Kubernetes attraversu l'utilità di a cunsola, pudete installà Istio attraversu u gestore di pacchetti Helm.

Installazione di Helm

Installa u cliente Helm in u vostru urdinatore cum'è descrittu in documentazione ufficiale. Avemu aduprà per generà mudelli per installà Istio in a sezione dopu.

Installazione

Scaricate e risorse Istio da ultima liberazione (u ligame di l'autore uriginale à a versione 1.0.5 hè statu cambiatu à l'attuale, vale à dì 1.0.6 - circa trad.), estrae u cuntenutu à un solu repertoriu, chì mi riferiraghju cum'è [istio-resources].

Per una facilità d'identificazione di risorse Istio, crea un spaziu di nome in u cluster K8s istio-system:

$ kubectl create namespace istio-system

Cumplete a stallazione navigendu in u cartulare [istio-resources] è eseguisce u cumandimu:

$ 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

Stu cumandimu hà da pruduce i cumpunenti chjave di Istio à un schedariu istio.yaml. Avemu mudificatu u mudellu standard per noi stessi specificendu i seguenti parametri:

  • global.mtls.enabled installatu in false (vale à dì l'autenticazione mTLS hè disattivata - circa trad.)per simplificà u nostru prucessu di datazione;
  • tracing.enabled permette a traccia di richieste cù Jaeger;
  • kiali.enabled installà Kiali in un cluster per visualizà servizii è trafficu;
  • grafana.enabled installà Grafana per visualizà e metriche raccolte.

Applica e risorse generate cù u cumandimu:

$ kubectl apply -f istio.yaml

L'installazione di Istio in u cluster hè cumpleta! Aspetta finu à chì tutti i pods in u namespace istio-system puderà Running o Completedeseguendu u cumandimu quì sottu:

$ kubectl get pods -n istio-system

Avà simu pronti à cuntinuà à a prossima sezione, induve cresce è eseguisce l'applicazione.

L'architettura di l'applicazioni di l'analisi di sentimenti

Utilizemu l'esempiu di l'applicazione di microserviziu Sentiment Analysis aduprata in u digià citatu Articulu di introduzione à Kubernetes. Hè abbastanza cumplessu per vede e pussibilità di Istio in pratica.

L'applicazione hè custituita da quattru microservizi:

  1. sirvizziu SA-Frontend, chì serve l'applicazione front-end in Reactjs;
  2. sirvizziu SA WebApp, chì serve e dumande di l'analisi di sentimenti;
  3. sirvizziu SA Logicchì si compie sè stessu analisi di sentimentu;
  4. sirvizziu SA Feedback, chì riceve feedback da l'utilizatori nantu à a precisione di l'analisi realizatu.

Torna à i microservizi cù Istio. Parte 1

In questu diagramma, in più di i servizii, vedemu ancu u Ingress Controller, chì in Kubernetes indirizza e dumande entrate à i servizii currispondenti. Istio usa un cuncettu simili cum'è parte di l'Ingress Gateway, i dettagli di quale seguitanu.

Lanciazione di una applicazione cù un proxy da Istio

Per più operazioni citate in l'articulu, clone u vostru repository istio-maestria. Contene l'applicazione è manifesta per Kubernetes è Istio.

Inserzione di sidecars

L'inserzione pò esse fatta automaticamente o a manu. Per inserisce automaticamente cuntenituri sidecar, avete bisognu di stabilisce l'etichetta in u spaziu di nomi istio-injection=enabled, chì hè fattu da u cumandimu seguente:

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

Avà ogni pod chì serà implementatu in u spaziu di nomi predeterminatu (default) riceverà u so containeru sidecar. Per verificà questu, implementemu una applicazione di prova andendu à u repertoriu radicale di u repository [istio-mastery] è eseguisce u cumandimu seguente:

$ 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

Dopu avè implementatu i servizii, verificate chì i pods anu dui cuntenituri ognunu (cù u serviziu stessu è u so sidecar) eseguendu u cumandimu. kubectl get pods è assicurendu chì sottu à a colonna READY valore specificatu 2/2, simbulizendu chì i dui cuntenituri sò in esecuzione:

$ 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

Visualmente si vede cusì:

Torna à i microservizi cù Istio. Parte 1
Envoy proxy in unu di i pods

Avà chì l'applicazione hè in funzione, avemu bisognu di permette à u trafficu entrante per entre in l'applicazione.

Ingress Gateway

A megliu pratica per ottene questu (permette u trafficu in u cluster) hè via Ingress Gateway in Istio, chì si trova à u "bordu" di u cluster è vi permette di attivà e funzioni Istio cum'è routing, bilanciamentu di carica, sicurità è monitoraghju per u trafficu entrante.

U cumpunente di l'Ingress Gateway è u serviziu chì u trasmette fora sò stati installati nantu à u cluster durante a stallazione Istio. Per sapè l'indirizzu IP esternu di un serviziu, eseguite:

$ 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

Continueremu à accede à l'applicazione utilizendu questa IP (mi riferiraghju cum'è EXTERNAL-IP), cusì per comodità, scriveremu u valore à una variabile:

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

Sè vo pruvate à accede à sta IP attraversu un navigatore avà, vi darà un errore Service Unavailable, perchè per difettu Istio blucca tuttu u trafficu entrantefinu à chì un Gateway hè definitu.

Risorsa di a porta

Gateway hè un CRD (Custom Resource Definition) in Kubernetes, definitu dopu a stallazione di Istio in un cluster è chì permette a capacità di specificà porti, protokollu è ospiti per quale vulemu permette u trafficu entrante.

In u nostru casu, vulemu permette u trafficu HTTP in u portu 80 per tutti l'ospiti. U prublema hè realizatu da a seguente definizione (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:
- "*"

Sta cunfigurazione ùn hà micca bisognu di spiegazione eccettu per u selettore istio: ingressgateway. Cù stu selettore, pudemu specificà quale Ingress Gateway per applicà a cunfigurazione. In u nostru casu, questu hè u controller Ingress Gateway, chì hè stata installata per difettu in Istio.

A cunfigurazione hè applicata chjamendu u cumandimu seguitu:

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

U gateway permette avà l'accessu à u portu 80 ma ùn hà micca idea di induve indirizzà e dumande. Per questu avete bisognu Servizii Virtuali.

Risorsa di serviziu virtuale

U VirtualService dice à l'Ingress Gateway cumu indirizzà e dumande chì sò permesse in u cluster.

E dumande à a nostra applicazione chì venenu attraversu u http-gateway devenu esse mandate à i servizii sa-frontend, sa-web-app è sa-feedback:

Torna à i microservizi cù Istio. Parte 1
Percorsi per esse cunfigurati cù VirtualServices

Cunsiderate e dumande chì deve esse mandate à SA-Frontend:

  • Partita esatta in a strada / deve esse mandatu à SA-Frontend pè ottene index.html;
  • Percorsi cù un prefissu /static/* deve esse mandatu à SA-Frontend per uttene i schedari statici utilizati in u frontend, cum'è CSS è JavaScript;
  • Percorsi chì currispondenu à l'espressione regulare '^.*.(ico|png|jpg)$', deve esse mandatu à SA-Frontend, perchè Quessi sò i ritratti affissati nantu à a pagina.

L'implementazione hè ottenuta da a cunfigurazione seguente (sa-virtualservice-external.yaml):

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Punti impurtanti:

  1. Stu VirtualService si riferisce à e dumande chì passanu http-gateway;
  2. В destination definisce u serviziu à quale sò mandati e dumande.

Vita: A cunfigurazione sopra hè guardata in un schedariu sa-virtualservice-external.yaml, chì cuntene ancu i paràmetri per u routing à SA-WebApp è SA-Feedback, ma hè statu scurciatu quì in l'articulu per brevità.

Applica VirtualService chjamendu:


Vita: Quandu applicà e risorse Istio, u Kubernetes API Server spara un avvenimentu chì l'Istio Control Plane riceve, è dopu, a nova cunfigurazione hè appiicata à u proxy Envoy di ogni pod. È u controller Ingress Gateway pare esse un altru Envoy cunfiguratu in u Control Plane. Tuttu chistu s'assumiglia cusì in u diagramma:

Torna à i microservizi cù Istio. Parte 1
Configurazione Istio-IngressGateway per u routing di a dumanda

L'analisi di sentimenti hè avà dispunibule nantu http://{EXTERNAL-IP}/. Ùn vi preoccupate micca sè avete u status Not Found: qualchì volta ci vole un pocu di più per a cunfigurazione per fà effettu è per i cache di l'Envoy per aghjurnà.

Prima di prucede, ghjucà un pocu cù l'applicazione per generà trafficu (a so prisenza hè necessaria per a chiarità in l'azzioni sussegwenti - circa trad.).

Kiali : observabilità

Per ghjunghje à l'interfaccia di amministratore Kiali, eseguite u cumandimu seguente:


... è apre http://localhost:20001/accedendu cum'è admin/admin. Quì truverete parechje funziunalità utili, per esempiu, per verificà a cunfigurazione di i cumpunenti Istio, visualisate i servizii da l'infurmazioni raccolte da intercepting richieste di rete, uttene risposte à e dumande "Quale hè cuntattate cù quale?", "Quale versione di u serviziu hè sperimentatu. fallimenti?" eccetera. In generale, scopre e pussibilità di Kiali prima di passà à visualizà metriche cù Grafana.

Torna à i microservizi cù Istio. Parte 1

Grafana: visualizazione di metrica

I metrici cullati in Istio finiscinu in Prometheus è sò visualizati cù Grafana. Per ghjunghje à l'interfaccia di amministratore di Grafana, eseguite u cumandimu sottu, dopu apre http://localhost:3000/:


Cliccà nant'à u menu Home in cima à manca è selezziunate Istio Service Dashboard in l'angulu superiore manca, cuminciate cù u serviziu sa-web-appper vede e metriche raccolte:

Torna à i microservizi cù Istio. Parte 1

Quì aspittemu una prestazione viota è completamente noiosa - a gestione ùn appruvarà mai questu. Creemu una piccula carica cù u cumandimu seguente:


Avà avemu gràfiche assai più belli, è in più di elli, i meravigliosi strumenti Prometheus per u monitoraghju è Grafana per a visualizazione di e metriche, chì ci permetterà di sapè nantu à u rendiment, u statu di salute, i migliori / degradazione in i servizii cù u tempu.

Infine, fighjemu a dumanda di traccia in i servizii.

Jaeger: traccia

Avemu bisognu di traccia, perchè più servizii avemu, più difficiuli hè di ghjunghje à a causa di u fallimentu. Fighjemu un casu simplice da a stampa sottu:

Torna à i microservizi cù Istio. Parte 1
Esempiu tipicu di una dumanda falluta casuale

A dumanda vene, cade - chì hè u mutivu? Primu serviziu? O secondu? Ci sò eccezzioni in i dui - fighjemu i logs di ognunu. Quante volte vi avete pigliatu à fà questu? U nostru travagliu hè più cum'è detective di software chè sviluppatori ...

Questu hè un prublema diffusa in i microservizii è hè risolta da i sistemi di traccia distribuiti, in quale i servizii passanu un capu unicu à l'altru, dopu chì sta informazione hè rediretta à u sistema di traccia, induve hè paragunatu cù e dati di dumanda. Eccu un'illustrazione:

Torna à i microservizi cù Istio. Parte 1
TraceId hè utilizatu per identificà a dumanda

Istio usa Jaeger Tracer, chì implementa un framework API OpenTracing indipendente da u venditore. Pudete accede à l'interfaccia d'utilizatore Jaeger cù u cumandimu seguente:


Avà andate à http://localhost:16686/ è selezziunate un serviziu sa-web-app. Se u serviziu ùn hè micca mostratu in u menù dropdown, mostra / genera attività nantu à a pagina è aghjurnà l'interfaccia. Dopu chì cliccate nant'à u buttone Truvate tracce, chì mostrarà e tracce più recenti - selezziunate qualsiasi - infurmazione dettagliata nantu à tutte e tracce appariscerà:

Torna à i microservizi cù Istio. Parte 1

Questa traccia mostra:

  1. A dumanda entra istio-ingressgateway (questa hè a prima interazzione cù unu di i servizii, è un Trace ID hè generatu per a dumanda), dopu chì u gateway manda a dumanda à u serviziu. sa-web-app.
  2. In serviziu sa-web-app a dumanda hè pigliata da u sidecar Envoy, un "figliolu" hè creatu in u span (hè per quessa chì vedemu in tracce) è ridiretta à u cuntinuu sa-web-app. (Span - una unità logica di travagliu in Jaeger, avè un nome, l'ora di principiu di l'operazione è a so durata. Spans ponu esse nidificati è urdinati. Un graficu aciclicu direttu di spans forma una traccia. - ca. trad.)
  3. Quì a dumanda hè trattata da u metudu analisi sentimentale. Sti tracce sò digià generati da l'applicazione, i.e. avianu bisognu di cambiamenti di codice.
  4. Da questu mumentu, una dumanda POST hè iniziata in sa-logica. Trace ID deve esse trasmessu da sa-web-app.
  5. ...

Vita: In u passu 4, l'applicazione duveria vede l'intestazione generata da Istio è li passa à e richieste successive, cum'è mostra in l'imaghjini sottu:

Torna à i microservizi cù Istio. Parte 1
(A) L'invio di l'intestazione hè a responsabilità di Istio; (B) I servizii sò rispunsevuli di intestazioni

Istio faci a maiò parte di u travagliu perchè genera intestazioni per e richieste in entrata, crea novi spazii in ogni sidecare è li trasmette. Tuttavia, senza travaglià cù intestazioni in i servizii, u percorsu di traccia di a dumanda completa serà persu.

I seguenti intestazioni deve esse cunsideratu (inviatu):


Questu hè un compitu simplice, ma per simplificà a so implementazione, ci hè digià parechje biblioteche - per esempiu, in u serviziu sa-web-app, u cliente RestTemplate trasmette queste intestazioni se aghjunghje solu e librerie Jaeger è OpenTracing à e so dipendenze.

Nota chì l'applicazione Sentiment Analysis mostra implementazioni in Flask, Spring è ASP.NET Core.

Avà chì hè chjaru ciò chì avemu da esce da a scatula (o quasi fora di a scatula), fighjemu a fine-tuning routing, a gestione di u trafficu di a rete, a sicurità, è più !

Nota. transl.: leghje nantu à questu in a prossima parte di i materiali nantu à Istio da Rinor Maloku, e traduzioni di quale seguitanu nantu à u nostru blog in un futuru vicinu. UPDATE (14 marzu) : Seconda parte digià publicatu.

PS da u traduttore

Leghjite puru nant'à u nostru blog:

Source: www.habr.com