E hoʻi i nā microservices me Istio. Mahele 1

E hoʻi i nā microservices me Istio. Mahele 1

Nānā. unuhi.: Ua lilo maoli nā mīkini lawelawe i kumuhana wela i ka ʻōnaehana o kēia lā no nā noi ma hope o ka hoʻolālā microservice. ʻOiai aia ʻo Istio ma ka radar o nā mea ʻenekini DevOps, he huahana hou loa ia, ʻoiai paʻakikī i nā ʻōlelo o nā hiʻohiʻona e hāʻawi ai, hiki ke lawe i kahi manawa nui e ʻike ai. ʻO ka ʻenekini Kelemania ʻo Rinor Maloku, ʻo ia ka mea nāna e mālama i ka ʻikepili kapua no nā mea kūʻai nui ma ka hui kelepona ʻo Orange Networks, ua kākau i kahi moʻolelo nani o nā mea e hiki ai iā ʻoe ke luʻu wikiwiki a hohonu i loko o Istio. Hoʻomaka ʻo ia i kāna moʻolelo me ka mea hiki iā Istio ke hana a pehea ʻoe e ʻike koke ai me kou mau maka ponoʻī.

Istio - Open Source-project, hoʻomohala ʻia me ka hui pū ʻana me nā hui mai Google, IBM a me Lyft. Hoʻoponopono ia i nā paʻakikī e kū mai ana i nā noi e pili ana i nā microservices, no ka laʻana, e like me:

  • hooponopono kaapuni: hoʻopau manawa, hoʻāʻo hou, hoʻokau kaulike;
  • Ka maluhia: hōʻoia hoʻohana hope a me ka mana;
  • ka nānā ʻana: ka ʻimi ʻana, ka nānā ʻana, ke kālai ʻana.

Hiki ke hoʻoholo ʻia ia mau mea a pau ma ka pae noi, akā naʻe ma hope o kāu mau lawelawe ʻaʻole e "micro". ʻO ka hoʻoikaika ʻana a pau e hoʻoponopono i kēia mau pilikia he mea ʻino ia o nā kumuwaiwai ʻoihana hiki ke hoʻohana pololei ʻia no ka waiwai ʻoihana. E noʻonoʻo i kekahi laʻana:

Luna Hoʻokele: Pehea ka lōʻihi o ka hoʻohui ʻana i kahi hiʻohiʻona manaʻo?
Mea hoʻomohala: ʻElua sprint.

MP: He aha?.. CRUD wale nō!
R: ʻO ka hana CRUD ka mea maʻalahi o ka hana, akā pono mākou e hōʻoia a ʻae i nā mea hoʻohana a me nā lawelawe. Ma muli o ka hilinaʻi ʻole o ka pūnaewele, pono ʻoe e hoʻokō i nā noi pinepine, a me ʻano hoʻoheheʻe kaapuni i nā mea kūʻai aku. Eia kekahi, no ka hōʻoia ʻana ʻaʻole i hāʻule ka ʻōnaehana holoʻokoʻa, hoʻopau manawa a ʻāpana nui (E nānā ma hope o ka ʻatikala no nā kikoʻī hou aku e pili ana i nā mamana i ʻōlelo ʻia.), a i mea e ʻike ai i nā pilikia, ka nānā ʻana, ka ʻimi ʻana, […]

MP: ʻAe, e hoʻokomo wale i kēia hiʻohiʻona i loko o ka lawelawe Product a laila.

Manaʻo wau ua maopopo ka manaʻo: nui ka nui o nā ʻanuʻu a me ka hoʻoikaika ʻana e hoʻohui i kahi lawelawe hoʻokahi. Ma kēia ʻatikala, e nānā mākou pehea e wehe ai ʻo Istio i nā paʻakikī āpau i ʻōlelo ʻia ma luna (ʻaʻole i manaʻo ʻia e ka loiloi ʻoihana) mai nā lawelawe.

E hoʻi i nā microservices me Istio. Mahele 1

i hoʻopuka: Manaʻo ka ʻatikala he ʻike hana ʻoe no Kubernetes. A i ʻole, paipai wau e heluhelu koʻu hoʻolauna iā Kubernetes a laila e hoʻomau i ka heluhelu ʻana i kēia mea.

Istio manaʻo

I loko o kahi honua me ka ʻole o Istio, hana kekahi lawelawe i nā noi pololei i kekahi, a inā ʻaʻole i hāʻule, pono ka lawelawe e lawelawe iā ia iho: hana i kahi hoʻāʻo hou, hāʻawi i kahi manawa, wehe i kahi kaapuni kaapuni, etc.

E hoʻi i nā microservices me Istio. Mahele 1
ʻO ka holo pūnaewele ma Kubernetes

ʻO Istio, ma ka ʻaoʻao ʻē aʻe, hāʻawi i kahi hoʻonā kūikawā i hoʻokaʻawale loa ʻia mai nā lawelawe a me nā hana ma ke keakea ʻana i ka pilina pūnaewele. A penei ka hana ana:

  • hoʻomanawanui hewa: ma muli o ke kūlana kūlana ma ka pane, maopopo iā ia inā hāʻule ka noi a hoʻouna hou.
  • ʻO nā Canary Rollouts: hoʻihoʻi hou i kahi pākēneka paʻa o nā noi i ka mana hou o ka lawelawe.
  • Nānā a me nā ana: pehea ka lōʻihi o ka pane ʻana o ka lawelawe?
  • Ka ʻimi ʻana a me ka nānā ʻana: Hoʻohui i nā poʻomanaʻo kūikawā i kēlā me kēia noi a hoʻopaʻa iā lākou ma ka pūʻulu.
  • Ka maluhia: E kiʻi i kahi hōʻailona JWT, hōʻoia a ʻae i nā mea hoʻohana.

He liʻiliʻi wale nō kēia o nā mea hiki (he liʻiliʻi wale nō!) e hoʻowalewale iā ʻoe. I kēia manawa, e luʻu kākou i nā kikoʻī ʻenehana!

Hoʻolālā

Hoʻopili ʻo Istio i nā kaʻa pūnaewele āpau a hoʻopili i kahi hoʻonohonoho o nā lula iā ia, e hoʻokomo i kahi proxy akamai ma ke ʻano o kahi pahu sidecar i loko o kēlā me kēia pod. ʻO nā proxies e hoʻā i nā mea hiki ke hana i kahi a Mokulele ʻIkepili, a hiki ke hoʻololi ʻia me ka dynamically Mokulele Mana.

Mokulele ʻIkepili

ʻO nā proxies i hoʻokomo ʻia i loko o nā pods e ʻae iā Istio e hoʻokō maʻalahi i nā koi a mākou e pono ai. No ka laʻana, e nānā kākou i nā hana hoʻāʻo hou a me nā hana hoʻopau kaapuni.

E hoʻi i nā microservices me Istio. Mahele 1
Pehea e hoʻokō ʻia ai ka hoʻāʻo hou a me ka uhaki kaapuni ma Envoy

E hōʻuluʻulu i:

  1. ʻelele (ke kamaʻilio nei mākou e pili ana i kahi mea koho i loaʻa i loko o kahi pahu sidecar, i hāʻawi ʻia a pehea huahana kaawale - kokoke. unuhi.) hoʻouna i kahi noi i ka manawa mua o ka lawelawe B a hāʻule.
  2. Ke hoʻāʻo hou nei ʻo Envoy Sidecar (hoʻāʻo hou). (1)
  3. Hoʻihoʻi ʻia ka noi hāʻule i ka mea koho i kapa ʻia.
  4. Wehe kēia i ka Circuit Breaker a kāhea aku i ka lawelawe aʻe no nā noi ma hope. (2)

'O ia ho'i, 'a'ole pono 'oe e ho'ohana i ka hale waihona puke e hiki mai ana, 'a'ole pono 'oe e ho'okō pono i ka Circuit Breaking and Service Discovery ma ka X, Y a i 'ole Z. pahu ma Istio a ʻaʻole pono no hoʻololi code.

Nui! I kēia manawa makemake paha ʻoe e hele i ka huakaʻi me Istio, akā aia nō kekahi mau kānalua, nīnau hāmama. Inā he hopena honua kēia no nā manawa āpau o ke ola, a laila he kānalua kūpono ʻoe: ma hope o nā mea a pau, ʻaʻole kūpono kēlā mau hopena āpau no kekahi hihia.

A i ka hopena, nīnau ʻoe: "He mea maʻamau?"

I kēia manawa ua mākaukau ʻoe no ka huakaʻi moana - a e kamaʻāina kākou me Control Plane.

Mokulele Mana

Aia i ʻekolu mau ʻāpana: Pilot, Hoʻohui и Susana,, ka mea e hoʻonohonoho pū i nā ʻelele e ala i nā kaʻa, hoʻokō i nā kulekele, a hōʻiliʻili i ka ʻikepili telemetry. Schematically, ua like nā mea a pau penei:

E hoʻi i nā microservices me Istio. Mahele 1
Ka launa pū ʻana o ka Plane Control me ka Plane Data

Hoʻonohonoho ʻia nā ʻelele (ʻo ia hoʻi Kubernetes CRD (Custom Resource Definition) i wehewehe ʻia e Istio a i hoʻolālā ʻia no kēia kumu. ʻO ke ʻano o kēia iā ʻoe he kumu waiwai ʻē aʻe lākou ma Kubernetes me kahi syntax maʻamau. Ke hana ʻia, e kiʻi ʻia kēia kumuwaiwai e ka mokulele hoʻokele a hoʻohana ʻia i nā ʻelele.

Ka pilina o nā lawelawe iā Istio

Ua wehewehe mākou i ka pilina o Istio i nā lawelawe, akā ʻaʻole i ke ala ʻē aʻe: pehea e pili ai nā lawelawe iā Istio?

ʻO kaʻoiaʻiʻo, ʻike nā lawelawe e pili ana i ka hele ʻana o Istio a me nā iʻa e pili ana i ka wai, ke nīnau lākou iā lākou iho: "He aha ka wai?".

E hoʻi i nā microservices me Istio. Mahele 1
Kii Victoria Dimitrakopoulos: Pehea kou makemake i ka wai? - He aha ka wai?

No laila, hiki iā ʻoe ke lawe i kahi puʻupuʻu hana a ma hope o ka waiho ʻana i nā ʻāpana Istio, e hoʻomau nā lawelawe i loko, a ma hope o ka wehe ʻana i kēia mau mea, e maikaʻi hou nā mea a pau. Ua maopopo ma kēia hihia e nalowale ana ʻoe i nā manawa i hāʻawi ʻia e Istio.

Ua lawa ka manaʻo - e hoʻokō kākou i kēia ʻike!

Istio ma ka hana

Pono ʻo Istio i kahi hui Kubernetes me ka liʻiliʻi o 4 vCPU a me 8 GB o RAM i loaʻa. No ka hoʻokiʻekiʻe koke ʻana i ka pūʻulu a hahai i nā ʻōlelo aʻoaʻo mai ka ʻatikala, paipai wau e hoʻohana i ka Google Cloud Platform, e hāʻawi ana i nā mea hoʻohana hou manuahi $300.

Ma hope o ka hoʻokumu ʻana i ka pūʻulu a me ka hoʻonohonoho ʻana i ke komo ʻana iā Kubernetes ma o ka console utility, hiki iā ʻoe ke hoʻokomo iā Istio ma o ka luna Helm package manager.

Hoʻokomo ʻia ka Helm

E hoʻouka i ka mea kūʻai Helm ma kāu kamepiula e like me ka wehewehe ʻana ma palapala kūhelu. E hoʻohana mākou iā ia e hana i nā template no ka hoʻokomo ʻana iā Istio ma ka ʻāpana aʻe.

Hoʻokomo

Hoʻoiho i nā kumuwaiwai Istio mai hoʻokuʻu hou (Ua hoʻololi ʻia ka loulou o ka mea kākau kumu i ka mana 1.0.5 i ka loulou o kēia manawa, ʻo ia hoʻi. 1.0.6 - ma kahi o ka unuhi), wehe i nā mea i loko o kahi papa kuhikuhi hoʻokahi, aʻu e kuhikuhi ai [istio-resources].

No ka ʻike maʻalahi o nā kumuwaiwai Istio, e hana i kahi inoa inoa ma ka pūʻulu K8s istio-system:

$ kubectl create namespace istio-system

E hoʻopau i ka hoʻokomo ʻana ma ka hoʻokele ʻana i ka papa kuhikuhi [istio-resources] a e holo ana i ke kauoha:

$ 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

Na kēia kauoha e hoʻopuka i nā mea nui o Istio i kahi faila istio.yaml. Ua hoʻololi mākou i ka maʻamau maʻamau no mākou iho ma ke kuhikuhi ʻana i kēia mau ʻāpana:

  • global.mtls.enabled hoʻokomo ʻia i loko false (ʻo ia hoʻi. ua pio ka hōʻoia mTLS - ma kahi o ka unuhi ʻana)e hoʻomaʻamaʻa i kā mākou kaʻina hana pili;
  • tracing.enabled hiki i ka huli noi me Jaeger;
  • kiali.enabled hoʻokomo iā Kiali i loko o kahi pūʻulu e ʻike i nā lawelawe a me nā kaʻa;
  • grafana.enabled hoʻokomo iā Grafana e nānā i nā ana i hōʻiliʻili ʻia.

E noi i nā kumuwaiwai i hana ʻia me ke kauoha:

$ kubectl apply -f istio.yaml

Ua hoʻopau ʻia ka hoʻokomo ʻana o Istio i ka hui! E kali a hiki i nā pods a pau i ka namespace istio-system e hiki Running ai ole ia, Completedma ka holo ʻana i ke kauoha ma lalo nei:

$ kubectl get pods -n istio-system

Ua mākaukau mākou e hoʻomau i ka ʻāpana aʻe, kahi e hoʻāla ai a holo i ka noi.

Hoʻolālā Hoʻolālā Manaʻo

E hoʻohana kākou i ka hiʻohiʻona o ka noiʻi Sentiment Analysis microservice i hoʻohana ʻia ma ka mea i ʻōlelo ʻia ʻatikala hoʻolauna iā Kubernetes. He paʻakikī ia e hōʻike i nā hiki o Istio i ka hoʻomaʻamaʻa.

Aia ka palapala noi i ʻehā microservices:

  1. hana SA-Frontend, e lawelawe ana i ka palapala noi mua ma Reactjs;
  2. hana SA WebApp, e lawelawe ana i na ninau Manao Manao;
  3. hana SA Logice hana ana iaia iho manaʻo kālailai;
  4. hana Manaʻo SA, ka mea i loaʻa i nā manaʻo mai nā mea hoʻohana i ka pololei o ka ʻimi noiʻi i hana ʻia.

E hoʻi i nā microservices me Istio. Mahele 1

Ma kēia kiʻikuhi, ma waho aʻe o nā lawelawe, ʻike pū mākou i ka Ingress Controller, ma Kubernetes e ala i nā noi komo i nā lawelawe pili. Hoʻohana ʻo Istio i kahi manaʻo like ma ke ʻano o ka Ingress Gateway, nā kikoʻī e pili ana.

Ke hoʻomaka nei i kahi noi me kahi koho mai Istio

No nā hana hou aʻe i ʻōlelo ʻia ma ka ʻatikala, clone i kāu waihona istio-mastery. Loaʻa iā ia ka noi a me nā hōʻike no Kubernetes a me Istio.

Hoʻokomo ʻana i nā kaʻa ʻaoʻao

Hiki ke hookomo lolika ai ole ia, ma ka lima. No ka hoʻokomo 'akomi i nā ipu sidecar, pono ʻoe e hoʻonohonoho i ka lepili i ka namespace istio-injection=enabled, i hana ʻia e kēia kauoha:

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

I kēia manawa, e kau ʻia kēlā me kēia pod i ka inoa inoa paʻamau (default) e loaʻa i kāna pahu kaʻa ʻaoʻao. No ka hōʻoia ʻana i kēia, e kau i kahi noi hoʻāʻo ma ka hele ʻana i ka papa kuhikuhi kumu o ka waihona [istio-mastery] a holo i kēia kauoha:

$ 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

Ma hope o ka lawe ʻana i nā lawelawe, e nānā i ʻelua pahu i kēlā me kēia pahu (me ka lawelawe ponoʻī a me kāna kaʻa ʻaoʻao) ma ka holo ʻana i ke kauoha. kubectl get pods a me ka hōʻoia ʻana ma lalo o ke kolamu READY waiwai i hoakakaia 2/2, e hōʻailona ana e holo ana nā pahu ʻelua:

$ 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

ʻIke ʻia ke ʻano penei:

E hoʻi i nā microservices me Istio. Mahele 1
ʻElele proxy ma kekahi o nā pods

I kēia manawa ke holo nei ka noi, pono mākou e ʻae i nā kaʻa komo e komo i ka noi.

ʻO ka puka komo ʻana

ʻO ka hoʻomaʻamaʻa maikaʻi loa e hoʻokō i kēia (e ʻae i ke kaʻa i loko o ka pūʻulu). ʻO ka puka komo ʻana ma Istio, aia ma ka "lihi" o ka hui a hiki iā ʻoe ke hoʻohana i nā hiʻohiʻona Istio e like me ke ala ʻana, ke kau ʻana i ka ukana, ka palekana, a me ka nānā ʻana i nā kaʻa komo.

Ua hoʻokomo ʻia ka ʻāpana Ingress Gateway a me ka lawelawe e hoʻopuka ana i waho ma ka hui i ka wā o ka hoʻokomo ʻana iā Istio. No ka ʻike ʻana i ka helu IP waho o kahi lawelawe, holo:

$ 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

E hoʻomau mākou i ke komo ʻana i ka noi me ka hoʻohana ʻana i kēia IP (e kuhikuhi wau iā ia he EXTERNAL-IP), no laila no ka maʻalahi, e kākau mākou i ka waiwai i kahi loli:

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

Inā ho'āʻo ʻoe e komo i kēia IP ma o ka polokalamu kele pūnaewele i kēia manawa, e loaʻa iā ʻoe kahi hewa Service Unavailable, no ka mea ma ka paʻamau, ua ālai ʻo Istio i nā kaʻa komo maia hiki i ka wehewehe ana o Gateway.

Punawai puka puka

ʻO Gateway kahi CRD (Custom Resource Definition) ma Kubernetes, i wehewehe ʻia ma hope o ka hoʻokomo ʻana iā Istio i loko o kahi pūʻulu a hiki i ka hiki ke kuhikuhi i nā awa, protocol, a me nā mea hoʻokipa a mākou e makemake ai e ʻae i nā kaʻa komo.

I kā mākou hihia, makemake mākou e ʻae i ka hele ʻana o HTTP ma ke awa 80 no nā pūʻali āpau. Hoʻomaopopo ʻia ka pilikia e ka wehewehe ʻana (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:
- "*"

ʻAʻole pono kēia hoʻonohonoho i ka wehewehe ʻana koe wale nō ka mea koho istio: ingressgateway. Me kēia mea koho, hiki iā mākou ke kuhikuhi i ka Ingress Gateway e hoʻopili ai i ka hoʻonohonoho. I kā mākou hihia, ʻo ia ka mea hoʻokele Ingress Gateway, i hoʻokomo ʻia e ka paʻamau ma Istio.

Hoʻohana ʻia ka hoʻonohonoho ʻana ma ke kāhea ʻana i kēia kauoha:

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

Hiki i ka ʻīpuka ke komo i ke awa 80 akā ʻaʻohe ʻike i kahi e hele ai i nā noi. No kēia e pono ai ʻoe Nā lawelawe uila.

Punawai lawelawe Virtual

Hōʻike ka VirtualService i ka Ingress Gateway pehea e ala ai i nā noi i ʻae ʻia i loko o ka pūpū.

Pono e hoʻouna ʻia nā noi i kā mākou noi e hele mai ana ma ka ʻīpuka http i ka sa-frontend, sa-web-app a me nā lawelawe palekana:

E hoʻi i nā microservices me Istio. Mahele 1
Nā ala e hoʻonohonoho ʻia me VirtualServices

E noʻonoʻo i nā noi e hoʻouna ʻia iā SA-Frontend:

  • Pili pololei ma ke ala / pono e hoʻouna ʻia i SA-Frontend e kiʻi iā index.html;
  • Nā ala me kahi prefix /static/* Pono e hoʻouna ʻia i SA-Frontend e kiʻi i nā faila static i hoʻohana ʻia ma ka ʻaoʻao mua, e like me CSS a me JavaScript;
  • Nā ala e pili ana i ka ʻōlelo maʻamau '^.*.(ico|png|jpg)$', pono e hoouna ia i SA-Frontend, no ka mea ʻO kēia nā kiʻi i hōʻike ʻia ma ka ʻaoʻao.

Hoʻokō ʻia ka hoʻokō ʻana ma o ka hoʻonohonoho ʻana (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

Nā mea nui:

  1. ʻO kēia VirtualService e pili ana i nā noi e hele mai ana http-puka;
  2. В destination wehewehe i ka lawelawe i hoʻouna ʻia ai nā noi.

i hoʻopuka: Mālama ʻia ka hoʻonohonoho ma luna i kahi faila sa-virtualservice-external.yaml, aia pū kekahi i nā hoʻonohonoho no ke ala ʻana i SA-WebApp a me SA-Feedback, akā ua pōkole ʻia ma ʻaneʻi ma ka ʻatikala no ka pōkole.

E noi VirtualService ma ke kelepona ʻana:


i hoʻopuka: Ke hoʻohana mākou i nā kumuwaiwai Istio, hoʻopau ka Kubernetes API Server i kahi hanana i loaʻa i ka Istio Control Plane, a ma hope o ia, ua hoʻopili ʻia ka hoʻonohonoho hou i kēlā me kēia pod's Envoy proxy. A ʻo ka mea hoʻokele Ingress Gateway he ʻelele ʻē aʻe i hoʻonohonoho ʻia ma ka Plane Control. Ua like kēia mau mea a pau ma ke kiʻikuhi:

E hoʻi i nā microservices me Istio. Mahele 1
ʻO ka hoʻonohonoho Istio-IngressGateway no ka noi ʻana

Loaʻa ʻia ka Manaʻo Manaʻo ma http://{EXTERNAL-IP}/. Mai hopohopo inā loaʻa iā ʻoe ke kūlana ʻAʻole i loaʻa: I kekahi manawa, lōʻihi ka lōʻihi o ka hoʻonohonoho ʻana i ka hopena a no ka hoʻonui ʻana i nā cache Envoy.

Ma mua o ka hoʻomaka ʻana, e pāʻani liʻiliʻi me ka palapala noi e hoʻohua i nā kaʻa (pono kona hele ana no ka akaka i na hana ma hope - ma kahi o transl.).

Kiali: observability

No ke kiʻi ʻana i ke kikowaena admin Kiali, e holo i kēia kauoha:


…a wehe http://localhost:20001/ma ke komo ʻana ma ke ʻano he admin/admin. Maanei ʻoe e ʻike ai i nā hiʻohiʻona pono he nui, no ka laʻana, e nānā i ka hoʻonohonoho ʻana o nā ʻāpana Istio, e nānā i nā lawelawe mai ka ʻike i hōʻiliʻili ʻia e ka intercepting i nā noi pūnaewele, e loaʻa i nā pane i nā nīnau "ʻO wai ke hoʻopili nei iā wai?", "ʻO wai ka mana o ka lawelawe e ʻike nei. hemahema?” a laila. Ma keʻano laulā, e ʻimi i nā mea hiki iā Kiali ma mua o ka neʻe ʻana i ka nānā ʻana i nā ana me Grafana.

E hoʻi i nā microservices me Istio. Mahele 1

ʻO Grafana: ʻike maka o nā ana

Hoʻopau nā metric i hōʻiliʻili ʻia ma Istio i Prometheus a ʻike ʻia me Grafana. No ke kiʻi ʻana i ke kikowaena admin Grafana, e holo i ke kauoha ma lalo, a laila wehe http://localhost:3000/:


Ma ke kaomi ʻana i ka papa kuhikuhi Home hema hema a koho Istio Service Dashboard ma ke kihi hema hema, e hoʻomaka me ka lawelawe sa-pūnaewele-appe nānā i nā ana i hōʻiliʻili ʻia:

E hoʻi i nā microservices me Istio. Mahele 1

Eia ke kali nei mākou i kahi hana ʻole a ʻoluʻolu loa - ʻaʻole ʻae ka hoʻokele i kēia. E hana kākou i kahi ukana liʻiliʻi me kēia kauoha:


I kēia manawa, loaʻa iā mākou nā kiʻi nani, a ma kahi o lākou, nā mea hana maikaʻi ʻo Prometheus no ka nānā ʻana a me Grafana no ka nānā ʻana i nā metric, e hiki ai iā mākou ke aʻo e pili ana i ka hana, ke kūlana olakino, nā hoʻomaikaʻi / degradation i nā lawelawe i ka manawa.

ʻO ka hope, e nānā kākou i ka huli ʻana i ka noi ma nā lawelawe.

Jaeger: ka ʻimi ʻana

Pono mākou e ʻimi, no ka mea ʻoi aku ka nui o nā lawelawe i loaʻa iā mākou, ʻoi aku ka paʻakikī o ke kiʻi ʻana i ke kumu o ka hāʻule. E nānā kākou i kahi hihia maʻalahi mai ke kiʻi ma lalo nei.

E hoʻi i nā microservices me Istio. Mahele 1
Laʻana maʻamau o kahi noi i hāʻule ʻole

Hele mai ke noi, hāʻule - he aha ke kumu? ʻO ka lawelawe mua? A i ʻole ka lua? Aia nā ʻokoʻa ma nā mea ʻelua - e nānā kākou i nā moʻolelo o kēlā me kēia. Ehia mau manawa āu i hopu ai iā ʻoe iho e hana ana i kēia? ʻO kā mākou hana e like me nā polokalamu detectives ma mua o nā mea hoʻomohala…

He pilikia nui kēia i nā microservices a ua hoʻoholo ʻia e nā ʻōnaehana tracing i hoʻokaʻawale ʻia, kahi e hāʻawi ai nā lawelawe i kahi poʻomanaʻo kūʻokoʻa i kekahi i kekahi, a laila hoʻihoʻi ʻia kēia ʻike i ka ʻōnaehana tracing, kahi e hoʻohālikelike ʻia me ka ʻikepili noi. Eia kekahi hiʻohiʻona:

E hoʻi i nā microservices me Istio. Mahele 1
Hoʻohana ʻia ʻo TraceId e ʻike i ka noi

Hoʻohana ʻo Istio iā Jaeger Tracer, ka mea e hoʻokō i kahi mea kūʻai kūʻokoʻa OpenTracing API framework. Hiki iā ʻoe ke komo i ka mea hoʻohana Jaeger me kēia kauoha:


E hele i kēia manawa http://localhost:16686/ a koho i kahi lawelawe sa-pūnaewele-app. Inā ʻaʻole i hōʻike ʻia ka lawelawe ma ka papa hāʻule iho, hōʻike/hana i ka hana ma ka ʻaoʻao a hoʻonui i ka interface. Ma hope o kēlā kaomi i ke pihi E huli i nā meheu, e hōʻike ana i nā meheu hou loa - koho i kekahi - e ʻike ʻia ka ʻike kikoʻī o nā meheu a pau:

E hoʻi i nā microservices me Istio. Mahele 1

Hōʻike kēia meheu:

  1. Komo mai ka noi istio-ingressgateway (ʻo kēia ka pilina mua me kekahi o nā lawelawe, a ua hoʻokumu ʻia kahi Trace ID no ke noi), a laila hoʻouna ka ʻīpuka i ka noi i ka lawelawe. sa-pūnaewele-app.
  2. Ma ka lawelawe sa-pūnaewele-app lawe ʻia ka noi e ka Envoy sidecar, ua hana ʻia kahi "keiki" i loko o ka span (ʻo ia ke kumu e ʻike ai mākou ma nā ʻāpana) a hoʻihoʻi ʻia i ka ipu. sa-pūnaewele-app. (kikoo - kahi hui pono o ka hana ma Jaeger, nona ka inoa, ka manawa hoʻomaka o ka hana a me kona lōʻihi. Hiki ke hoʻopaʻa ʻia a kauoha ʻia nā kiko. Hoʻokumu ʻia kahi kiʻi acyclic kuhikuhi o nā span. - kokoke. unuhi.)
  3. Eia ka noi e kaʻina hana manaʻoAnalysis. Ua hana ʻia kēia mau meheu e ka noi, ʻo ia hoʻi. makemake lākou i nā hoʻololi code.
  4. Mai kēia manawa, hoʻomaka ʻia kahi noi POST sa-logic. Pono e hoʻouna ʻia ka Trace ID mai sa-pūnaewele-app.
  5. ...

i hoʻopuka: Ma ka ʻanuʻu 4, pono e ʻike ka palapala noi i nā poʻomanaʻo i hana ʻia e Istio a hāʻawi iā lākou i nā noi ma hope, e like me ka hōʻike ʻana ma ke kiʻi ma lalo nei:

E hoʻi i nā microservices me Istio. Mahele 1
(A) ʻO ka hoʻouna ʻana i ke poʻo ke kuleana o Istio; (B) Na nā lawelawe ke kuleana no nā poʻomanaʻo

Hana ʻo Istio i ka nui o ka hana no ka mea hoʻopuka i nā poʻomanaʻo no nā noi e hiki mai ana, hana i nā kikoʻī hou i kēlā me kēia mālama ʻaoʻao a hoʻouna iā lākou. Eia nō naʻe, me ka hana ʻole ʻana me nā poʻomanaʻo i loko o nā lawelawe, e nalowale ke ala noi noi piha.

Pono e noʻonoʻo ʻia nā poʻomanaʻo (hoʻouna ʻia):


He hana maʻalahi kēia, akā no ka maʻalahi o kāna hoʻokō, aia nā hale waihona puke - no ka laʻana, ma ka lawelawe sa-web-app, hoʻouna ka mea kūʻai RestTemplate i kēia mau poʻomanaʻo inā ʻoe e hoʻohui i nā hale waihona puke ʻo Jaeger a me OpenTracing i kona mau hilinaʻi.

E hoʻomaopopo i ka hōʻike ʻana o ka noi Sentiment Analysis i nā hoʻokō ma Flask, Spring, a me ASP.NET Core.

I kēia manawa ua maopopo ka mea a mākou e loaʻa ai i waho o ka pahu (a i ʻole kokoke i waho o ka pahu), e nānā kākou i ka hoʻoponopono ʻana i ke ala ala, ka hoʻokele ʻana i ka ʻoihana pūnaewele, palekana, a me nā mea hou aʻe!

Nānā. unuhi.: E heluhelu e pili ana ia mea ma ka ʻaoʻao aʻe o nā mea ma Istio mai Rinor Maloku, a e hahai ʻia ana nā unuhi ma kā mākou blog i ka wā e hiki mai ana. Kiʻi hou (Maraki 14th): Mahele ʻāpana ua paʻi ʻia.

PS mai ka unuhi

E heluhelu pū ma kā mākou blog:

Source: www.habr.com